বাইনারি সম্প্রসারণের স্বতন্ত্র খালি খালি উপসর্গগুলির সংখ্যা


19

একটি অনুচ্ছেদে হ'ল কোনও ক্রম যা আপনি অন্য কোনও পরিমাণে অক্ষর মুছে ফেলার মাধ্যমে পেতে পারেন। এর স্বতন্ত্র খালি নয় এমন subsequences 100হয় 0, 1, 00, 10, 100। এর স্বতন্ত্র খালি নয় এমন subsequences 1010হয় 0, 1, 00, 01, 10, 11, 010, 100, 101, 110, 1010

একটি প্রোগ্রাম বা ফাংশন যা একটি ধনাত্মক পূর্ণসংখ্যা দেওয়া লিখুন এন এর বাইনারি সম্প্রসারণের স্বতন্ত্র খালি নয় এমন subsequences সংখ্যা ফেরৎ এন

উদাহরণ: যেহেতু 4হয় 100বাইনারি, এবং আমরা দেখেছি যে এটা উপরোক্ত পাঁচটি স্বতন্ত্র খালি নয় এমন subsequences ছিল, তাই f(4) = 5এন = 1 থেকে শুরু করে ক্রমটি শুরু হয়:

1, 3, 2, 5, 6, 5, 3, 7, 10, 11, 9, 8, 9, 7, 4, 9, 14, 17, 15, 16, 19, 17, 12

যাইহোক, আপনার প্রোগ্রাম কোন কাজ করতে হবে এন <2 50 যেকোন আধুনিক মেশিনে একটি দ্বিতীয় অধীন। কিছু বড় উদাহরণ:

f(1099511627775) = 40
f(1099511627776) = 81
f(911188917558917) = 728765543
f(109260951837875) = 447464738
f(43765644099) = 5941674

4
আমি সময়ের সীমাবদ্ধতার সাথে একমত নই।
এটাকো

1
এটি সত্যিই পরিচিত বলে মনে হয়েছিল, বিশেষ করে প্লটটি দেখার পরে। দেখা যাচ্ছে আমি এই বছরের শুরুর দিকে খুব ঘনিষ্ঠভাবে সম্পর্কিত সিকোয়েন্সে দেখেছি, তবে আমি বাইনারি স্ট্রিং নয়, স্বতন্ত্র বাইনারি সংখ্যার সংখ্যা গণনা করেছি, অনুচ্ছেদগুলি গ্রহণ করার সময় আপনি পাবেন (তাই আমি শীর্ষস্থানীয় শূন্যগুলি ছাড় দিয়েছি)। এমনকি আমি এটি স্যান্ডবক্সও করেছিলাম, তবে ম্যাথ.এসই পোস্টে সমতার কারণে এটি কিছু স্টার্ন-ব্রোকট চ্যালেঞ্জের দ্বিগুণ হয়ে উঠত। যদিও আপনার সিকোয়েন্সের প্লটটি কিছুটা সুন্দর (অর্থাত্ বিশৃঙ্খলাযুক্ত) তবে। :)
মার্টিন ইন্ডার

5
@ATaco সময় সীমাবদ্ধতার একটি ভাল কারণ রয়েছে। একটি দক্ষ অ্যালগরিদম আছে, এবং এটি আকর্ষণীয় এখনও ভাল গল্ফযোগ্য। আমার যদি সময়ের সীমাবদ্ধতা না থাকে তবে আমি অনুভব করি যে প্রায় প্রতিটি উত্তরই সম্ভব সমস্ত সম্ভাব্য অনুচ্ছেদগুলিকে জোর করে তোলে, যা খুব দ্রুত খুব বেশি কাজ করে না। এক অর্থে তারা উত্তর নেই're
orlp

উত্তর:


10

পাইথন 3 , 95 বাইট 83 বাইট

[-১২ বাইটস মিঃ এক্স কোডডারকে ধন্যবাদ :)]

def f(x):
 v=[2,1];c=1
 for i in bin(x)[3:]:k=int(i);c+=v[k];v[1-k]+=v[k]
 return c

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

অ্যালগরিদমের উপর একটি নোট। অ্যালগরিদম একটি নির্দিষ্ট অবস্থানে টিতে বিটের দ্বারা প্রদত্ত অনন্য অনুচ্ছেদগুলিতে বর্ধনকে গণনা করে। প্রথম বিটের জন্য বর্ধিততা সর্বদা ১ টি হয় The অ্যালগরিদম তারপরে বিটস (টি) এর ক্রম ধরে চলে এবং ইনক্রিমেন্ট ভি [এস (টি)] যোগ করে। প্রতিটি পদক্ষেপে, s (t), v [1 - s (t)] এর পরিপূরকের জন্য বর্ধিতকরণ v [1] + v [0] এ আপডেট করা হয়। চূড়ান্ত সংখ্যাটি হ'ল সমস্ত বর্ধনের যোগফল।

এটি ও (লগ 2 (এন)) এ চালানো উচিত, যেখানে এন ইনপুট নম্বর।



8

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

f=(n,r=~(a=[]))=>n<1?~r:f(n/2,r*2-~~a[n&=1],a[n]=r)

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

ফর্ম্যাট এবং মন্তব্য

f = (                      // f is a recursive function taking:
  n,                       //   n = integer
  r = ~(                   //   r = last result, initially set to -1
    a = []                 //   and using a[] = last results for 0 and 1,
  )                        //   implicitly initialized to [0, 0]
) =>                       //
  n < 1 ?                  // if n is less than 1:
    ~r                     //   we're done: return -(r + 1)
  :                        // else:
    f(                     //   do a recursive call with:
      n / 2,               //     n / 2
      r * 2 - ~~a[n &= 1], //     updated result = r * 2 - last result for this binary digit
      a[n] = r             //     update last result for this binary digit
    )                      //   end of recursive call

অ-পুনরাবৃত্ত সংস্করণ, by৩ বাইট

@ThePirateBay কে 3 বাইট সংরক্ষণ করা হয়েছে

s=>[...s.toString(2)].map(l=c=>l[p=r,r=r*2-~~l[c],c]=p,r=1)|r-1

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


আমি মনে করি আপনি খালি অ্যারের পরিবর্তে mapপতাকা ভেরিয়েবলের অভ্যন্তরীণ ফাংশন (প্রথম যুক্তি ) বরাদ্দ করে 3 বাইট সংরক্ষণ করতে পারবেন l

পছন্দ করুন ধন্যবাদ!
আর্নৌল্ড

7

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

f=lambda x,a=1,b=1:x and f(x/2,a+~x%2*b,x%2*a+b)or a+b-2

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

NofP থেকে পদ্ধতি গ্রহণ ।

59 বাইট পুনরাবৃত্তি:

x=input()
v=[1,1]
while x:v[x%2]=sum(v);x/=2
print sum(v)-2

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


সুন্দর অ্যালগরিদম আপনি কেন এটি কাজ করে তার সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা যোগ করতে আপত্তি করবেন?
জোনা

6

জেলি , 10 বাইট

B3;BSṛ¦/’S

এটি @ নফপির আলগোরিদিমটিতে @ xnor এর উন্নতি ব্যবহার করে ।

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

পটভূমি

যাক (ক 1 , ..., একটি এন ) একটি নির্দিষ্ট বাইনারি ক্রম হও। প্রতিটি অ-নেতিবাচক পূর্ণসংখ্যার কে ≤ n এর জন্য , কেকে (ক 1 , ..., একটি কে ) এর অনন্য অনুচ্ছেদের সংখ্যা হিসাবে নির্ধারণ করুন যা খালি হয় বা 1-এ শেষ হয় , z কে যে অনন্য অনুচ্ছেদের সংখ্যা হিসাবে হয় ফাঁকা বা 0 এ শেষ ।

স্পষ্টতই, 0 = z 0 = 1 , খালি অনুক্রমের একমাত্র অনুচ্ছেদটি খালি অনুক্রম।

প্রতিটি সূচক জন্য , এর subsequences মোট সংখ্যা (ক 1 , ..., একটি ) হয় + Z 1 - (বিয়োগ 1 ঘটনার ধ্যাখ্যা করে যে উভয় এবং z- র গণনা খালি ক্রম)। খালি খালি অনুচ্ছেদগুলির মোট সংখ্যা তাই কে + জেড কে - 2 । চ্যালেঞ্জটি o n + z n - 2 গণনা করতে বলে ।

যখনই কে> 0 , আমরা কে এবং জেড কে পুনরাবৃত্তভাবে গণনা করতে পারি । দুটি মামলা রয়েছে:

  • a কে = 1

    z k = z k-1 , যেহেতু (a 1 , ..., a k-1 ) এবং (a 1 , ..., a k-1 , 1) এর একই উপসর্গ রয়েছে যা 0-এ শেষ হয় ।

    প্রত্যেকের জন্য - 1 এর খালি নয় এমন subsequences (ক 1 , ..., একটি ) যে শেষ 1 , আমরা trailing অপসারণ করতে পারেন 1 এক প্রাপ্ত করার K-1 + Z K-1 - 1 subsequences (ক 1 , ..., একটি K-1 ) । উল্টোদিকে, সংযোজন 1 আধুনিক প্রত্যেকটি K-1 + Z K-1 - 1 এক সিকোয়েন্স ফলাফল 1 - সাবেক সিকোয়েন্স। সুতরাং, কে - 1 = ওk-1 + z কে -1 - 1 এবংকে = ও কে -1 + জেড কে -1

  • a কে = 0

    পূর্ববর্তী ক্ষেত্রে একইভাবে, আমরা পুনরাবৃত্ত সূত্রগুলি কে = ও কে -1 এবং জেড কে = জেড কে -1 + ও কে -1 পাই ।

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

B3;BSṛ¦/’S  Main link. Argument: n (positive integer)

B           Binary; convert n to base 2.
 3;         Prepend a 3.
   B        Binary; convert all integers in the resulting array to base 2, mapping
            0 to [0], 1 to [1], and the prepended 3 to [1, 1].
       /    Reduce the resulting array by the quicklink to the left, which will be 
            called with left argument [x, y] (integer pair) and right argument [j] 
            (either [0] or [1]).
      ¦     Sparse application.
    S           Compute the sum (x + y) and...
     ṛ          for each index in the right argument (i.e., for j)...
            replace the element of [x, y] at that index with (x + y).
       ’    Decrement both integers in the resulting pair.
        S   Take the sum.

ওহে ডেনিস, অ্যালগোরিদম কেন কাজ করে সে সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা যোগ করতে আপনি আপত্তি করবেন?
জোনাহ

আমি একটি ব্যাখ্যা যুক্ত করেছি।
ডেনিস

4

05 এ বি 1 ই , 12 বাইট

0¸sbvDO>yǝ}O

এটি অনলাইন চেষ্টা করুন! ব্যাখ্যা: অন্যান্য উত্তরের দ্বারা নির্দেশিত অনুসারে, বাইনারি স্ট্রিংয়ের উপ-সংখ্যার সংখ্যা a..y0যে 1 এ শেষ হবে বাইনারি স্ট্রিংয়ের সংখ্যার সমান a..y, যখন একটিতে শেষ হওয়া 0সংখ্যাটি বাইনারিটির মোট উপসংখ্যার সংখ্যা স্ট্রিং a..y(যা প্রতিটি লাভ একটি 0প্রত্যয়) প্লাস জন্য এক 0নিজেই। অন্যান্য উত্তরের মতো আমি খালি অনুচ্ছেদটি অন্তর্ভুক্ত করি না কারণ এটি প্রাথমিক অবস্থার নির্মাণ বাইট সংরক্ষণ করে।

0¸s             Push [0] under the input
   b            Convert the input to binary
    v     }     Loop over the digits
     D          Duplicate the array
      O         Take the sum
       >        Increment
        yǝ      Replace the index corresponding to the binary digit
           O    Take the sum of the final array

1

জাভা 8, 97 বাইট

n->f(n,1,1)long f(long n,long a,long b){return n>0?f(n/2,a+Math.floorMod(~n,2)*b,n%2*a+b):a+b-2;}

@ এক্সনোরের পাইথন 2 উত্তর বন্দর , যা পরিবর্তে @NofP এর পাইথন 3 উত্তরের একটি উন্নতি ।

এখানে চেষ্টা করুন।


ট্যাগটি উপস্থিত থাকতে পারে এটি খুব ভাল বিষয় , কারণ আমার প্রথমদিকে সমস্ত অনুচ্ছেদটি ব্রুটফোর্ড করার জন্য ছিল:

import java.util.*;n->p(n.toString(n,2)).size()-1;Set p(String s){Set r=new HashSet();r.add("");if(s.isEmpty())return r;Set q=p(s.substring(1));r.addAll(q);for(Object o:q)r.add(""+s.charAt(0)+o);return r;}

এখানে চেষ্টা করুন।

এটিও কাজ করেছে, তবে শেষ তিনটি পরীক্ষার ক্ষেত্রে এটি দীর্ঘ সময় নিয়েছে। এটি আর দীর্ঘ ( 208 204 বাইট ) উল্লেখ না করা ।


1

6502 মেশিন কোড (সি 64), 321 বাইট

00 C0 20 FD AE A2 00 9D 4F C1 E8 20 73 00 90 F7 9D 4F C1 A0 FF C8 B9 4F C1 D0
FA A2 15 CA 88 30 0A B9 4F C1 29 0F 9D 4F C1 10 F2 A9 00 9D 4F C1 CA 10 F8 A9
00 A0 07 99 64 C1 88 10 FA A0 40 A2 6C 18 BD E4 C0 90 02 09 10 4A 9D E4 C0 E8
10 F2 A2 07 7E 64 C1 CA 10 FA 88 F0 13 A2 13 BD 50 C1 C9 08 30 05 E9 03 9D 50
C1 CA 10 F1 30 D1 A2 0F A9 00 9D 3F C1 CA D0 FA A9 01 8D 3F C1 8D 47 C1 A2 08
CA BD 64 C1 F0 FA A0 09 1E 64 C1 88 90 FA B0 0A CA 30 28 A0 08 1E 64 C1 90 04
A9 47 B0 02 A9 4F 8D AF C0 86 FE A2 F8 18 BD 47 C0 7D 4F C0 9D 47 C0 E8 D0 F4
A6 FE 88 D0 DC F0 D5 A2 F8 BD 47 C0 7D 4F C0 9D 6C C0 E8 D0 F4 AD 64 C1 E9 01
8D 64 C1 A2 F9 BD 6C C0 E9 00 9D 6C C0 E8 D0 F5 A0 15 A9 00 99 4E C1 88 D0 FA
A0 40 A2 13 BD 50 C1 C9 05 30 05 69 02 9D 50 C1 CA 10 F1 0E 64 C1 A2 F9 3E 6C
C0 E8 D0 FA A2 13 BD 50 C1 2A C9 10 29 0F 9D 50 C1 CA 10 F2 88 D0 D1 E0 14 F0
06 E8 BD 4F C1 F0 F6 09 30 99 4F C1 C8 E8 E0 15 F0 05 BD 4F C1 90 F0 A9 00 99
4F C1 A9 4F A0 C1 4C 1E AB

অনলাইন ডেমো

ত্রুটি যাচাইয়ের সাথে অনলাইন ডেমো (346 বাইট)

ব্যবহার: sys49152,[n] যেমন sys49152,911188917558917

সময় সীমাবদ্ধতা এবং পরীক্ষার ক্ষেত্রে 64৪ বিট সংখ্যা গণনা করার জন্য সমাধানগুলির প্রয়োজন হয়, সুতরাং সি 64৪ " আধুনিক মেশিন " হিসাবে যোগ্যতা প্রমাণ করার সময় ;)

অবশ্যই, এটি বেশ কিছুটা কোডের প্রয়োজন, ওএস 16 বিট এর চেয়েও বড় সংখ্যার জন্য কিছু সরবরাহ করে না । এখানে খোঁড়া অংশ: এটি NofP এর অ্যালগরিদম শ্বাসের আরও একটি বাস্তবায়ন (কিছুটা সংশোধিত) । xnor এর উন্নত রূপটি । ধারণার জন্য ধন্যবাদ;)


ব্যাখ্যা

এখানে অ্যালগরিদম করার জন্য প্রাসঙ্গিক অংশের একটি মন্তব্য বিযুক্ত করার তালিকা রয়েছে:

.C:c06c  A2 0F       LDX #$0F           ; 15 bytes to clear
.C:c06e  A9 00       LDA #$00
.C:c070   .clearloop:
.C:c070  9D 3F C1    STA .num_a,X
.C:c073  CA          DEX
.C:c074  D0 FA       BNE .clearloop
.C:c076  A9 01       LDA #$01           ; initialize num_a and num_b
.C:c078  8D 3F C1    STA .num_a         ; to 1
.C:c07b  8D 47 C1    STA .num_b
.C:c07e  A2 08       LDX #$08           ; 8 bytes of input to check,
.C:c080   .findmsb:                     ; start at most significant
.C:c080  CA          DEX
.C:c081  BD 64 C1    LDA .nc_num,X
.C:c084  F0 FA       BEQ .findmsb       ; repeat until non-0 byte found
.C:c086  A0 09       LDY #$09           ; 8 bits to check (+1 for pre dec)
.C:c088   .findbit:
.C:c088  1E 64 C1    ASL .nc_num,X      ; shift left, highest bit to carry
.C:c08b  88          DEY
.C:c08c  90 FA       BCC .findbit       ; bit was zero -> repeat
.C:c08e  B0 0A       BCS .loopentry     ; jump into calculation loop
.C:c090   .mainloop:
.C:c090  CA          DEX                ; next byte
.C:c091  30 28       BMI .done          ; index -1? -> done calculating
.C:c093  A0 08       LDY #$08           ; 8 bits to check
.C:c095   .bitloop:
.C:c095  1E 64 C1    ASL .nc_num,X      ; shift left, highest bit to carry
.C:c098  90 04       BCC .tgt_b         ; if 0, store addition result in num_b
.C:c09a   .loopentry:
.C:c09a  A9 47       LDA #$47
.C:c09c  B0 02       BCS .tgt_a         ; ... else store in num_a ...
.C:c09e   .tgt_b:
.C:c09e  A9 4F       LDA #$4F
.C:c0a0   .tgt_a:
.C:c0a0  8D AF C0    STA $C0AF          ; ... using self-modification.
.C:c0a3  86 FE       STX $FE            ; save byte index
.C:c0a5  A2 F8       LDX #$F8           ; index for adding
.C:c0a7  18          CLC
.C:c0a8   .addloop:
.C:c0a8  BD 47 C0    LDA $C047,X        ; load byte from num_a
.C:c0ab  7D 4F C0    ADC $C04F,X        ; add byte from num_b
.C:c0ae  9D 47 C0    STA $C047,X        ; store to num_a or num_b
.C:c0b1  E8          INX                ; next index
.C:c0b2  D0 F4       BNE .addloop       ; done if index overflown
.C:c0b4  A6 FE       LDX $FE            ; restore byte index
.C:c0b6  88          DEY                ; decrement bit index
.C:c0b7  D0 DC       BNE .bitloop       ; bits left in current byte -> repeat
.C:c0b9  F0 D5       BEQ .mainloop      ; else repeat main loop
.C:c0bb   .done:
.C:c0bb  A2 F8       LDX #$F8           ; index for adding
.C:c0bd   .addloop2:
.C:c0bd  BD 47 C0    LDA $C047,X        ; load byte from num_a
.C:c0c0  7D 4F C0    ADC $C04F,X        ; add byte from num_b
.C:c0c3  9D 6C C0    STA $C06C,X        ; store to nc_num (result)
.C:c0c6  E8          INX                ; next index
.C:c0c7  D0 F4       BNE .addloop2      ; done if index overflown
.C:c0c9  AD 64 C1    LDA .nc_num        ; load least significant result byte
.C:c0cc  E9 01       SBC #$01           ; subtract 2 (1 + negated carry)
.C:c0ce  8D 64 C1    STA .nc_num        ; store least significant result byte
.C:c0d1  A2 F9       LDX #$F9           ; index for subtract
.C:c0d3   .subloop:
.C:c0d3  BD 6C C0    LDA $C06C,X        ; subtract 0 from all other bytes
.C:c0d6  E9 00       SBC #$00           ; for handling carry if necessary
.C:c0d8  9D 6C C0    STA $C06C,X
.C:c0db  E8          INX
.C:c0dc  D0 F5       BNE .subloop       

বাকীটি হ'ল ইনপুট / আউটপুট এবং স্ট্রিং এবং bit৪ বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার (লিটল এন্ডিয়ান) মধ্যে কিছু ডাবল ডাবল অ্যালগরিদম ব্যবহার করে রূপান্তর। আপনি যদি আগ্রহী হন তবে ত্রুটি-যাচাইয়ের সাথে সংস্করণটির পুরো সমাবেশ উত্স এখানে রয়েছে - "গল্ফড" সংস্করণটি "গল্ফ" শাখায় রয়েছে।

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