বাইনারি কাউন্টডাউন দৈর্ঘ্য


18

অনন্ত থেকে গণনা দ্বারা অনুপ্রাণিত

একটি অ-নেতিবাচক পূর্ণসংখ্যা দেওয়া হয়েছে N, 0 এ পৌঁছানোর জন্য নিম্নলিখিত পদক্ষেপগুলির পুনরাবৃত্তির সংখ্যা আউটপুট করুন:

  1. Nবাইনারি রূপান্তর করুন ( 4812390 -> 10010010110111001100110)
  2. প্রতিটি বিট ফ্লিপ ( 10010010110111001100110 -> 01101101001000110011001)
  3. নেতৃস্থানীয় শূন্যগুলি ট্রিম করুন ( 01101101001000110011001 -> 1101101001000110011001)
  4. দশমিক ( 1101101001000110011001 -> 3576217) এ ফিরে রূপান্তর করুন

বিধি

  • ইনপুট এবং আউটপুট যে কোনও দ্ব্যর্থহীন, ধারাবাহিক বিন্যাসে থাকতে পারে
  • ইনপুটটি আপনার ভাষার জন্য স্থানীয় প্রতিনিধিত্বযোগ্য পূর্ণসংখ্যার পরিসরের মধ্যে থাকবে (যদি আপনার ভাষা নির্বিচারে-বৃহত পূর্ণসংখ্যার সমর্থন করে তবে কোনও সীমাবদ্ধ নেই)

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

0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32

এই ক্রমটি OEIS এ A005811


6
পদক্ষেপ 3 কোনও উপকারে নেই
edc65

@ edc65 দেখে মনে হচ্ছে আপনার অ্যালগরিদম কীভাবে বিছানো হয়েছে তার উপর নির্ভর করে আপনি পদক্ষেপ 3 বা 4 য় পদক্ষেপ করতে পারেন
ব্রায়ান জে

@ edc65 হয়তো আপনার জন্য এটি কোনও কাজের নয়। একটি সাধারণ বিপরীতমুখী অপারেটর আপনার জন্য নেতৃস্থানীয় শূন্যগুলি ট্রিম করে না। ~(~a) == a
পোকে

@ পোকে বিটওয়াইস নেতৃস্থানীয় জিরো (এবং সুনির্দিষ্ট নির্ভুলতার পূর্ণসংখ্যার ভাষায় এদের একটি অসীম পরিমাণ) সহ বাইনারি উপস্থাপনার সমস্ত বিট উল্টায় না । এটি দ্বিতীয় ধাপ 2 এর সমতুল্য নয়
ডেনিস

@ পোকে একটি সাধারণ ইনভার্স অপারেশন পদক্ষেপগুলি প্রয়োগ করার চেয়ে পৃথক 1..4। আপনি যদি এই পদক্ষেপগুলি প্রয়োগ করতে চান তবে the ধাপটি কোনও কাজে আসবে না, কারণ ধাপ ২-এ উল্টানো (এটি প্রদর্শিত হিসাবে) নেতৃস্থানীয় 0 টি পরিবর্তন করে না change ধাপ 2 যদি না নেতৃস্থানীয় 1s নেতৃস্থানীয় 0 সেঃ পরিবর্তন করেন, তারপর obviuosly আপনি নেতৃস্থানীয় অপসারণ করতে হবে 1s , না নেতৃস্থানীয় পদক্ষেপ 3 0 সেঃ
edc65

উত্তর:


14

জেলি , 6 4 বাইট

^HBS

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

পটভূমি

যাক এন একটি অ-নেতিবাচক পূর্ণসংখ্যা হতে।

বৈশিষ্টটিতে বর্ণিত প্রক্রিয়াটির 2 এবং 3 পদক্ষেপটি বিকল্পভাবে সমস্ত নেতৃস্থানীয় 1 টি অপসারণ এবং অবশিষ্ট বিটগুলি টগলিং হিসাবে বলা যেতে পারে ।

এর অর্থ এই যে আমরা, প্রতিটি পুনরাবৃত্তির সংলগ্ন ও সমান বাইনারি ডিজিটের ঠিক একটি গোষ্ঠীর সরিয়ে ফেলবো এত বাইনারি কাউন্টডাউন দৈর্ঘ্য এন শুধু বাইনারি উপস্থাপনা এই দলের সংখ্যা এন । এই চ্যালেঞ্জের উদ্দেশ্যে, কোনও সংখ্যা নেই বলে 0 মনে করুন ।

জন্য এন = 8675309 বাইনারি মধ্যে নিম্নরূপ প্রক্রিয়া সৌন্দর্য।

100001000101111111101101
 11110111010000000010010
     1000101111111101101
      111010000000010010
         101111111101101
          10000000010010
           1111111101101
                   10010
                    1101
                      10
                       1
                       0

এই গ্রুপগুলি গণনা করার পরিবর্তে (যা প্রান্তের ক্ষেত্রে 0 ব্যর্থ হবে ), আমরা নিম্নলিখিতটি করি do

n এবং n: 2 এর নিম্নলিখিত বাইনারি উপস্থাপনা রয়েছে।

n   = 8675309 = 100001000101111111101101_2
n:2 = 4337654 =  10000100010111111110110_2

মনে রাখবেন যে এন: 2 এর বাইনারি উপস্থাপনাটি কেবল n 's, একটি বিটকে বামে স্থানান্তরিত।

যদি আমরা এক্স ও এন এবং এন: 2 , আমরা আলাদা আলাদা সংখ্যার প্রতিটি জোড়ের জন্য একটি 1 (এমএসবি) এবং অতিরিক্ত 1 পেয়ে যাব । গ্রুপগুলির সংখ্যা এইভাবে n n n: 2 তে সেট বিটের সংখ্যার সমান ।

কিভাবে এটা কাজ করে

^HBS  Main link. Argument: n

 H    Halve; yield n:2.
^     XOR n with n:2.
  B   Convert the result to binary.
   S  Compute the sum of the resulting binary digits.

1
অ্যামেজিং! একটি সম্পূর্ণ ভিন্ন যুক্তি
edc65

9

পাইথন 2, 30 বাইট

lambda n:bin(n^n/2).count('1')

আইডিয়নে এটি পরীক্ষা করুন ।

পটভূমি

যাক এন একটি অ-নেতিবাচক পূর্ণসংখ্যা হতে।

বৈশিষ্টটিতে বর্ণিত প্রক্রিয়াটির 2 এবং 3 পদক্ষেপটি বিকল্পভাবে সমস্ত নেতৃস্থানীয় 1 টি অপসারণ এবং অবশিষ্ট বিটগুলি টগলিং হিসাবে বলা যেতে পারে ।

এর অর্থ এই যে আমরা, প্রতিটি পুনরাবৃত্তির সংলগ্ন ও সমান বাইনারি ডিজিটের ঠিক একটি গোষ্ঠীর সরিয়ে ফেলবো এত বাইনারি কাউন্টডাউন দৈর্ঘ্য এন শুধু বাইনারি উপস্থাপনা এই দলের সংখ্যা এন । এই চ্যালেঞ্জের উদ্দেশ্যে, কোনও সংখ্যা নেই বলে 0 মনে করুন ।

জন্য এন = 8675309 বাইনারি মধ্যে নিম্নরূপ প্রক্রিয়া সৌন্দর্য।

100001000101111111101101
 11110111010000000010010
     1000101111111101101
      111010000000010010
         101111111101101
          10000000010010
           1111111101101
                   10010
                    1101
                      10
                       1
                       0

এই গ্রুপগুলি গণনা করার পরিবর্তে (যা প্রান্তের ক্ষেত্রে 0 ব্যর্থ হবে ), আমরা নিম্নলিখিতটি করি do

n এবং n: 2 এর নিম্নলিখিত বাইনারি উপস্থাপনা রয়েছে।

n   = 8675309 = 100001000101111111101101_2
n:2 = 4337654 =  10000100010111111110110_2

মনে রাখবেন যে এন: 2 এর বাইনারি উপস্থাপনাটি কেবল n 's, একটি বিটকে বামে স্থানান্তরিত।

যদি আমরা এক্স ও এন এবং এন: 2 , আমরা আলাদা আলাদা সংখ্যার প্রতিটি জোড়ের জন্য একটি 1 (এমএসবি) এবং অতিরিক্ত 1 পেয়ে যাব । গ্রুপগুলির সংখ্যা এইভাবে n n n: 2 তে সেট বিটের সংখ্যার সমান ।


9

পাইথন 2, 29 বাইট

f=lambda n:n and-n%4/2+f(n/2)

বাইনারি প্রসারণে 0 এবং 1 এর মধ্যে বিকল্পগুলির সংখ্যা গণনা করে, শীর্ষস্থানীয় 1টিকে বিকল্প হিসাবে গণনা করে। শেষের দুটি বাইনারি অঙ্ক পৃথক কিনা তা যাচাই করে তা না করে শেষ সংখ্যার সাথে পুনরাবৃত্তি করে। শেষ দুটি অঙ্ক n%41 বা 2 হুবহু আলাদা হয়, যা হিসাবে পরীক্ষা করা যেতে পারে -n%4/2


6

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

f=n=>n&&(n^(n>>=1))%2+f(n)

0 এবং 1 এর মধ্যে রূপান্তর গণনা করে কাজ করে কেবল 31 বিট পর্যন্ত কাজ করে। 53 বিট সমর্থন 29 বাইট:

f=n=>1<=n&&(n%2^n/2%2)+f(n/2)


4

05 এ বি 1 ই , 7 5 বাইট

ডেনিসকে ধন্যবাদ 2 বাইট সংরক্ষণ করা ।

b0ÛÔg

0 এর প্রান্তের কেস ব্যতীত এটি 3 বাইট হতে পারে bÔg

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

ব্যাখ্যা

b      # convert to binary
 0Û    # trim off leading zeroes
   Ô   # remove adjacent duplicates
    g  # length

3

সিজেম , 14 বাইট

ri0{2b:!2bj)}j

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

ri      e# read integer
0       e# value for terminal case
{       e# recursive function
  2b    e#   create binary representation with no leading zeros
  :!    e#   flip bits
  2b    e#   convert binary back to integer
  j     e#   recursive call
  )     e#   increment from 0 on the way up
}j      e# end

মূলত আমার অন্য প্রশ্নের জবাব দেওয়া যায় না।


3

জাভা 7,112 108 100 90 73 বাইট

int c(int i){int l=1,j=i;for(;(j=j/2)>0;l*=2);return i<1?0:1+c(2*l-1-i);}

মৌলিক ধারণা

 Lets take an no 10110(21)
 then you do set all bits in no 21 and you will get 11111
 and after that you would subtract the original number from 11111.
 You will get 01001 and loop it until you will get 0

j=j/2সংক্ষিপ্ত করা যেতে পারে j/=2। তা ছাড়া দারুণ উত্তর!
কেভিন ক্রুইজসেন

হুম .. @ নীলের জাভাস্ক্রিপ্টের উত্তর থেকে একটি বন্দর যদিও কম ছোট: int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}( 47 বাইট )। আমি এখনও আপনার বর্তমান উত্তরটি রেখে যাব কারণ এটি আরও আসল, এবং অন্যান্য ব্যবহারকারীদের বন্দরগুলি মূলটির সম্পূর্ণ বিপরীত। :)
কেভিন ক্রুইজসেন

3

জে, 14 বাইট

**1+/@,2~:/\#:

বিশেষ ক্ষেত্রে কে এন = 0 এর জন্য 0 ফেরত দিয়ে এন এর বাইনারি অঙ্কগুলিতে রানের সংখ্যা গণনা করে ।

ব্যবহার

   f =: **1+/@,2~:/\#:
   (,.f"0) 0 1 42 97 170 255 682 8675309 4812390 178956970 2863311530
         0  0
         1  1
        42  6
        97  3
       170  8
       255  1
       682 10
   8675309 11
   4812390 14
 178956970 28
2863311530 32

ব্যাখ্যা

**1+/@,2~:/\#:  Input: integer n
            #:  Get the binary digits of n
       2   \    For each overlapping sublist of size 2
        ~:/       Reduce by not-equals
  1   ,         Prepend a 1
   +/@          Reduce by addition
*               Sign(n), returns 0 for n = 0 else 1
 *              Multiply with the previous sum and return

3

সিজেম , 11 10 বাইট

একটি বাইট সংরক্ষণ করার জন্য @ ডেনিসকে ধন্যবাদ!

ri_2be`,e&

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

ব্যাখ্যা

ri            #e Read as integer
              #e STACK: 97
  _           #e Duplicate
              #e STACK: 97, 97
   2b         #e Convert to binary
              #e STACK: 97, [1 1 0 0 0 0 1]
     e`       #e Run-length encoding
              #e STACK: 97, [[2 1] [4 0] [1 1]]
       ,      #e Length
              #e STACK: 97, 3
        e&    #e Return first value if 0, or else the second value
              #e STACK: 3

1
e&(যৌক্তিক ও) একটি বাইট ওভার সাশ্রয় করে \g*
ডেনিস

@ ডেনিস ধন্যবাদ! এটি সিজোমের যৌক্তিক ও কীভাবে কাজ করে তা কার্যকর, আমার কোনও ধারণা ছিল না
লুইস মেন্ডো

2

রেকেট 349 বাইট

(define(h s)(apply string(map(λ(x)(if(eq? x #\0)#\1 #\0))(string->list s))))(define(g s)(let*
((l(string-length s))(k(for/list((i s)(n l)#:final(not(equal? i #\0)))n)))(substring s(last k))))
(define(f n)(if(= 0 n)0(begin(let loop((n n)(c 1))(define m(string->number(string-append "#b"
(g(h(number->string n 2))))))(if(> m 0)(loop m(add1 c))c))))

Ungolfed:

(define (invertBinary s)
  (apply string
         (map
          (λ(x)(if(eq? x #\0)#\1 #\0))
          (string->list s))))

(define (trimLeading0s s)
  (let* ((l (string-length s))
         (k (for/list ((i s)
                       (n l)
                       #:final (not(equal? i #\0)))
              n)))
    (substring s (last k))))

(define (f n)
  (if (= 0 n) 0
      (begin
        (let loop ((n n)
                   (c 1))
          (define m 
            (string->number
             (string-append
              "#b"
              (trimLeading0s
               (invertBinary
                (number->string n 2))))))

          (if (> m 0)
              (loop m (add1 c))
              c)))))

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

(f 0)
(f 1)
(f 42)
(f 97)
(f 170)
(f 255)
(f 682)
(f 8675309)
(f 4812390)
(f 178956970)
(f 2863311530)

আউটপুট:

0
1
6
3
8
1
10
11
14
28
32

আপনি পরিবর্তন করে 2 টি বাইট tlএবং ib1-বাইট নাম সংরক্ষণ করতে পারবেন ।
মেগো

সম্পন্ন. পরামর্শের জন্য ধন্যবাদ.
rnso

2

এমএটিএল , 7 বাইট

BY'nwa*

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

ব্যাখ্যা

          % Implicit input, for example 97
          % STACK: 97
B         % Convert to binary
          % STACK: [1 1 0 0 0 0 1]
 Y'       % Run-length encoding
          % STACK: [1 0 1], [2 4 1]
   n      % Number of elements
          % STACK: [1 0 1], 3
    w     % Swap
          % STACK: 3, [1 0 1]
     a    % Any: gives 1 if any element is nonzero
          % STACK: 3, 1
      *   % Multiply
          % STACK: 3
          % Implicit display

2

ভিম, 62 59 বাইট

-৩ বাইটস ডিজেএমসিএমহেমকে ধন্যবাদ

C0
<C-r>=pri<Tab>'%b',<C-r>")
<Esc>0qqC<C-r>=tr(@",'01','10')
<Esc>:s/^0\+
k<C-a>j@qq@q

অপ্রিন্টযোগ্য অক্ষর অক্ষর সহ এখানে এক্সএক্সডি আউটপুট রয়েছে:

0000000: 4330 0d12 3d70 7269 0927 2562 272c 1222  C0..=pri.'%b',."
0000010: 290d 1b30 7171 4312 3d74 7228 4022 2c27  )..0qqC.=tr(@",'
0000020: 3031 272c 2731 3027 290d 1b3a 732f 5e30  01','10')..:s/^0
0000030: 5c2b 0d6b 016a 4071 7140 71              \+.k.j@qq@q

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

ব্যাখ্যা

C                                   " Delete the number (it goes in @")
0<CR>                               " Print 0 (our counter) and a carriage return
<C-r>=pri<Tab>'%b',<C-r>")<CR><Esc> " Use `printf()` to insert the number as base 2
0qq                                 " Return to column 0, start recording a macro
  C<C-r>=tr(@",'01','10')<CR><Esc>  "   Replace 0s with 1s and vice versa
  :s/^0\+<CR>                       "   Delete leading 0s
  k<C-a>                            "   Increment the number on the line above
  j                                 "   Return to the previous line
  @q                                "   Invoke macro recursively
q@q                                 " Stop recording and invoke macro

1
নিস! কিছু টিপস: :s/^0*এটির চেয়ে এক বাইট কম :s/^0\+, এবং আপনি যখন "ইভাল" রেজিস্টারে থাকবেন, আপনি কেবল pr<S-tab>'%b',<C-r>")স্বয়ংসম্পূর্ণতার জন্য এটি করতে পারেন । (4 বাইট সংরক্ষণ)
DJMcMayhem

ওহ, স্বতঃসিদ্ধ পরামর্শের জন্য ধন্যবাদ! আমি :s/^0*এটি ব্যবহার করতে পারছি না কারণ এটি একটি খালি লাইনের সাথে মেলে এবং পুনরাবৃত্তির ম্যাক্রো থেকে বাঁচতে খালি খালি লাইনের জন্য এটি ব্যর্থ হওয়া আমার প্রয়োজন।
জর্দান

1

রুবি, 26 বাইট

f=->n{n<1?0:-n%4/2+f[n/2]}

এক্সনোর পাইথন উত্তর দ্বারা অনুপ্রাণিত।


0

পিএইচপি, 64 বাইট

আমার কাউন্টডাউন সমাধানের উপর ভিত্তি করে

for($n=$argv[1];$n;print 1)$n=bindec(strtr(decbin($n),"01",10));

1চরিত্রের বারগুলি মুদ্রণ করে k, যেখানে kপুনরাবৃত্তির সংখ্যা।


পূর্ণসংখ্যার আউটপুট জন্য +4 বাইট: (এর জন্য খালি আউটপুট 0)

for($n=$argv[1];$n;$i++)$n=bindec(strtr(decbin($n),"01",10));echo$i;

0

জাভাস্ক্রিপ্ট (ES6), 44

পুনরাবৃত্তি ফাংশন

জাভাস্ক্রিপ্ট ইতিবাচক পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ, 31 বিট:

f=(a,s=0)=>a?f((-1>>>Math.clz32(a))-a,s+1):s

53 টি উল্লেখযোগ্য বিট - 59 বাইট পর্যন্ত ডাবল স্পষ্টতা নম্বর পরিচালনা করা

F=(a,s=0)=>a?F('0b'+a.toString(2).replace(/./g,1)-a,s+1):s

অন্য উপায়ে: @ ডেনিস দ্বারা আশ্চর্যজনক অ্যালগরিদম ব্যবহার করে, নন রিকার্সিভ ফাংশন 53 বিট, 43 বাইট পরিচালনা করে :

a=>a&&a.toString(2).match(/(.)\1*/g).length

0

পিএইচপি, 51 বাইট

<?=preg_match_all('/(1+|0+)/',decbin($argv[1])?:o);

1 বা 0 রানের সংখ্যা গণনা করার জন্য একটি রেজেক্স ব্যবহার করে দুর্ভাগ্যক্রমে এর ইনপুটটির 0জন্য 3 টি অতিরিক্ত বাইটের প্রয়োজন হয় (এবং একটি বিজ্ঞপ্তি দেয়) a


ক) oনোটিশ এড়ানোর জন্য একটি সংখ্যা> 1 ব্যবহার করুন । খ) আপনি -Fপতাকাটি দিয়ে এবং এর $argnপরিবর্তে 3 বাইট সংরক্ষণ করতে পারেন $argv[1]। গ) /1+|0+/রেজেক্সের জন্য যথেষ্ট হওয়া উচিত।
তিতাস


0

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

@(x)(sum(dec2bin(bitxor(x,idivide(x,2)))=='1'))

OEIS এন্ট্রি মতে, মান আমরা জন্য এই চ্যালেঞ্জ সমাধান খুঁজছি হয় এছাড়াও সংখ্যার সমান 1দেওয়া পূর্ণসংখ্যা জন্য গ্রে কোডে গুলি।

উইকিপিডিয়া আমাকে বলেছে ধূসর কোডটি x ^ (x >> 1) হিসাবে গণনা করা যায়, সুতরাং উপরের ফাংশনে আমি গ্রে কোডটি গণনা করি, এটি বাইনারি স্ট্রিংয়ে রূপান্তর করি এবং সেই স্ট্রিংয়ের কতগুলি সংখ্যা গণনা করি 1


0

জাভা 7, 64 বাইট

long g(Long n){return n.toString(n,2).split("0+").length*2-n%2;}

আমি এই ভালো উত্তর এক পোর্ট দ্বারা প্রহৃত যেতে পারে জানি, কিন্তু আমি চ্যাটে এটা নিয়ে এসেছেন, আর আমি করতে পারছি না না তা পোস্ট পর অকর্মা এটা সম্পর্কে কিছু বলেন :)


0

সি, 76 বাইট

unsigned n,m,i;f(x){for(i=0;x;x^=m-1,i++)for(n=x,m=2;n>>=1;m<<=1);return i;}

সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে (যতটা আমি স্বাক্ষরবিহীন বা শেষ পরীক্ষার শব্দটি অন্তর্ভুক্ত করতে চাই না) ...


0

বাশ, 57 বাইট

প্যাকেজগুলি: মূল ইউটিলিটিস, গ্রেপ, সেড, ভিম (জন্য xxd)

ধরুন নম্বরটি বাইনারি ফরম্যাটে দেওয়া হয়েছে। যে কোনও দৈর্ঘ্য গ্রহণযোগ্য :)

xxd -b -c1|cut -d" " -f2|sed s/^0*//|grep -o .|uniq|wc -l


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.