কিছু বিবৃতি (গুলি) লিখুন যা স্বাক্ষরবিহীন ষোল-বিট পূর্ণসংখ্যার মধ্যে তার সংখ্যা গণনা করবে।
উদাহরণস্বরূপ, যদি ইনপুট হয় 1337
, তবে ফলাফলটি 6
কারণ 1337
ষোল বিট বাইনারি সংখ্যাটি রয়েছে 0000010100111001
, এতে ছয়টি রয়েছে।
কিছু বিবৃতি (গুলি) লিখুন যা স্বাক্ষরবিহীন ষোল-বিট পূর্ণসংখ্যার মধ্যে তার সংখ্যা গণনা করবে।
উদাহরণস্বরূপ, যদি ইনপুট হয় 1337
, তবে ফলাফলটি 6
কারণ 1337
ষোল বিট বাইনারি সংখ্যাটি রয়েছে 0000010100111001
, এতে ছয়টি রয়েছে।
উত্তর:
F3 0F B8 C1
যা পূর্ণসংখ্যাকে নিয়ে যায় cx
এবং গণনাটিকে আউটপুট করে ax
এবং এর সমতুল্য:
popcnt ax, cx ; F3 0F B8 C1
এবং এখানে একটি 11 10 বাইট সমাধান রয়েছে যা পিওপিসিএনটি ব্যবহার করছে না:
31 C0 D1 E9 10 E0 85 C9 75 F8
যা এর সমান:
xor ax, ax ; 31 C0 Set ax to 0
shr cx, 1 ; D1 E9 Shift cx to the right by 1 (cx >> 1)
adc al, ah ; 10 E0 al += (ah = 0) + (cf = rightmost bit before shifting)
test cx, cx ; 85 C9 Check if cx == 0
jnz $-6 ; 75 F8 Jump up to shr cx, 1 if not
ax
এবং cx
সঙ্গে eax
এবং ecx
32 বিট থেকে এটি পরিবর্তন। বাইটকোড উভয়ের জন্য একই।
for(n=0;x;n++)x&=x-1;
আপনি বলেছিলেন "কিছু বিবৃতি লিখুন" ("একটি ফাংশন" নয়) তাই আমি ধরে নিয়েছি যে নম্বরটি সরবরাহ করা হয়েছে x
এবং 1 এর সংখ্যাটি ফিরে আসবে n
। যদি আমাকে আরম্ভ করতে না হয় তবে n
আমি 3 বাইট সংরক্ষণ করতে পারি।
এটি x&x-1
পরীক্ষার জন্য বিখ্যাত অভিব্যক্তির একটি অভিযোজন যা যদি 2 টির শক্তি হয় (এটি যদি সত্য হয় তবে তা সত্য নয়))
এখানে এটি প্রশ্ন থেকে ১৩37 the নম্বরে কর্মরত রয়েছে। নোট করুন যে 1 টি বিয়োগ করা কমপক্ষে উল্লেখযোগ্য 1 বিট এবং সমস্ত জিরো ডানদিকে ফ্লিপ করে।
0000010100111001 & 0000010100111000 = 0000010100111000
0000010100111000 & 0000010100110111 = 0000010100110000
0000010100110000 & 0000010100101111 = 0000010100100000
0000010100100000 & 0000010100011111 = 0000010100000000
0000010100000000 & 0000010011111111 = 0000010000000000
0000010000000000 & 0000001111111111 = 0000000000000000
সম্পাদনা: সম্পূর্ণতার জন্য, এখানে নিখুঁত অ্যালগরিদম, যা এক বাইট দীর্ঘ (এবং বেশ খানিকটা ধীর গতির))
for(n=0;x;x/=2)n+=x&1;
{}
। এটি এত সহজ একটি কাজ যা আমি ইতিমধ্যে এটি নিয়ে এসেছি অবাক হওয়ার দরকার নেই should
for(n=0;x;x/=2)n+=x&1;
এই উত্তরটি প্রতিদ্বন্দ্বিতামূলক নয়, যেহেতু চ্যালেঞ্জ পোস্ট হওয়ার পরে ভাষাটি তৈরি করা হয়েছিল।
2 বাইট:
BS
জেলি হ'ল জেনার মতো সিনট্যাক্স সহ @ ডেনিস রচিত একটি নতুন ভাষা।
implicit: function of command-line arguments
B Binary digits as list
S Sum
n->sum(digits(n,2))
এটি একটি অনামী ফাংশন তৈরি করে যা একটি একক যুক্তি গ্রহণ করে n
,। এটি ব্যবহার করতে, এটিকে এমন কিছুতে নির্ধারণ করুন f=n->...
এবং এটিকে কল করুন f(1337)
।
digits()
ফাংশন, যখন 2 আর্গ্যুমেন্টগুলির সাথে ডাকা দেওয়া বেস ইনপুট এর ডিজিটের একটি বিন্যাস দেখায়। সুতরাং digits(n, 2)
এর বাইনারি অঙ্কগুলি প্রদান করে n
। অ্যারের সমষ্টি নিন এবং তোমাদের মধ্যে বাইনারি প্রতিনিধিত্ব বেশী নম্বর আছে n
।
count_ones
ri2b:+
ri "Read the input and convert it to integer";
2b "Convert the integer into base 2 format";
:+ "Sum the digits of base 2 form";
sum(intToBits(scan())>0)
scan()
স্টিডিন থেকে ইনপুট পড়ে।
intToBits()
একটি পূর্ণসংখ্যা নিয়ে যায় এবং ইনপুটটির raw
বাইনারি উপস্থাপনের শূন্য এবং এরগুলিকে ধারণ করে এমন একটি ভেক্টর প্রদান করে।
intToBits(scan())>0
লজিকাল ভেক্টরটি প্রদান করে যেখানে প্রতিটি TRUE
বাইনারি ভেক্টর উপাদান যদি 1 হয় (যেহেতু সমস্ত উপাদান 0 বা 1 এবং 1> 0) অন্যথায় হয় FALSE
।
আর-তে, আপনি সংখ্যা পেতে একটি লজিকাল ভেক্টর যোগ করতে পারেন TRUE
উপাদানগুলির , সুতরাং উপরের হিসাবে আমরা কী চাই gets
নোট করুন যে সরাসরি ইনপুট sum()
হ্যান্ডেল করতে পারে না raw
, সুতরাং লজিক্যালগুলি ব্যবহার করে কার্যকরী হয়।
sum(intToBits(scan()))
একই হতে?
sum()
ধরণের ইনপুট নিতে পারছে না raw
, যা এটাই ফিরে এসেছে intToBits()
।
: c ?dup if dup 1- and recurse 1+ then ;
0 1337 c
যদি একটি আসল ফাংশন প্রয়োজন হয় তবে দ্বিতীয় লাইন হয়ে যায়
: c 0 swap c ;
এবং আপনি এটি "1337 সি" দ্বারা কল করেন। ফোর্থের তুলনামূলক ভার্বোজ কন্ট্রোল শব্দগুলি এটিকে শক্ত করে তোলে (আসলে তারা এগুলি অনেক শক্ত করে তোলে)।
সম্পাদনা করুন: আমার আগের সংস্করণটি নেতিবাচক সংখ্যাগুলি সঠিকভাবে পরিচালনা করে নি।
আমাকে স্মরণ করিয়ে দেওয়ার জন্য আলেফালফাকে ধন্যবাদ DigitCount
।
DigitCount[#,2,1]&
এটি একটি সাধারণ পুনরাবৃত্তির কাজ যা আরও কিছুটা ছোট করা যায়। এটি কেবল কিছুটা সময় নেয় এবং আবার নিজেকে চালায়:
B=n=>n&&(1&n)+B(n>>1)
এটি ব্যবহার করে দেখুন http://www.es6fiddle.net/imt5ilve/ (আপনার যা দরকার var
কারণ 'use strict';
)।
আমি বিশ্বাস করতে পারি না যে আমি মাছকে পরাজিত করেছি !!!
পুরানোটি:
n=>n.toString(2).split(1).length-1
উভয় ফাংশন সহজেই ES5- এ অভিযোজিত হতে পারে:
function B(n){return n?(1&n)+B(n>>1):0}
//ungolfed:
function B(number)
{
if( number > 0 )
{
//arguments.callee points to the function itself
return (number & 1) + arguments.callee( number >> 1 );
}
else
{
return 0;
}
}
পুরোনো একটি:
function(n){return n.toString(2).split(1).length-1}
@ user1455003 আমাকে একটি দুর্দান্ত ধারণা দিয়েছে, যা সবচেয়ে ছোটটিকে 'ট্রিগার' করেছে:
function B(n,x){for(x=0;n;n>>=1)x+=n&1;return x}
আমি এটিকে ES6 এর সাথে খাপ খাইয়ে এনেছি এবং এটিকে অনেক ছোট করার জন্য পুনরাবৃত্ত করে তুলছি!
0$11.>~n;
2,:?!^:2%:{+}-
প্রোগ্রামটি কেবল পুনরাবৃত্তি মোড 2 করে, বিয়োগ করে বিভাজন এবং ভাগ করে দেয় যতক্ষণ না ইনপুট সংখ্যাটি শূন্য হয়, তারপরে মোড 2 এর যোগফল মুদ্রণ করে।
-v
পতাকা সহ পরীক্ষা করুন , যেমন
py -3 fish.py ones.fish -v 1337
-v
পতাকা সংস্করণটি এখনও কাজ করে))
এটি আমার ES6 উত্তরের মতো একই অ্যাপ্রোচ ব্যবহার করে
<?=count(split(1,decbin($_GET[n])))-1;
এটি একটি সম্পূর্ণ কোড, আপনার কেবল এটি একটি ফাইলে রাখতে হবে এবং প্যারামিটার সহ এটি ব্রাউজারে অ্যাক্সেস করতে হবে n=<number>
।
এটি একটু খাটো:
<?=count(split(1,decbin($n)))-1;
এটি কেবলমাত্র পিএইচপি <4.2 এ নির্ভরযোগ্যভাবে কাজ করে কারণ নির্দেশটি PHP4.2 থেকে পিএইচপি 5.4 পর্যন্ত পূর্বনির্ধারিতভাবে register_globals
সেট করা Off
হয়েছিল (যা ততক্ষণে সরানো হয়েছিল)।
আপনি যদি একটি php.ini
ফাইল তৈরি করেনregister_globals=On
তবে এটি কাজ করবে।
কোডটি ব্যবহার করতে, পোষ্ট বা জিইটি হয় না দিয়ে একটি ব্রাউজার ব্যবহার করে ফাইলটি অ্যাক্সেস করুন।
তিনি কার্যত খুব আকর্ষণীয় ব্যবহার রয়েছে এমন দুটি সত্যিই ভাল পরামর্শ দিয়েছেন array_sum
:
38 বাইট:
<?=array_sum(str_split(decbin(1337)));
45 বাইট:
<?=array_sum(preg_split('//', decbin(1337)));
এটি সত্যিই দুর্দান্ত ধারণা এবং 36 বাইট দীর্ঘ হতে আরও কিছুটা ছোট করা যেতে পারে:
<?=array_sum(split(1,decbin(1337)));
<?=substr_count(decbin(1337),"1");
(34 বাইট) ব্যবহার করে চারটি বাইট অর্জন করুন
<?=substr_count(decbin(1337),1);
। এটি মোট 32 বাইট। এটি একটি আলাদা যথেষ্ট কোড হিসাবে বিবেচনা করে, আপনি কি এটি নিজের উত্তর হিসাবে পোস্ট করতে চান না? আমি অবশ্যই এটি upvote হবে!
<?=substr_count(decbin($argv[1]),1);
(বা $_GET[n]
; 36 বাইট)
¢o1 l
পাশাপাশি কাজ করবে। আর একটি আকর্ষণীয় পদ্ধতির হ'ল -¢¬r-0
; ¢¬
বাইনারি অঙ্কের অ্যারেতে বিভক্ত হয়, r-0
0 থেকে শুরু করে বিয়োগ দ্বারা হ্রাস পায় এবং -
ফলাফলটিকে ইতিবাচক করে তোলে।
¢¬x
।
অ-প্রতিযোগিতামূলক উত্তর। মোম এই চ্যালেঞ্জের চেয়ে নতুন।
এই সমাধানটি "বিট টুইডলিং হ্যাকস" ওয়েবসাইট থেকে সেট বিট গণনা করার জন্য ব্রায়ান খেরিগানের পদ্ধতি ব্যবহার করে।
এটি কেবল একটি লুপের মধ্য দিয়ে চলে, বিট কাউন্টটি বৃদ্ধি করে, যতক্ষণ number=number&(number-1)
না পর্যন্ত পুনরাবৃত্তি করে number = 0
। বিটস সেট থাকায় সমাধানটি কেবল লুপের মধ্য দিয়ে যায়।
আমি কয়েকটি নির্দেশ পুনরায় সাজিয়ে 4 বাইট শেভ করতে পারি। উভয় উত্স কোড এবং ব্যাখ্যা আপডেট হয়েছে:
pT_
>"p~0+M~p
d~0~@P@&<
{@<
ব্যাখ্যা:
pT_ generate IP, input Integer, redirect
>" if top lstack value > 0 jump next instruction,
otherwise continue at next instruction
p redirect if top lstack value=0 (see below)
~ flip top and 2nd lstack values
0+ set top lstack value to 0, set top=top+2nd
M decrement top lstack value
~ flip top and 2nd lstack values
p redirect to lower left
< redirect to left
& top=top&2nd
@ flip top and 3rd lstack values
@P increment top lstack value, flip top and 3rd values
~0~ flip top and 2nd values, set top=0, flip top and 2nd again
d redirect to upper left
>"p~0+M..... loop back
p if top lstack = 0 at " instruction (see above), redirect
0 set lstack top to zero (irrelevant instruction)
< redirect to the left
@ flip top and 3rd lstack values
{ output top lstack value as integer (bitcount)
মোমওয়াক্স দোভাষী, ভাষার বৈশিষ্ট্য এবং উদাহরণগুলি সহ আমার গিটহাবের সংগ্রহস্থলটি ক্লোন করুন ।
কাজ করার জন্য byte
, short
, char
, এবং int
। ল্যাম্বদা হিসাবে ব্যবহার করুন।
Integer::bitCount
বিল্ট-ইনগুলি ব্যবহার না করে:
42 বাইট
s->{int c=0;for(;s!=0;c++)s&=s-1;return c}
sum(dec2bin(s)-48)
উদাহরণ:
octave:1> s=1337
s = 1337
octave:2> sum(dec2bin(s)-48)
ans = 6
"$([char[]][convert]::ToString($s,2)|%{"+$_"})"|iex
ব্যাখ্যা:
[convert]::ToString($s,2)
থেকে একটি বাইনারি স্ট্রিং প্রতিনিধিত্ব উত্পাদন করে $s
।
[char[]]
এটিকে একটি চর অ্যারে হিসাবে কাস্ট করে এবং আমাদের প্রতিটি চরকে গণনা করার অনুমতি দেয়।
|%{"+$_"}
প্রতিটি অক্ষরকে একটি + চিহ্ন সহ
"$()"
নিখুঁতভাবে কল .ToString()
করে ফলাফলের উপ এক্সপ্রেশনটি
|iex
পাইপযুক্ত স্ট্রিংয়ের যোগফল (যেমন "+ 1 + 0 +1 +1 +0 +1 +0 +0" = 4)
-join
অপারেটর এবং .ToString()
45 টি বাইট সহ 45 টি বাইট অর্জনের জন্য অন্তর্নিহিত ব্যবহার করবেন না [char[]][convert]::ToString($s,2)-join'+'|iex
, বা ভিন্ন পদ্ধতির হিসাবে -replace
43 বাইট অর্জনের জন্য ইনলাইন অপারেটর ব্যবহার করুন([convert]::ToString($s,2)-replace0).length
#(count(filter #{\1}(Long/toString % 2)))
ডান থেকে বামে পড়া, বাইনারি স্ট্রিংয়ে রূপান্তর করুন, অক্ষরের অনুক্রমে রূপান্তর করুন, 1
গুলি ফিল্টার করুন এবং আপনার কতগুলি আছে তা গণনা করুন।
সিয়েগের সহায়তায় সম্পাদিত
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
। এটি যদিও এক সেকেন্ড আগে কাজ করেছে।
t 0=[]
t n=t(quot n 2)++[rem n 2]
f=sum.t
f :: Integer -> Integer
ইন্টারেক্টিভ ইন্টারপ্রেটার থেকে ফাংশন ব্যবহার হিসাবে ঘোষণা করে f <number>
বা main=print$f <number>
ফাইলের শেষে লাইন যুক্ত করে ।
rem n 2
গুলি পরিবর্তে এটি একটি তালিকা বিল্ডিং এবং ব্যবহার করে div
পরিবর্তে quot
: t 0=0
t n=t(div n 2)+rem n 2
না - f
আর।
⨭⟦ïⓑ
ইনপুটটিকে বাইনারিতে রূপান্তর করে, চরগুলি বরাবর বিভক্ত হয় এবং ফলাফল অ্যারে যোগফল যোগ করে।