জেকেন্ডারফের প্রতিনিধিত্বের অধীনে সংমিশ্রণ


14

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


এফ যাক এন হতে এন ফিবানচি সংখ্যা যেখানে -th

এফ 1 = 1,
এফ 2 = 2 এবং
সকল কে > 2, এফ কে = এফ কে - 1 + এফ কে - 2

Zeckendorf উপস্থাপনা জেড ( এন একটি অ-নেতিবাচক পূর্ণসংখ্যা এর) এন যেমন যে ধনাত্মক পূর্ণসংখ্যা একটি সেট

n = Σ i ∈ Z ( n ) F i   এবং
i ∈ Z ( n ) i + 1 ∉ Z ( n )।

(prosa মধ্যে: একটি সংখ্যা Zeckendorf উপস্থাপনা এন ধনাত্মক পূর্ণসংখ্যা একটি সেট যেমন যে এই সূচকের জন্য ফিবানচি সংখ্যার পর্যন্ত সমষ্টি এন এবং কোন দুই সংলগ্ন পূর্ণসংখ্যার সেট অংশ)

উল্লেখযোগ্যভাবে, জেকেন্ডারফের উপস্থাপনাটি অনন্য। জেকেন্ডারফের উপস্থাপনের জন্য এখানে কয়েকটি উদাহরণ দেওয়া হয়েছে:

জেড (0) = ∅ (খালি সেট থাকে)
টু Z (1) = {1}
জেড (2) = {2}
জেড (3) = {3} ({1, 2} না 3 Zeckendorf উপস্থাপনা)
টু Z (10) = {5, 2}
জেড (100) = {3, 5, 10

এই চ্যালেঞ্জে, জেকেন্ডারফের উপস্থাপনাগুলি বিট সেট হিসাবে এনকোড করা হয় যেখানে 1সেটটির অংশ হলে কমপক্ষে উল্লেখযোগ্য বিট উপস্থাপন করে etc. ইত্যাদি You

আপনার কাজটি জেড ( এন + মি ) প্রদত্ত জেড ( এন ) এবং জেড ( এম ) গণনা করা । অক্টেটস মধ্যে সংক্ষিপ্ত দৈর্ঘ্যের সাথে সমাধান জিততে পারে।

আপনি এখানে এএনএসআই সি-তে লিখিত একটি রেফারেন্স বাস্তবায়ন পেতে পারেন । এটি জেকেন্ডারফের উপস্থাপনা তৈরি করতে বা তার জেকেন্ডারফের উপস্থাপনা থেকে একটি সংখ্যা গণনা করতেও ব্যবহার করা যেতে পারে।

এখানে নমুনা ইনপুট এবং আউটপুটগুলির কয়েকটি জোড়া রয়েছে, যেখানে প্রথম দুটি কলামে ইনপুট থাকে এবং তৃতীয় কলামে আউটপুট থাকে:

73865           9077257         9478805
139808          287648018       287965250
34              279004309       279004425
139940          68437025        69241105
272794768       1051152         273846948
16405           78284865        83888256
9576577         4718601         19013770
269128740       591914          270574722
8410276         2768969         11184785
16384           340             16724

4
আপনি কি দয়া করে ইনপুট / আউটপুটটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
flawr

@ ফ্লোয়ার দয়া করে প্রদত্ত রেফারেন্স বাস্তবায়নটি দেখুন। আপনি নিজের নিজস্ব নমুনা ইনপুট তৈরি করতে এটি ব্যবহার করতে পারেন।
এফইউজেডএক্সএল

3
আমি খুশি হব যদি আপনি এখানে যা চান ঠিক তেমন নথিপত্র দিতে পারেন এবং আমি যেমন কিছু উদাহরণ সরবরাহ করতে পারি তবে সম্ভবত অন্যরাও সি তে সাবলীল নন
flawr

আমি স্বতন্ত্রতা যুক্তির সাথে একমত নই। যেহেতু ফিবোনাচি ক্রম 1, 1, 2 দিয়ে শুরু হয় আপনি পরিষ্কারভাবে 3 কে F0 + F2 = 1 + 2 = 3 এ বিভক্ত করতে পারেন F0 এবং F2 সংলগ্ন নয়
অরল্প

1
@orlp এখানে সংজ্ঞায়িত ফিবোনাচি ক্রমটি F1 = 1 এবং F2 = 2 দিয়ে শুরু হয়। সুতরাং আমি যেভাবে এটি পড়ছি, আপনার সংজ্ঞা থেকে F0 এখানে ব্যবহৃত ক্রমের অংশ নয়।
রেটো কোরাদি

উত্তর:


5

কে (এনএনজি / কে) , 45 43 42 41 বাইট

{2/<':(+/F@&+/'|2\x){y!x}\|F:64(+':1,)/0}

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

@ বুবলারের অ্যালগরিদম

{ } যুক্তি দিয়ে ফাংশন x

64( )/0 প্রাথমিক মান হিসাবে 0 ব্যবহার করে 64 বার করুন:

  • 1, প্রিপেন্ড 1

  • +': প্রতিটি পূর্ব যুক্ত করুন (প্রথম উপাদান অক্ষত রেখে দিন)

F:F"ফাইবোনাকি সিকোয়েন্স" এর জন্য বরাদ্দ করুন

| বিপরীত

(.. ){y!x}\.. বাম দিক দিয়ে মান দিয়ে শুরু করে, ডানদিকে তালিকার জন্য কমপ্যুটিভ বাম অনুসারে (বাম থেকে ডান) গণনা করুন। বাম দিকের মানটি হল জেকেন্ডেরফের প্রতিনিধিত্ব ছাড়াই ইনপুটগুলির সরল সমষ্টি:

  • 2\xবাইনারি ইনপুট এনকোড। এটি একটি নিট বাই বাই ম্যাট্রিক্স হবে

  • | বিপরীত

  • +/' প্রতিটি যোগফল

  • &1s কোথায়? - সূচকের তালিকা। যদি কোনও 2 টি থাকে তবে সংশ্লিষ্ট সূচকটি দু'বার পুনরাবৃত্তি হয়।

  • F@ অ্যারে ইনডেক্সিং F

  • +/ সমষ্টি

<': প্রতিটি পূর্বের চেয়ে কম (ফলাফলের প্রথমটি সর্বদা মিথ্যা হবে)

2/ বাইনারি ডিকোড


10

সিজেম, 76 74 70 63 59 বাইট

2q~{32{2\#I&},}fI+32_,*{WUer$Kf-[UU]/[-2X]*2,/2a*Kf+}fKf#1b

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

ধারণা

আমরা প্রশ্নের ক্রমটির একটি সামান্য প্রকরণ নির্ধারণ করে শুরু করি:

জি -2 = 0
জি -1 = 1
জি কে = জি কে -1 + জি কে -2 যখনই কে একটি নেতিবাচক

এইভাবে, বিট অ্যারে ইনপুট বা আউটপুট এর বিট 0 (এলএসবি) ফিবোনাচি নম্বর জি 0 এবং সাধারণভাবে, বি কে কে জি কে এর সাথে মিলে যায়

এখন, আমরা প্রতিটি সেট বিট জেড (এন) এবং জেড (এম) এ প্রতিস্থাপিত করি যা সূচকটি এনকোড করে।

উদাহরণস্বরূপ, ইনপুট 532 10 = 1000010100 2 [2 2 9] এ রূপান্তরিত হয় ।

এটি পূর্ণসংখ্যার দুটি অ্যারে ফলন করে, যা আমরা একক গঠনে সংমিশ্রণ করতে পারি।

উদাহরণস্বরূপ, যদি এন = মি = 100 হয় তবে ফলাফলটি A: = [2 4 9 2 4 9]

যদি আমরা একে প্রতিস্থাপন মধ্যে একটি দ্বারা জি এবং ফলাফল যোগ করে, আমরা প্রাপ্ত এন + M = 200 , তাই একটি হল একটি পচা পথে 200 Zeckendorf এর উপপাদ্য থেকে এক ফিবানচি সংখ্যার মধ্যে কিন্তু অবশ্যই।

মনে রাখা যে জি + + জি ট + 1 টি = জি ট +2 এবং জি + + জি = জি + + জি K-1 + + জি K-2 = জি ট + 1 টি + + জি K-2 , আমরা পরপর প্রতিস্থাপন করতে পারেন এবং অন্যদের সদৃশ ইনডেক্স (বলতে গেলে, (ট, K + 1 টি) দ্বারা ট +2 এবং (ট, ট) দ্বারা (ট + 1 টি, K - 2) ), ঐ বদল পুনরাবৃত্তি বহুবার পর্যন্ত Zeckendorf উপস্থাপনা উপনিত। 1

নেতিবাচক সূচকগুলির জন্য বিশেষ কেস নিতে হবে। যেহেতু জি -২ = ০ , সূচি -২ সহজেই উপেক্ষা করা যায়। এছাড়াও, জি -1 = 0 = জি 0 , সুতরাং যে কোনও ফলাফল -1 0 দ্বারা প্রতিস্থাপন করতে হবে ।

আমাদের উদাহরণস্বরূপ একটি আমরা (সাজানো হিসেবে) উপস্থাপনা প্রাপ্ত, গত হচ্ছে Zeckendorf উপস্থাপনা।

[2 2 4 4 9 9] → [0 3 4 4 9 9] → [0 5 4 9 9] → [0 6 9 9] → [0 6 7 10] → [0 8 10]

অবশেষে, আমরা পূর্ণসংখ্যার অ্যারে থেকে বিট অ্যারে রূপান্তর করি।

কোড

2             e# Push a 2 we'll need later.
q~            e# Read and evaluate the input.
{             e# For each integer I in the input:
  32{         e#   Filter [0 ... 31]; for each J:
    2\#       e#     Compute 2**J.
    I&        e#     Compute its logical AND with I.
  },          e#   Keep J if the result in truthy (non-zero).
}fI           e#
+             e# Concatenate the resulting arrays.
32_,*         e# Repeat [0 ... 31] 32 times.
{             e# For each K:
  WUer        e#   Replace -1's with 0's.
  $           e#   Sort.
  Kf-         e#   Subtract K from each element.
  [UU]/[-2X]* e#   Replace subarrays [0 0] with [-2 1].
  2,/2a*      e#   Replace subarrays [0 1] with [2].
  Kf+         e#   Add K to each element.
}fK           e#
f#            e# Replace each K with 2**K.
1b            e# Cast all to integer (discards 2**-2) and sum.

1 বাস্তবায়নটি 32 বার পরিবর্তনের চেষ্টা করে এবং জেকেন্ডারফের উপস্থাপনা বাস্তবে পৌঁছেছে কিনা তা পরীক্ষা করে না। আমার কাছে এটি পর্যাপ্ত প্রমাণের কোনও আনুষ্ঠানিক প্রমাণ নেই, তবে আমি 15 বিট উপস্থাপনার সমস্ত সম্ভাব্য পরিমাণ পরীক্ষা করেছি (যার পরিমাণগুলির উপস্থাপনাগুলি 17 বিট পর্যন্ত প্রয়োজন) এবং তাদের সবার জন্য 6 টি পুনরাবৃত্তি যথেষ্ট ছিল। যাই হোক না কেন, পুনরাবৃত্তির সংখ্যা 99 এ বাড়ানো বাইট গণনাটি বাড়ানো ছাড়া সম্ভব, তবে এটি পারফরম্যান্সকে পঙ্গু করে দেবে।


10

এপিএল (ডায়ালগ প্রসারিত) , 39 বাইট

1↓⍧|/⌽(+/g[⍸⌽+/⊤⎕]),↑,\⌽g←(2+/,)⍣38⍨⍳2

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

দৈর্ঘ্যের 2 টির একটি যুক্তি নিয়ে পুরো প্রোগ্রামে পরিবর্তিত হয়েছে এবং ফিবোনাকির জেনারেটরও পরিবর্তন করেছে। প্রচুর ধারণার জন্য @nn ধন্যবাদ।

ব্যবহার করে ⎕IO←0যাতে ⍳2মূল্যায়ন করে 0 1

ফিবোনাচি জেনারেটর (নতুন)

নোট করুন যে শেষ দুটি সংখ্যাটি সঠিক নয়, তবে এটি প্রোগ্রামটির আউটপুট পরিবর্তন করে না।

(2+/,)⍣38⍨⍳2
 0 1 ((2+/,)⍣38) 0 1

Step 1
0 1 (2+/,) 0 1
 2+/ 0 1 0 1
 (0+1) (1+0) (0+1)  2+/ evaluates sums for moving window of length 2
 1 1 1

Step 2
0 1 (2+/,) 1 1 1
 2+/ 0 1 1 1 1
 1 2 2 2

Step 3
0 1 (2+/,) 1 2 2 2
 2+/ 0 1 1 2 2 2
 1 2 3 4 4

জেকেন্ডার্ফ থেকে প্লেইন (আংশিক)

⍸⌽+/⊤⎕
        Take input from stdin, must be an array of 2 numbers
        Convert each number to base 2; each number is mapped to a column
  +/     Sum in row direction; add up the counts at each digit position
        Reverse
        Convert each number n at index i to n copies of i

এপিএল (ডায়ালগ প্রসারিত) , 47 বাইট

g1↓(1,+\⍤,)⍣201
{⊥1↓⍧|/⌽⍵,↑,\⌽g}+⍥{+/g[⍸⌽⊤⍵]}

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

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

পর্ব 1 (নতুন)

{+/g[⍸⌽⊤⍵]}
       ⊤⍵     Argument to binary digits
     ⍸⌽       Reverse and convert to indices of ones
   g[    ]    Index into the Fibonacci array of 1,2,3,5,...
 +/           Sum

এপিএল (ডায়ালগ প্রসারিত) , 52 বাইট

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}+⍥({+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤)

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

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

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

পর্ব 1: জেকেন্ডার্ফ থেকে সরল পূর্ণসংখ্যার

{+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤   Zeckendorf to plain integer
                   Convert the input to array of binary digits (X)
{    (  ≢⊤⍵)  }     Take the length L of the binary digits and
      ⌽⍳              generate 1,2..L backwards, so L..2,1
{+∘÷⍣(     )⍨1}     Apply "Inverse and add 1" L..2,1 times to 1
                    The result looks like ..8÷5 5÷3 3÷2 2 (Y)
                   Mixed base conversion of X into base Y

Base |             Digit value
-------------------------------
13÷8 | (8÷5)×(5÷3)×(3÷22 = 8
 8÷5 |       (5÷3)×(3÷22 = 5
 5÷3 |             (3÷22 = 3
 3÷2 |                   2 = 2
 2÷1 |                   1 = 1

পার্ট 2: দুটি সমতল পূর্ণসংখ্যা যুক্ত করুন

+⍥z2i   Given left and right arguments,
          apply z2i to each of them and add the two

পার্ট 3: যোগফলটি জেকেন্ডার্ফে রূপান্তর করুন

"আপনি ধরে নিতে পারেন যে 31 বিটের মধ্যে ইনপুট এবং আউটপুট উভয়ের জেকেন্ডারফের উপস্থাপনাগুলি বেশ সহজ ছিল।

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}   Convert plain integer N to Zeckendorf
                 (1,+\⍤,)⍣201    First 41 Fibonacci numbers starting with two 1's
                ⌽                ⍝ Reverse
             ↑,\                 ⍝ Matrix of prefixes, filling empty spaces with 0's
          ⌽⍵,                     Prepend N to each row and reverse horizontally
        |/                        Reduce by | (residue) on each row (see below)
                                 Nub sieve; 1 at first appearance of each number, 0 otherwise
  1↓¯1                           Remove first and last item
                                 Convert from binary digits to integer

ফিবোনাচি জেনারেটর

(1,+\⍤,)⍣201
 1 ((1,+\⍤,)⍣20) 1   Expand 
 Apply 1 (1,+\⍤,) x 20 times to 1

First iteration
1(1,+\⍤,)1
 1,+\1,1   Expand the train
 1,1 2     +\ is cumulative sum
 1 1 2     First three Fibonacci numbers

Second iteration
1(1,+\⍤,)1 1 2
 1,+\1,1 1 2   Expand the train
 1 1 2 3 5     First five Fibonacci numbers

20   ... Repeat 20 times

এটি ফিবোনাকির সংখ্যাগুলির সম্পত্তি থেকে অনুসরণ করে: যদি ফিবোনাচি হিসাবে সংজ্ঞায়িত হয়

F0=F1=1;n0,Fn+2=Fn+1+Fn

তারপর

n0,i=0nFi=Fn+21

এর সমষ্টিগত যোগফল 1,F0,,Fn (ফিবোনাচি অ্যারে প্রপেন্ডেড 1 দিয়ে) হয়ে যায় F1,,Fn+2। তারপরে আমি সূচক 0 দিয়ে শুরু করে স্বাভাবিক ফিবোনাচি অ্যারে পেতে আবারও 1 টি প্রস্তুত করি।

ফিবোনাচি থেকে জেকেন্ডারফের অঙ্কগুলি

Input: 7, Fibonacci: 1 1 2 3 5 8 13

Matrix
0 0 0 0 0 0 13 7
0 0 0 0 0 8 13 7
0 0 0 0 5 8 13 7
0 0 0 3 5 8 13 7
0 0 2 3 5 8 13 7
0 1 2 3 5 8 13 7
1 1 2 3 5 8 13 7

Reduction by residue (|/)
- Right side always binds first.
- x|y is equivalent to y%x in other languages.
- 0|y is defined as y, so leading zeros are ignored.
- So we're effectively doing cumulative scan from the right.
0 0 0 0 0 0 13 7 → 13|7 = 7
0 0 0 0 0 8 13 7 →  8|7 = 7
0 0 0 0 5 8 13 7 →  5|7 = 2
0 0 0 3 5 8 13 7 →  3|2 = 2
0 0 2 3 5 8 13 7 →  2|2 = 0
0 1 2 3 5 8 13 7 →  1|0 = 0
1 1 2 3 5 8 13 7 →  1|0 = 0
Result: 7 7 2 2 0 0 0

Nub sieve (⍧): 1 0 1 0 1 0 0
1's in the middle are produced when divisor  dividend
(so it contributes to a Zeckendorf digit).
But the first 1 and last 0 are meaningless.

Drop first and last (1↓¯1↓): 0 1 0 1 0
Finally, we apply base 2 to integer (⊥) to match the output format.

6

হাস্কেল, 325 396 বাইট

সম্পাদনা: নতুন সংস্করণ:

s f[]=[]
s f l=f l
x((a:b):(c:d):(e:r))=x(b:d:(a:e):r)
x(a:b:((c:d:e):r))=x((c:a):b:e:((d:s head r):s tail r))
x[]=[]
x(a:r)=a:x r
w l|x l/=l=w.x$l|True=l
l=length
t n x=take n$repeat x
j 0=[]
j n=t(mod(n)2)1:j(div(n)2)
i n=[[],[]]++j n++t(32-(l$j n))[]
u[]=0
u(a:r)=2*u r+l a
o(_:a:r)=u r+l a
z a b=o$w$zipWith(++)(i a)(i b)

z কাজ করে


কিছু জিনিস সরাসরি তাত্ক্ষণিকভাবে সংক্ষিপ্ত করা যায় - উদাহরণস্বরূপ ফাংশনটির সর্বাধিক অগ্রাধিকার রয়েছে, সুতরাং আপনি ফাংশন অ্যাপ্লিকেশনগুলির আশেপাশে পিতামাতাদের মুক্তি দিতে পারেন, এবং গার্ডদেরও পিতামাতার প্রয়োজন হয় না - প্রহরী যেখানে থাকে সেখানেই থামেন =, সুতরাং সেখানে পিতামাতার প্রয়োজন নেই , এবং আরও অনেক কিছু, এবং :ডানদিকে সহযোগী মনে রাখবেন এবং আপনি সেখানে কিছু কাটাতে পারেন। তবে, যাই হোক না কেন, অভিনন্দন! দেখতে অনেক জটিল। এটি কীভাবে কাজ করে তা বের করার জন্য অপেক্ষা করতে পারবেন না!
গর্বিত হাসেলেলার

@ প্রফেসহেস্কিলার অযথা জটিল, তবে আমার সম্পাদনা দেখুন। আমি কি প্রাথমিক ধারণাটি ব্যাখ্যা করব? এটি অন্য কোনও উপায়ে হতে পারে তবে প্রথমে যথাসম্ভব প্যাটার্ন মেলানোর চেষ্টা করেছি। আহা, পিতা-মাতার দ্বারা আপনি প্রথম বন্ধনী বলতে চাইছেন: গল্ফ!
লিফ উইলার্টস

চিল্ল্যাক্স, এটি আপনার এখানে প্রথমবারের মতো। আপনি যদি দীর্ঘ থাকেন তবে আপনি আরও উন্নত হবেন। কিছু অন্তর্দৃষ্টি কোডগলফের
গর্বিত হাসেলেলার

@ জনসম্পর্কিত এডিট এসেছিল ...
লিফ

4

ES6, 130 বাইট

(n,m)=>{for(a={},s=0,i=x=y=1;i<<1;i+=i,z=y,y=x,x+=z)s+=((n&i)+(m&i))/i*(a[i]=x);for(r=0;i;i>>>=1)s>=a[i]?(s-=a[i],r|=i):0;return r}

আমি মূলত সমষ্টিটি জায়গায় জায়গায় গণনা করার চেষ্টা করেছি (কার্যকরভাবে সিজেএম বাস্তবায়নের লাইন বরাবর) তবে আমি অস্থায়ী সংস্থাগুলির বাইরে চলেছি, তাই আমি কেবল সংখ্যাগুলিকে সত্যিকারের পূর্ণসংখ্যা থেকে রূপান্তরিত করেছি।

(হ্যাঁ, আমি সম্ভবত বোল ব্যবহার করে বাঁচাতে পারি al


1

রুবি , 85 73 65 বাইট

->*a{r=(0..2*a.sum).select{|r|r^r*2==r*3};r[a.sum{|w|r.index w}]}

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

কিভাবে?

এনকোডযুক্ত যোগফলের জন্য প্রথমে একটি উচ্চতর বাউন্ড পান: (a + b) * 2 ঠিক আছে।

এখন (0..limit) থেকে সমস্ত অ-জেকেন্ডারফ নম্বরগুলি ফিল্টার করুন।

আমাদের দেখার একটি টেবিল রয়েছে, এটি এখান থেকে উতরাই।


1

পাইথন 3, 207 বাইট

def s(n):
 p=1
 while n>=2*p:
  p*=2
 return n if n<=p else s(n+p//2)if n>=3*p/2 else s(m)if (m:=s(n-p)+p)!= n else n
a=lambda n,m:(b:=n&m)>-1 and s(a(a(a(s((n|m)-b%4),b//4*2),b//4),b%4*2+b%4//2))if m else n

অনলাইনে চেষ্টা করে দেখুন! (সমস্ত পরীক্ষার কেস যাচাই করুন)

ব্যাখ্যা

এই প্রোগ্রামটি সরাসরি জেকেন্ডারফের উপস্থাপনার বাইনারি অনুবাদগুলি পরিচালনা করে। ফাংশনটি a(n,m)মূল গণনাগুলি সম্পাদন করে এবং s(n)এটি একটি সহায়ক ফাংশন যা জেকেন্ডারফের উপস্থাপনায় থাকা সংলগ্ন সংখ্যাগুলি থেকে মুক্তি পায়।

আসুন ফাংশন দিয়ে শুরু করা যাক s(n)(স্পষ্টতার জন্য প্রসারিত):

def s(n): 
    p=1                  #This finds the highest digit of the binary form of n.
    while n>=2*p:
        p*=2
    if n<=p:             #If n is a power of two (i.e, our number is already a Fibonnaci number)...
        return n         #Then return it normally.  This also works for zero. (A)
    if n>=3*p/2:         #If n's first digit is followed by a 1 (i.e, it starts with 11X)
        return s(n+p//2) #Then replace that with 100X (B)
    m = s(n-p)+p         #Otherwise, apply s to the rest of the number (C)
    if m==n:             #If this is out final result, we're done! (D)
        return n
    return s(m)          #Otherwise, reapply it. (E)

উদাহরণস্বরূপ, 107 সংখ্যা ( 1101011বাইনারি, 1 + 2 + 5 + 13 + 21 = 42 উপস্থাপন করে) নিম্নলিখিত প্রক্রিয়াটি অতিক্রম করে:

1+2+5+13+21 [1101011] -> 1+2+5+34 [10001011] (B)
1+2+5+34 [10001011] (C)
 1+2+5 [1011] (C)
  1+2 [11] -> 3 [100] (B)
 ->3+5 [1100] (A/E)
 (E):  3+5 [1100] -> 8 [10000] (B)
->8+34 [10010000] (A/E)
(E): 8+34 [10010000] (C)
->8+34 [10010000] (A/E)

অনলাইনে চেষ্টা করে দেখুন! (বিস্তারিত আউটপুট সহ)

এখানে এর প্রসারিত সংস্করণ রয়েছে a(n,m):

def a(n,m):
    if m==0:
        return n
    b=n&m
    t=s((n|m)-b%4)              #(A)
    t=a(t,b//4*2)               #(B)
    t=a(t,b//4)                 #(C)
    return s(a(t,b%4*2+b%4//2)) #(D)

এই ফাংশনটি দুটি জেকেন্ডারফের উপস্থাপনাটিকে চারটি বাইনারি সংখ্যায় রূপান্তর করে যা সংহত করা সহজ। লাইন (এ) হ'ল দুটি বাইনারি জেকেন্ডারফের উপস্থাপনাগুলির বিটওয়াইস OR বা - এটি উভয় গ্রুপের প্রতিটি ফিবোনাচি সংখ্যার একটি অনুলিপি অনুসারে। (খ) এবং (সি) হ'ল যথাক্রমে 1 এবং 2 বার ডান স্থানান্তরিত দুটি সংখ্যার বিটওয়াইস এবং are আমরা জানি যে যখন (বি) এবং (সি) এর জন্য সংশ্লিষ্ট ফিবোনাচি একসাথে যুক্ত হবে তখন সেগুলি আমাদের বিটওয়াইড এবং এর সমতুল্য হবে nএবং mকারণ এফ (এন) = এফ (এন -1) + এফ (এন -2) ।

উদাহরণস্বরূপ, ধরা যাক যে আমাদের বাইনারি সংখ্যাগুলি এন = 101001 (1 + 5 + 13 এর সাথে সম্পর্কিত) এবং এম = 110110 (2 + 3 + 8 + 13) রয়েছে। তারপরে আমাদের কাছে (এ) = 111111 (1 + 2 + 3 + 5 + 8 + 13) হবে, যা আমাদের ফাংশন দ্বারা 1010100 (3 + 8 + 21) এ রূপান্তরিত হবে s, (বি) = 10000 (8), এবং ( সি) = 1000 (5) আমরা এটি পরীক্ষা করতে পারি (1 + 5 + 13) + (2 + 3 + 8 + 13) = (3 + 8 + 21) + (8) + (5) = 45। এই প্রক্রিয়াটি ((3 + 8 + 21) + (8)) + (5) = ((3 + 8 + 21) + (5) + (3)) + (5) ইত্যাদি দ্বারা পুনরাবৃত্তি করে

এই সিস্টেমের মধ্যে একটি সমস্যা হ'ল এটি ফিবোনাকির সংখ্যা 1 এবং 2 এর জন্য কাজ করে না, যেহেতু তারা সম্পত্তি মানেন না F(n)=F(n-1)+F(n-2)(তারা সর্বনিম্ন দুটি সংখ্যা)! যার কারণে, যখনই 1 বা 2 উভয়ই থাকে nএবং mএগুলি, এ, বি এবং সি থেকে সরানো হয়, তখন তাদের যোগফল 1 + 1 = 2 এবং 2 + 2 = 1 + 3 এর অধীনে ডিতে স্থাপন করা হয়। উদাহরণস্বরূপ, আমরা যদি 1 + 3 (101) + 1 + 3 + 5 (1101) যোগ করি তবে আমরা পাই:

(ক): 3 + 5 (1100) = 8 (10000)

(খ): 2 (10)

(সি): 1 (1)

(ডি): 2 (10)

লক্ষ্য করুন যে 3 এবং 5 কে A তে স্থাপন করা হয়েছিল, নকল 3 কে বি এবং সি তে 2 + 1 এ বিভক্ত করা হয়েছিল, এবং নকল 1 গুলি এ, বি, এবং সি থেকে সরানো হয়েছিল এবং এক সাথে যুক্ত করা হয়েছিল এবং ডি তে রেখে দেওয়া হয়েছে একইভাবে, যদি আমরা 2 + 3 (110) + 2 + 3 + 5 (1110) যোগ করুন, আমরা পাই:

(ক): 3 + 5 (1100) = 8 (10000)

(খ): 2 (10)

(সি): 1 (1)

(ডি): 1 + 3 (101)

এটি অনলাইন চেষ্টা করুন! (একটি বিস্তারিত আউটপুট সহ)


0

ওল্ফ্রাম ভাষা (গণিত) , 218 বাইট

Fold[#+##&,Total@PadLeft@IntegerDigits[#,2]//.{{p=n_/;n>1,r=y___}:>{0,n,y},{q=x___,i_,p,j_,k_,r}:>{x,i+1,n-2,j,k+1,y},{q,i_,p,j_}:>{x,i+1,n-2,j+1},{q,i_,p}:>{x,i+1,n-2},{1,1,r}:>{1,0,0,y},{q,i_,1,1,r}:>{x,i+1,0,0,y}}]&

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

কেবল প্যাটার্ন মেলানো।

Ungolfed:

FromDigits[Total@PadLeft@IntegerDigits[#, 2] //.
   {{n_ /; n > 1, y___} :> {0, n, y},
    {x___, i_, n_ /; n > 1, j_, k_, y___} :> {x, i + 1, n - 2, j, k + 1, y},
    {x___, i_, n_ /; n > 1, j_} :> {x, i + 1, n - 2, j + 1},
    {x___, i_, n_ /; n > 1} :> {x, i + 1, n - 2},
    {1, 1, y___} :> {1, 0, 0, y},
    {x___, i_, 1, 1, y___} :> {x, i + 1, 0, 0, y}}, 2] &
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.