আমি কত বিট ফিট


52

যেকোন ধনাত্মক 32-বিট পূর্ণসংখ্যার ( 1 ≤ n ≤ 0xFFFFFFFF) আউটপুটের জন্য সেই পূর্ণসংখ্যাকে উপস্থাপন করার জন্য প্রয়োজনীয় বিটের সংখ্যা।

পরীক্ষার মামলা

| n    | n in binary | bits needed |
|----------------------------------|
| 1    | 1           | 1           |
| 2    | 10          | 2           |
| 3    | 11          | 2           |
| 4    | 100         | 3           |
| 7    | 111         | 3           |
| 8    | 1000        | 4           |
| 15   | 1111        | 4           |
| 16   | 10000       | 5           |
| 128  | 10000000    | 8           |
| 341  | 101010101   | 9           |

4294967295 => 11111111111111111111111111111111 => 32

সুতরাং f(16)মুদ্রণ বা ফিরে হবে5

এটি । বাইটস মধ্যে সংক্ষিপ্ত কোড


2
এটি বেস -২ লোগারিদমের সিলিং।
orlp

23
@orlp এটি আসলে হ'লfloor(log2(num))+1
ক্রিটসি লিথোস

2
পুনঃটুইট
orlp

3
কিছুই নয়, কেবল বুঝতে পেরেছি যে দুটিটির numশক্তি যখন আলাদা হয় তখন গুরুত্বপূর্ণ ।
ব্রায়ান জে

11
এটি অনেক তুচ্ছ সমাধান সহ একটি তুচ্ছ চ্যালেঞ্জ। তবে কিছু অ-তুচ্ছ সমাধানও রয়েছে। ভোটারদের কাছে: বিল্টিন ফাংশনগুলিকে উন্নীত করার আগে দয়া করে এই মেটা পোস্টের প্রথম বাক্যটি পড়ুন । (বিনীতভাবে এই মন্তব্য থেকে নেওয়া হয়েছে )
ক্রিটসি লিথোস

উত্তর:


30


20
@ DevRicher আমি প্রত্যাশা করছি যে 1 টি বাইট সলিউশন দ্বারা এখনও পরাজিত হব, সত্যবাদী হোক।
ম্যাজিক অক্টোপাস উরন

9
কমপক্ষে এই উত্তরটি এটির পক্ষে উন্নতি করে; এটা না bg
NoOneIs এখানে

3
bgগেমিং এর অর্থ bad game:)
YoYoYonnY


35

জাভাস্ক্রিপ্ট (ES6), 18 বাইট

f=n=>n&&1+f(n>>>1)
<input type=number min=0 step=1 value=8 oninput="O.value=f(this.value)">
<input id=O value=4 disabled>


এটি এখানে কয়েকটি তুচ্ছ সমাধানের মধ্যে একটি। দুর্দান্ত কৌশল!
ক্রিটিকি লিথোস

1
এটি n>>>1সমর্থন করা উচিত n > 0x7FFFFFFF?
আর্নৌল্ড

@ আরনাউল্ড হুম, জানেন না যে এই উচ্চতায় >>ব্যর্থ হয়েছে n। ধন্যবাদ।
ETH প্রোডাকশনগুলি

ভাল f=(a,b=1)=>a>1?f(a>>1,++b):b
লাগল

28

x86 সমাবেশ, 4 বাইট

কনস্ট্যান্ট ধরে নিচ্ছেন EBX:

bsr eax,ebx
inc eax

EAX কনস্ট্যান্টের জন্য প্রয়োজনীয় বিটের সংখ্যা ধারণ করে।

বাইট: ☼¢├@

হেক্সাডেসিমেল: ['0xf', '0xbd', '0xc3', '0x40']


2
আপনি কি দয়া করে প্রকৃত 8 বাইট সংকলিত x86 অ্যাসেম্বলি কোডের একটি হেক্সডাম্প অন্তর্ভুক্ত করতে পারেন?
লুভজো

তা - ই করলেন. এবং আপনাকে ধন্যবাদ, কারণ আমি বুঝতে পেরেছি যে আমি একটি ভুল করেছি। আমি নিয়ম মাপসই একটি "ইন ইক্স" যুক্ত করেছি। আমি একটি বাইট হারিয়েছি। :(
z0rberg এর

ওহ বাহ আপনি আমার পোস্টটিকে যথাযথ ফর্ম্যাটে পরিণত করেছেন। এটি সংশোধন করার জন্য ধন্যবাদ!
z0rberg এর

2
যাইহোক, বিধানসভা জমাগুলি ধরে নিতে পারে যে ইনপুটটি ইতিমধ্যে একটি নির্দিষ্ট রেজিস্টারে সঞ্চিত আছে , সুতরাং আমি মনে করি আপনি কিছু বাইট সেভাবে শেভ করতে পারেন।
লুভজো

1
সমাবেশের উত্স কোডের পরিবর্তে সংকলিত মেশিন কোডের বাইট সংখ্যা হিসাবে সমাবেশ জমা দেওয়ার গণনা করা কি প্রথাগত?

18

এটি পাইথন 2 তেও কাজ করে।
ভোল্টাহ

1
এটা সত্যিই না। ভুলে গেছেন পাইথন 2 এর int- এ 64 বিট প্রশস্ত, 32 বিট ছিল না।
ডেনিস

পাইথন 3 এর bit_lengthহয় bit_length()
dfernan

2
@dfernan এটি কোনও ফাংশন কল নয়; এটি একটি ফাংশন। যদি এন একটি অন্তর্নির্মিত হয় , int.bit_length(n)এবং n.bit_length()ঠিক একই কাজ করুন।
ডেনিস

2
@dfernan int.bit_length(n)একটি ফাংশন কল , এবং এইভাবে একটি স্নিপেট যা ধরে নেয় যে ইনপুটটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করা আছে। এটি আমাদের বিধি দ্বারা অনুমোদিত নয় , সুতরাং সংযোজন (n)এই উত্তরটিকে অবৈধ করে তুলবে। যাইহোক, int.bit_lengthকোনও ফাংশনের মূল্যায়ন করে এবং পরবর্তী ব্যবহারের জন্য একটি পরিবর্তনশীলে সংরক্ষণ করা যায়। এটি ডিফল্টরূপে অনুমোদিত।
ডেনিস

15

ল্যাবরেথ , 13 12 বাইট

 ?
_:
2/#(!@

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

প্রোগ্রামটি বারবার শূন্য না হওয়া পর্যন্ত ইনপুটটিকে 2 বার ভাগ করে দেয়। প্রতিটি পদক্ষেপে মানটি নকল করে পদক্ষেপের সংখ্যা ট্র্যাক করা হয়। একবার এটি শূন্যে হ্রাস পেয়ে আমরা স্ট্যাকের গভীরতা (বিয়োগ 1) মুদ্রণ করি।

প্রোগ্রামটি শুরু হয় ?যা ইনপুটটি পড়ে। মূল লুপটি নীচের দিকে 2x2 ব্লক হয়ে ঘড়ির কাঁটার বিপরীতে চলেছে:

:   Duplicate current value.
_2  Push 2.
/   Divide.

একবার পূর্ণ পুনরাবৃত্তির পরে মান শূন্য হয়ে গেলে, শেষে লিনিয়ার বিট কার্যকর করা হয়:

#   Push stack depth.
(   Decrement.
!   Print.
@   Terminate.

5
এই সমাধানটি সম্পূর্ণ - এটি ইনপুট নেয় এবং উত্তর সরবরাহ করে, এবং এই নির্দিষ্ট উদ্দেশ্যে কোনও বিদ্যমান কার্যটি ব্যবহার করে না - এটি ম্যানুয়ালি উত্তর গণনা করে। আমার কাছে এটি অন্যান্য উত্তরগুলির চেয়ে গেমের স্পিরিটে বেশি।
জোহান

15

সি, 31 বাইট

f(long n){return n?1+f(n/2):0;}

... তারপর আমি পুনরাবৃত্তি সম্পর্কে চিন্তা। অস্পষ্ট থেকে স্পষ্ট, এবং দৈর্ঘ্যের এক চতুর্থাংশ বাদ পড়েছে।

কলিরুতে এটি সরাসরি দেখুন


সি, 43 বাইট

c;
#define f(v)({for(c=0;v>=1l<<c;++c);c;})

স্বাক্ষরবিহীন মান (যেমন ) fসহ কল করা তার বিট দৈর্ঘ্য "ফেরত" দেবে। এমনকি কাজ করে !f(42u)0u

অসম্পূর্ণ এবং ব্যাখ্যা করা হয়েছে: (ব্যাকস্ল্যাশগুলি বাদ দেওয়া)

c;
#define f(v)
    ({ // GCC statement-expression

        // Increment c until (1 << c) >= v, i.e
        // that's enough bits to contain v.
        // Note the `l` to force long
        // arithmetic that won't overflow.
        for(c = 0; v >= 1l << c; ++c)
            ; // Empty for body

        c; // Return value
    })

কলিরুতে এটি সরাসরি দেখুন


ওপি n> = 1 এর গ্যারান্টি দেয়, সুতরাং n?...:0এটি প্রয়োজনীয় নয়।
ম্যাড পদার্থবিজ্ঞানী

1
@ ম্যাড ফিজিসিস্ট ভালভাবে আমাকে কোথাও পুনরাবৃত্তি বন্ধ করতে হবে, আমি করব না;)
কোয়ান্টিন

ওআইসি। মনোযোগ সহকারে পড়িনি, এখন ডাম্বসের মতো অনুভব করুন। পরিষ্কারভাবে উত্তর হয়।
ম্যাড পদার্থবিজ্ঞানী

@ ম্যাড ফিজিসিস্ট কোনও উদ্বেগ প্রকাশ করবেন না, আপনাকে অনেক ধন্যবাদ :)
কোয়ান্টিন

জিসিসি স্টেটমেন্টের অভিব্যক্তি ধরে নিরবিচ্ছিন্ন সমাধানের জন্য, আমি মনে করি আপনিও সেই #define f(n) ({64-__builtin_clzl(n);})পদ্ধতির ব্যবহারের দিকে ঝুঁকছেন ।
মোরাকী


14

পার্ল 6 , 7 বাইট

*.msb+1

চেষ্টা করে দেখুন

ব্যাখ্যা:

* এটিকে যেকোনো কোড ল্যাম্বডায় পরিণত করে এবং ইনপুটটি কোথায় রাখবে তা নির্দেশ করে

.msb কোন আন্তঃসমুহ সবচেয়ে গুরুত্বপূর্ণ বিটের সূচক ফেরত দেয় (0 ভিত্তিক)

+1ল্যাম্বডায় একত্রিত হয় এবং কল করার পরিণামে ফলাফল যুক্ত করে .msb


13

সি প্রিপ্রসেসর ম্যাক্রো (জিসিসি এক্সটেনশন সহ), 26

#define f 32-__builtin_clz

জিসিসির গণনা-শীর্ষস্থানীয়-জিরো অন্তর্নির্মিত ব্যবহার করে

এটিকে একটি ফাংশন হিসাবে কল করুন, যেমন f(100)

এটি অনলাইনে চেষ্টা করুন


ওহ, বাহ, আমি একটি বিল্টিন ব্যবহারের কথা ভেবেছিলাম তবে ধারণাটি বাদ দিয়েছিলাম কারণ আমি ভেবেছিলাম এটি খুব দীর্ঘ হতে চলেছে ... ভাল খেলেছে।
কোয়ান্টিন

ভাগ্যবান ওপি নির্দিষ্ট করা n> = 1: ডি
ম্যাথিউ এম।

12

রেটিনা , 56 37 বাইট

এই সমাধানটি সমস্ত প্রয়োজনীয় ইনপুট মানগুলির সাথে কাজ করে।

এই চ্যালেঞ্জের মধ্যে রেটিনা সবচেয়ে বড় সমস্যাটির মুখোমুখি হ'ল এটির স্ট্রিংগুলির সর্বাধিক দৈর্ঘ্য 2 ^ 30 অক্ষর থাকে, সুতরাং সংখ্যাগুলির সাথে আচরণ করার স্বাভাবিক পদ্ধতি (অবিচ্ছিন্ন উপস্থাপনা) 2 ^ 30 এর বেশি মানের সাথে কাজ করে না।

এই সমস্যাটি সমাধান করার জন্য আমি একটি পৃথক পদ্ধতির অবলম্বন করে সংখ্যার দশমিক দশমিক উপস্থাপনা রেখেছিলাম, তবে যেখানে প্রতিটি অঙ্কটি অ্যানারিতে লেখা হয় (আমি এই প্রতিনিধিত্বকে ডিজিটোনারি বলব )। উদাহরণস্বরূপ সংখ্যাটি সংখ্যা 341হিসাবে লেখা হবে 111#1111#1#। এই প্রতিনিধিত্বের সাহায্যে আমরা এখন পর্যন্ত 2^30/10সংখ্যা পর্যন্ত (একশত মিলিয়ন ডলার) সংখ্যা নিয়ে কাজ করতে পারি । এটি নির্বিচারে পাটিগণিতের জন্য মানসম্মত অ্যানারি থেকে কম ব্যবহারিক, তবে কিছুটা চেষ্টা করে আমরা কোনও ধরণের অপারেশন করতে পারি।

উল্লেখ্য: তত্ত্ব digitunary অন্য কোন বেস ব্যবহার করতে পারে (যেমন বাইনারি 110হবে 1#1##বেস 2 digitunary মধ্যে), কিন্তু যেহেতু অক্ষিপট builtins দশমিক এবং ইউনারী এবং অন্যান্য ঘাঁটি সঙ্গে মোকাবিলা করার জন্য কোন সরাসরি পথ মধ্যে রূপান্তর করতে হয়েছে, দশমিক সম্ভবত সবচেয়ে সামলানো বেস।

আমি ব্যবহৃত অ্যালগরিদমটি শূন্যে না পৌঁছা পর্যন্ত একের পর এক পূর্ণসংখ্যা বিভাগ তৈরি করে চলেছে, আমরা যে বিভাগ তৈরি করেছি তার সংখ্যাটি এই সংখ্যার প্রতিনিধিত্ব করার জন্য প্রয়োজনীয় বিটের সংখ্যা।

সুতরাং, আমরা কীভাবে দুটি সংখ্যায় ভাগ করব? এটি রেটিনা স্নিপেট যা এটি করে:

(1*)(1?)\1#        We divide one digit, the first group captures the result, the second group captures the remainder
$1#$2$2$2$2$2      The result is put in place of the old number, the remainder passes to the next digit (so it is multiplied by 10) and is divided by two there -> 5 times the remainder goes to the next digit

এই প্রতিস্থাপনটি একটি অঙ্কের সংখ্যা 2 দিয়ে বিভক্ত করার জন্য যথেষ্ট, মূল সংখ্যাটি বিজোড় হলে আমাদের কেবল শেষ থেকে সম্ভাব্য .5 গুলি সরিয়ে ফেলতে হবে।

সুতরাং, এখানে পুরো কোডটি রয়েছে, সংখ্যায় এখনও সংখ্যা না পাওয়া পর্যন্ত আমরা দুটি দ্বারা বিভাজন nরেখে চলেছি এবং প্রতিটি পুনরাবৃত্তির স্ট্রিংয়ের সামনে একটি আক্ষরিক রেখেছি: শেষে সংখ্যাটি nফলাফল।

.                  |
$*1#               Convert to digitunary
{`^(.*1)           Loop:|
n$1                    add an 'n'
(1*)(1?)\1#            |
$1#$2$2$2$2$2          divide by 2
)`#1*$                 |
#                      erase leftovers
n                  Return the number of 'n's in the string

এটি অনলাইন চেষ্টা করুন!


আপডেট সমাধান, 37 বাইট

দৈর্ঘ্যের এক তৃতীয়াংশ সম্পর্কে গল্ফপ্রাপ্ত অনেক ভাল ধারণার সাথে বিগ রিফ্যাক্টরিং, মার্টিন ইন্ডারকে সমস্ত ধন্যবাদ!

মূল ধারণাটি _আমাদের আনরিয়ার প্রতীক হিসাবে ব্যবহার করা হয়: এইভাবে আমরা আমাদের স্ট্রিংগুলিতে নিয়মিত অঙ্কগুলি ব্যবহার করতে পারি, যতক্ষণ আমরা _যখন প্রয়োজন হয় তখন এগুলিতে আবার রূপান্তর করি : এটি আমাদের বিভাজনে এবং একাধিক সন্নিবেশে অনেকগুলি বাইট সংরক্ষণ করতে দেয় ডিজিটের।

কোডটি এখানে:

<empty line>    |
#               put a # before each digit and at the end of the string 
{`\d            Loop:|
$*_                 Replace each digit with the corrisponding number of _
1`_                 |
n_                  Add an 'n' before the first _
__                  |
1                   Division by 2 (two _s become a 1)
_#                  |
#5                  Wherever there is a remainder, add 5 to the next digit
}`5$                |
                    Remove the final 5 you get when you divide odd numbers
n               Return the number of 'n's in the string

এটি অনলাইন চেষ্টা করুন!


1
আমি একটি অনুরূপ সংখ্যক ফর্ম ব্যবহার করেছি (তবে এটি ইউনারি-কোডড ডেসিমাল বলে ), যা শেডের সাথে পাটিগণিতের জন্য বেশ কার্যকর।
টবি স্পিড

11

রুবি, 19 16 বাইট

->n{"%b"%n=~/$/}

জর্ডান 3 বাইট বন্ধ গল্ফ করার জন্য ধন্যবাদ


আপনার সাথে একটি বাইট সংরক্ষণ করতে পারবেন %: ->n{("%b"%n).size}
জর্দান

3
অপেক্ষা করুন, এই খাটো: ->n{"%b"%n=~/$/}
জর্দান

10

জল্ফ, 2 বাইট

lB

কেবল বাইনারি রূপান্তর করুন এবং তারপরে দৈর্ঘ্যটি সন্ধান করুন।



10

জাভাস্ক্রিপ্ট ES6, 19 বাইট

a=>32-Math.clz32(a)

Math.clz32একটি সংখ্যার 32-বিট বাইনারি উপস্থাপনায় শীর্ষস্থানীয় শূন্য বিটের সংখ্যা প্রদান করে। সুতরাং প্রয়োজনীয় বিটগুলির পরিমাণ পাওয়ার জন্য আমাদের কেবলমাত্র 32 টি থেকে সংখ্যার বিয়োগ করা দরকার

f=
  a=>32-Math.clz32(a)
  
pre {
    display: inline;
}
<input id=x type="number" oninput="y.innerHTML = f(x.value)" value=128><br>
<pre>Bits needed: <pre id=y>8</pre></pre>


2
বিকল্পটিও a=>1+Math.log2(a)|019 বাইট।
নীল

5
@ নীল 1+...|0চিৎকার করে মাইনাস টিলডে ! a=>-~Math.log2(a)18
edc65

@ edc65 আমি 17 গণনা করছি ... তবে হ্যাঁ, আমি নিশ্চিত ছিলাম যে আমি কিছু অনুপস্থিত ছিলাম, এটি দেখানোর জন্য ধন্যবাদ।
নিল

@ নীল এটির পৃথক উত্তর হিসাবে নিঃসঙ্কোচে পোস্ট করুন। এটি আমার উত্তরের চেয়ে আলাদা পদ্ধতি ব্যবহার করে তাই হ্রাসিত বাইট গণনার জন্য আপনার ব্যবহার করা অন্যায় অনুভব করে
বাসড্রপ কম্বারউবউবউবব

10

বাশ / ইউনিক্স সরঞ্জাম, 16 বাইট

dc<<<2o$1n|wc -c

এটি কোনও স্ক্রিপ্টে সংরক্ষণ করুন এবং ইনপুটটিকে আর্গুমেন্ট হিসাবে পাস করুন। বাইনারিতে সেই সংখ্যাটি উপস্থাপনের জন্য প্রয়োজনীয় বিটের সংখ্যা মুদ্রিত হবে।

এখানে একটি ব্যাখ্যা:

ডিসি একটি স্ট্যাক-ভিত্তিক ক্যালকুলেটর। টোকেনে বিভক্ত এর ইনপুটটি হ'ল:

2 - স্ট্যাকের উপর 2 চাপুন।

ও - স্ট্যাকের বাইরে একটি মান পপ করুন (যা 2) এবং এটিকে আউটপুট বেস করুন (সুতরাং আউটপুটটি এখন বাইনারি হয়)।

বাশ প্রোগ্রামের জন্য আর্গুমেন্টের মান ($ 1) - সেই যুক্তিকে স্ট্যাকের উপর চাপুন ush

n - স্ট্যাকের বাইরে কোনও মান পপ করুন (যা ইনপুট নম্বর) এবং এটি মুদ্রণ করুন (বাইনারিতে, কারণ এটি আউটপুট বেস) কোনও পেছনের নিউলাইন ছাড়াই।

সুতরাং ডিসি কমান্ড বাইনারি সংখ্যা মুদ্রণ।

ডিসির আউটপুট -c বিকল্পের সাহায্যে কমান্ড ডাব্লিউসি-তে পাইপ করা হয়, যা এর ইনপুটটিতে অক্ষরের সংখ্যা মুদ্রণ করে।

শেষ ফলাফলটি আর্গুমেন্টের বাইনারি উপস্থাপনায় অঙ্কের সংখ্যা মুদ্রণ করা।


ভাষার দুর্দান্ত পছন্দ, তবে আপনি যদি কোনও ব্যাখ্যা অন্তর্ভুক্ত করেন তবে এটি আরও শীতল হবে।
এনএইচ।

@ এনএইচ ধন্যবাদ। আমি একটি ব্যাখ্যা যুক্ত করেছি।
মিচেল স্পেক্টর

9

গুগল শিটস, 15 বাইট

A1সূত্রটি ধারণ করে এমন কক্ষে সেল এবং আউটপুট থেকে ইনপুট নেয়

=Len(Dec2Bin(A1

অথবা

=Int(1+Log(A1,2

অথবা

=Int(Log(2*A1,2

এক্সেল, 17 বাইট

উপরের মতো একই তবে এমএস এক্সেলের জন্য ফর্ম্যাট করা

=Len(Dec2Bin(A1))

অথবা

=Int(1+Log(A1,2))

অথবা

=Int(Log(2*A1,2))


8

জেলি, 2 বাইট

BL

বাইনারি রূপান্তর করে, দৈর্ঘ্য সন্ধান করে।


8

সি #, 63 45 31 বাইট

18 বাইট সংরক্ষণ করা হয়েছে, লুভজো এবং টুক্কাএক্সকে ধন্যবাদ

14 বাইট সংরক্ষণ করা হয়েছে, গ্রাক্সকে ধন্যবাদ

 b=>1+(int)System.Math.Log(b,2);

এটি ব্যবহার করে, যে একটি দশমিক সংখ্যা এন এর ⌊log2 (n) ⌋ + 1 বিট থাকে, যা এই পৃষ্ঠায় বর্ণিত :

নির্দিষ্ট দশমিক পূর্ণসংখ্যায় বিটের সংখ্যা

একটি ধনাত্মক পূর্ণসংখ্যা n এর বি বিট থাকে যখন 2 ^ (বি -1) ≤ n ≤ 2 ^ বি - 1. উদাহরণস্বরূপ:

  • 29 এর 5 টি বিট রয়েছে কারণ 16 ≤ 29 ≤ 31, বা 2 ^ 4 ≤ 29 ≤ 2 ^ 5 - 1
  • 123 এর 7 টি বিট রয়েছে কারণ 64 ≤ 123 ≤ 127, বা 2 ^ 6 ≤ 123 ≤ 2 ^ 7 - 1
  • 967 এর 10 টি বিট রয়েছে কারণ 512 ≤ 967 ≤ 1023, বা 2 ^ 9 ≤ 967 ≤ 2 ^ 10 - 1

বৃহত্তর সংখ্যার জন্য, আপনি আপনার সংখ্যাটি অন্তর্ভুক্ত থাকা ধারাবাহিক শক্তিগুলি সন্ধান করতে দুজনের শক্তির একটি সারণির সাথে পরামর্শ করতে পারেন।

এটি কেন কাজ করে তা দেখতে উদাহরণস্বরূপ 2 ^ 4 - 1 এর মধ্য দিয়ে পূর্ণসংখ্যার 2 ^ 4 এর বাইনারি উপস্থাপনাগুলি ভাবেন। এগুলি 11111 এর মাধ্যমে 10000, সমস্ত সম্ভাব্য 5-বিট মান।

লোগারিদম ব্যবহার করে

উপরের পদ্ধতিটি অন্যভাবে বলা যেতে পারে: বিটের সংখ্যাটি হ'ল আপনার সংখ্যার চেয়ে দু'জনের ক্ষুদ্রতম ক্ষয়ের এক্সপোঞ্জার। আপনি সেই গাণিতিকভাবে এই হিসাবে বর্ণনা করতে পারেন:

বিএসপেক = অলগ 2 (এন) ⌋ + 1

এই সূত্রটির তিনটি অংশ রয়েছে:

  • লগ 2 (এন) এর অর্থ এন এর বেস 2 তে লগারিদম, যা ঘটিত হয় যা 2 পেতে n পেতে উত্থাপিত হয়। উদাহরণস্বরূপ, লগ 2 (123) ≈ 6.9425145। ভগ্নাংশের অংশের উপস্থিতি অর্থ n এর দুটি শক্তির মধ্যে থাকে।

  • ⌊X⌋ হ'ল x এর তল, এটি x এর পূর্ণসংখ্যা অংশ। উদাহরণস্বরূপ, ⌊6.9425145⌋ = 6.. আপনি এনলাইনের বাইনারি উপস্থাপনায় ⌊log2 (n) ⌋ কে সর্বোচ্চ দু'টির পাওয়ারের উদ্দীপক হিসাবে ভাবতে পারেন।

  • +1 প্রকাশকটিকে পরবর্তী দুটি উচ্চতর শক্তিতে নিয়ে যায়। আপনি এই পদক্ষেপটি আপনার বাইনারি সংখ্যার 2 ^ 0 তম স্থানের জন্য অ্যাকাউন্টিং হিসাবে ভাবতে পারেন, যা আপনাকে তার বিটগুলির মোট সংখ্যা দেয়। আমাদের উদাহরণস্বরূপ, এটি 6 + 1 = 7. আপনি সিলিং ফাংশন - ⌉x⌉ ব্যবহার করার জন্য প্রলুব্ধ হতে পারেন, যা x এর চেয়ে বড় বা সমান ক্ষুদ্রতম পূর্ণসংখ্যা - যেমন বিটের সংখ্যা গণনা করতে:

বিএসপেক = অলগ 2 (এন) ⌉

যাইহোক, n ব্যর্থ হলে দুটি ব্যর্থ হয়।


আপনার কাছে সেখানে অতিরিক্ত স্থান রয়েছে ...)+ 1)...-> ...)+1...। এছাড়াও, আমি মনে করি আপনি এটি মুদ্রণের পরিবর্তে সরাসরি মানটি ফিরিয়ে দিতে পারবেন।
লুভজো

আপনি এটি এটিকে 31 এ নামিয়ে দিতে পারেন b=>1+(int)System.Math.Log(b,2); ইন্ট রূপান্তরটি ম্যাথ.ফ্লুর হিসাবে একই আউটপুট সরবরাহ করে এবং যদি আপনি কেবল একবার সিস্টেমকে উল্লেখ করেন তবে আপনাকে ব্যবহারের বিবৃতিটির প্রয়োজন হবে না।
Grax32

6

সি #, 32 বাইট

n=>Convert.ToString(n,2).Length;

প্যারামিটারটিকে বাইনারি স্ট্রিংয়ে রূপান্তর করে এবং স্ট্রিংয়ের দৈর্ঘ্য প্রদান করে।


4

হাস্কেল, 20 বাইট

succ.floor.logBase 2

লোগারিদম বেস 2, মেঝে এবং 1 যোগ করে এমন একটি ক্রিয়া রচনা করে।


4

বেফুঞ্জ -৩৩ , ২৩ 21 বাইট

&>2# /# :_1>+#<\#1_.@

বেফঞ্জ একটি 2 ডি গ্রিড ভিত্তিক ভাষা (যদিও আমি কেবল একটি লাইন ব্যবহার করছি)।

&                      take integer input
 >2# /# :_             until the top of the stack is zero, halve and duplicate it
          1>+#<\#1_    find the length of the stack
                   .@  output that length as an integer and terminate the program

এটি অনলাইন চেষ্টা করুন!


@ জেমসহোল্ডারেন্স ধন্যবাদ, আমি অনুভব করেছি যে এটি হ্যাশ / স্পেস অনেক বেশি হওয়ায় এটি সংক্ষিপ্ত করা যেতে পারে, তবে আমি এটি বেশিরভাগই পেতে পারি নি।
জয়ডেপ





3

কিউবিআইসি , 18 বাইট

:{~2^q>a|_Xq\q=q+1

এটা অবিশ্বাস্য মাইক! কিন্তু এটা কিভাবে কাজ করে?

:        Read input as integer 'a'
{        Start an infinite DO-LOOP
~2^q>a   If 2 to the power of q (which is 1 by default) is greater than a
|_Xq     Then quit, printing q
\q=q+1   Else, increment q
[LOOP is closed implicitly by QBIC]

3

জাভা 8, 34 27 বাইট

একবারের জন্য, জাভা কিছু দরকারী বিল্টিন আছে! এখন, আমাদের কেবল কিছু ছোট নাম প্রয়োজন ...

x->x.toString(x,2).length()

এটি অনলাইন চেষ্টা করুন!

অবশ্যই, আপনি বিল্টিনগুলি ছাড়াই এটি করতে পারেন ( স্নোম্যানের উত্তর দেখুন ), তবে উচ্চতর বাইট গণনার জন্য।


3

অক্টাভা, 19 বাইট

@(x)nnz(dec2bin(x))    % or
@(x)nnz(de2bi(x)+1)    % or
@(x)nnz(de2bi(x)<2)    % or
@(x)numel(de2bi(x))    % or
@(x)rows(de2bi(x'))

দশমিক সংখ্যাগুলি বাইনারি সংখ্যায় রূপান্তর করার জন্য অষ্টাভের দুটি ফাংশন রয়েছে।

dec2binএকটি সংখ্যাটিকে অক্ষরের স্ট্রিংয়ে রূপান্তর করে 1এবং 0(ASCII- মান 48এবং 49)। স্ট্রিংয়ের দৈর্ঘ্য বিটগুলির প্রয়োজনীয় সংখ্যার সমান হবে, অন্যথায় নির্দিষ্ট না করা থাকলে। যেহেতু অক্ষর 1এবং 0নন-জিরো, আমরা ব্যবহার করতে পারেন nnzএই মত উপাদানের সংখ্যা দেখুন: @(x)nnz(dec2bin(x))। এটি 19 বাইট, সুতরাং এটি লুই মেন্ডোর অন্যান্য অক্টাভা উত্তরের সাথে আবদ্ধ ।

আমরা কি আরও ভাল ব্যবহার করতে পারি de2bi?

de2biএকটি ফাংশন যা বাইনারি সংখ্যাগুলি ভেক্টর হিসাবে সংখ্যার সাথে 1এবং 0পূর্ণসংখ্যার হিসাবে প্রদান করে, অক্ষর নয়। de2biস্পষ্টতই দুটি বাইটের চেয়ে কম dec2bin, তবে আমরা আর ব্যবহার করতে পারি না nnz। আমরা যদি হয় সমস্ত উপাদানগুলিতে যুক্ত করি, বা কেবলমাত্র মান সহ একটি লজিকাল ভেক্টর হিসাবে তৈরি করি তবে আমরা ব্যবহার করতেnnz পারি । এবং উভয়ই 19 বাইট। ব্যবহারে আমাদের 19 বাইট ,।1true@(x)nnz(de2bi(x)+1)@(x)nnz(de2bi(x)<2)numel@(x)numel(de2bi(x))

rowsএর চেয়ে এক বাইট কম numel, তবে de2biএকটি অনুভূমিক ভেক্টর প্রদান করে, তাই এটি স্থানান্তর করতে হবে। @(x)rows(de2bi(x)')ঠিক তাই 19 বাইট হতে হবে।



2

রেটিনা ,  44  23 বাইট

বড় ইনপুট মানগুলির জন্য চালানোর জন্য খুব বেশি মেমরির প্রয়োজন। অ্যানারিতে রূপান্তরিত হয়, তারপরে বারবার 2 দ্বারা বিভাজক হয়, শূন্যকে আঘাত না করা পর্যন্ত কতবার গণনা করে। বাইট গণনাটি আইএসও 8859-1 এনকোডিং ধরেছে।

.*
$*
+`^(1+)1?\1
$1_
.

এটি অনলাইনে চেষ্টা করুন


1
আমি নিশ্চিত যে এটি বৈধ কিনা। এটি "আপনার সম্ভবত সম্ভবত এটির চেয়ে বেশি মেমরির প্রয়োজন" এর কোনও ক্ষেত্রে নয় তবে এটির জন্য রেটিনা নিজেই পরিচালনা করতে পারে তার চেয়ে বেশি মেমরির প্রয়োজন। বিশেষত, আনারিতে প্রাথমিক রূপান্তরটি রেটিনার বাস্তবায়নের ক্ষেত্রে সীমাবদ্ধতার কারণে 2 ^ 30 এবং ততোধিক ক্রমের ইনপুটগুলিতে ব্যর্থ হবে।
মার্টিন এন্ডার

যদি এটি বৈধ হয়, তবে এটি অনেকটা ছোট করা যেতে পারে: tio.run/nexus/retina#@6@nxaWixaWdEKdhqK1paB9jyKViGM@l9/@/saUhAA
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.