Zeckendorf प्रतिनिधित्व के तहत सारांश


14

Zeckendorf के प्रमेय से पता चलता है कि हर सकारात्मक पूर्णांक को गैर-आसन्न फाइबोनैचि संख्याओं के योग के रूप में विशिष्ट रूप से दर्शाया जा सकता है। इस चुनौती में, आपको दो संख्याओं के योग की गणना करना है।


एफ चलो n होना n फाइबोनैचि संख्या जहां वें

F 1 = 1,
F 2 = 2 और
सभी k > 2 के लिए, F k = F k - 1 + F k - 2

ज़ेकेनडोर्फ़ प्रतिनिधित्व जेड ( n एक गैर नकारात्मक पूर्णांक के) n ऐसा है कि धनात्मक पूर्णांक का एक सेट है

n = Σ मैं ∈ जेड ( एन ) एफ मैं   और
मैं ∈ जेड ( एन ) मैं + 1 ∉ जेड ( एन )।

(अभियोजन पक्ष में: संख्या n का Zeckendorf प्रतिनिधित्व सकारात्मक पूर्णांक का एक सेट है, जैसे कि इन सूचकांकों के लिए फाइबोनैचि संख्या n तक सम्‍मिलित है और दो समीपवर्ती पूर्णांक उस सेट का भाग नहीं हैं)

विशेष रूप से, Zeckendorf प्रतिनिधित्व अद्वितीय है। यहाँ Zeckendorf अभ्यावेदन के लिए कुछ उदाहरण हैं:

Z (0) = ∅ (खाली सेट)
Z (1) = {1}
Z (2) = {2}
Z (3) = {3} ({1, 2} Zckendorf 3 का प्रतिनिधित्व नहीं है)
Z (१०) = {५, २}
जेड (१००) = {३, ५, १०}

इस चुनौती में, Zeckendorf अभ्यावेदन को बिट सेट के रूप में एन्कोड किया गया है जहाँ कम से कम महत्वपूर्ण बिट का प्रतिनिधित्व करता है यदि 1सेट का हिस्सा है, आदि। आप मान सकते हैं कि ज़ेकडॉन्फ़र प्रतिनिधित्व इनपुट और आउटपुट दोनों के 31 बिट्स में फिट है।

आपका काम गणना जेड (करने के लिए है n + मीटर ) दिया जेड ( एन ) और जेड ( मीटर )। ऑक्टेट्स में सबसे कम लंबाई के साथ समाधान जीतता है।

आप यहां ANSI C में लिखा गया संदर्भ कार्यान्वयन पा सकते हैं । इसका उपयोग Zeckendorf अभ्यावेदन उत्पन्न करने के लिए भी किया जा सकता है या अपने Zeckendorf अभ्यावेदन से एक संख्या की गणना कर सकता है।

यहाँ नमूना इनपुट और आउटपुट के कुछ जोड़े हैं, जहाँ पहले दो कॉलम में इनपुट और तीसरे कॉलम में आउटपुट शामिल हैं:

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
क्या आप कृपया इनपुट / आउटपुट को विस्तृत कर सकते हैं?
19

@flawr कृपया प्रदान किए गए संदर्भ कार्यान्वयन पर एक नज़र डालें। आप अपने स्वयं के नमूना इनपुट उत्पन्न करने के लिए इसका उपयोग कर सकते हैं।
FUZxxl

3
मुझे खुशी होगी कि यदि आप यहां चाहते हैं कि आप क्या चाहते हैं और कुछ उदाहरण प्रदान कर सकते हैं, जैसा कि मैं हूं, और शायद अन्य लोग भी हैं, सी में धाराप्रवाह नहीं हैं
त्रुटी

मैं विशिष्टता के तर्क से असहमत हूं। चूंकि फाइबोनैचि अनुक्रम 1, 1, 2 से शुरू होता है, आप स्पष्ट रूप से 3 को F0 + F2 = 1 + 2 = 3. F0 में विभाजित कर सकते हैं और F2 निकट नहीं हैं ।
orlp

1
@orlp यहाँ परिभाषित फाइबोनैचि अनुक्रम F1 = 1 और F2 = 2 से शुरू होता है। तो जिस तरह से मैंने इसे पढ़ा, आपकी परिभाषा से F0 यहाँ इस्तेमाल किए गए अनुक्रम का हिस्सा नहीं है।
रेटो कोराडी

जवाबों:


5

के (ngn / k) , ४५ ४३ ४२ ४१ बाइट्स

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

इसे ऑनलाइन आज़माएं!

@ बब्लर का एल्गोरिदम

{ } तर्क के साथ कार्य करें x

64( )/0 प्रारंभिक मूल्य के रूप में 0 का उपयोग करते हुए 64 बार करें:

  • 1, प्रस्तुत करना १

  • +': प्रत्येक को पहले जोड़ें (पहले तत्व को छोड़ दें)

F:F"रिटेल अनुक्रम" के लिए असाइन करें

| उलटना

(.. ){y!x}\.. बाईं ओर मान से शुरू करते हुए, दाईं ओर की सूची के लिए संचयी अवशेष (बाएं से दाएं) की गणना करें। बाईं ओर मूल्य zeckendorf प्रतिनिधित्व के बिना आदानों का सादा योग है:

  • 2\xबाइनरी इनपुट्स को एनकोड करता है। यह एक नेबिट-बाय -2 मैट्रिक्स होगा

  • | उलटना

  • +/' प्रत्येक राशि

  • &1s कहाँ हैं? - सूचकांकों की सूची। यदि कोई 2s हैं, तो संबंधित सूचकांक को दो बार दोहराया जाता है।

  • F@ सरणी अनुक्रमण F

  • +/ योग

<': प्रत्येक पूर्व से कम (परिणाम का पहला हमेशा गलत होगा)

2/ बाइनरी डिकोड


10

सीजेएम, 76 74 70 63 59 बाइट्स

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

CJam दुभाषिया में इसे ऑनलाइन आज़माएँ या एक ही बार में सभी परीक्षण मामलों को सत्यापित करें

विचार

हम प्रश्न में अनुक्रम के एक मामूली बदलाव को परिभाषित करके शुरू करते हैं:

G -2 = 0
G -1 = 1
G k = G k-1 + G k-2 जब भी k एक ऋणात्मक पूर्णांक होता है

इस तरह, बिट सरणियों इनपुट या आउटपुट का बिट 0 (एलएसबी) फाइबोनैचि संख्या जी 0 से मेल खाता है और सामान्य तौर पर, बिट कश्मीर से जी के

अब, हम प्रत्येक सेट बिट को Z (n) और Z (m) द्वारा प्रतिस्थापित करते हैं, जो इसे एन्कोड करता है।

उदाहरण के लिए, इनपुट 532 10 = 1000010100 2 [2 4 9] में बदल जाता है ।

यह पूर्णांकों के दो सरणियों का उत्पादन करता है, जिसे हम एक एकल बनाने के लिए संक्षिप्त कर सकते हैं।

उदाहरण के लिए, यदि n = m = 100 , परिणाम A: = [2 4 9 2 4 9] है

यदि हम प्रत्येक की जगह कश्मीर में एक से जी कश्मीर और परिणाम जोड़ने के लिए, हम प्राप्त n + m = 200 , इसलिए एक है एक विघटित करने के लिए रास्ता 200 ज़ेकेनडोर्फ़ की प्रमेय से एक नहीं फिबोनैकी संख्या में है, लेकिन निश्चित रूप से।

यह ध्यान में रखते हुए कि G k + G k + 1 = G k + 2 और G k + G k = G k + G k-1 + G k-2 = G k + 1 + G k-2 , हम लगातार स्थानापन्न कर सकते हैं और दूसरों के द्वारा अनुक्रमणित अनुलिपि (अर्थात्, (k, k + 1) द्वारा k + 2 और (k, k) द्वारा (k + 1, k - 2) ), उन बारीकियों को तब तक दोहराते रहें जब तक Zeckendorf का प्रतिनिधित्व नहीं हो जाता। 1

परिणामी नकारात्मक अनुक्रमितों के लिए विशेष मामला लिया जाना चाहिए। चूंकि जी -2 = 0 , इंडेक्स -2 को केवल अनदेखा किया जा सकता है। इसके अलावा, जी -1 = 0 = जी 0 , इसलिए किसी भी परिणाम -1 को 0 से बदलना होगा

हमारे उदाहरण ए के लिए , हम निम्नलिखित (सॉर्ट किए गए) अभ्यावेदन प्राप्त करते हैं, अंतिम रूप से ज़ेकॉन्फ्रॉन्ग प्रतिनिधित्व है।

[२ २ ४ ४ ९ ९] → [० ३ ४ ४ ९ ९] → [० ५ ४ ९ ९] → [० ६ ९ ९] → [० ६] १०] → [०]] १०]

अंत में, हम पूर्णांकों के सरणी से बिट सरणी में वापस परिवर्तित करते हैं।

कोड

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

APL (Dyalog Extended) , 39 बाइट्स

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

इसे ऑनलाइन आज़माएं!

लंबाई 2 के एक तर्क को लेते हुए एक पूर्ण कार्यक्रम में बदल गया, और फाइबोनैचि जनरेटर को भी बदल दिया। बहुत सारे विचारों के लिए @ngn को धन्यवाद।

का उपयोग करता है ⎕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

सादे के लिए Zeckendorf (आंशिक)

⍸⌽+/⊤⎕
        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

APL (Dyalog Extended) , 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}⊥⊤)

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

Zeckendorf में जुड़ने के लिए कोई फैंसी एल्गोरिदम नहीं है क्योंकि APL एक सरणी में अलग-अलग तत्वों पर ऑपरेशन के लिए नहीं जाना जाता है। इसके बजाय, मैं Zeckendorf से दो इनपुट को सादे पूर्णांक में बदलने, उन्हें जोड़ने और इसे वापस परिवर्तित करने के लिए आगे बढ़ा।

भाग 1: सादे पूर्णांक के लिए Zeckendorf

{+∘÷⍣(⌽⍳≢⊤⍵)⍨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

यह फाइबोनैचि संख्याओं की संपत्ति से निम्नानुसार है: यदि फाइबोनैचि को परिभाषित किया गया है

एफ0=एफ1=1;n0,एफn+2=एफn+1+एफn

फिर

n0,Σमैं=0nएफमैं=एफn+2-1

तो का संचयी योग 1,एफ0,,एफn (फिबोनाची सरणी 1 के साथ पूर्वनिर्मित) बन जाती है एफ1,,एफn+2। फिर मैं 1 को फिर से शुरू करता हूं ताकि सामान्य 0 के साथ शुरू होने वाले फाइबोनैचि सरणी को प्राप्त किया जा सके।

फाइबोनैचि से ज़ेकॉन्ड्रॉफ़ अंक

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 काम करता है।


कुछ सामान को सीधे छोटा किया जा सकता है - उदाहरण के लिए फ़ंक्शन में सबसे अधिक पूर्वता है, इसलिए आप फ़ंक्शन अनुप्रयोगों के आसपास माता-पिता से छुटकारा पा सकते हैं, और गार्ड को माता-पिता की भी आवश्यकता नहीं है - गार्ड जहां रुकते हैं =, वहां माता-पिता की जरूरत नहीं है , और इतने पर और आगे, और ध्यान दें कि :दाईं ओर सहयोगी हैं और आप वहां कुछ काट सकते हैं। लेकिन, वैसे भी, बधाई! बहुत जटिल लगता है। यह कैसे काम करता है यह पता लगाने के लिए इंतजार नहीं कर सकता!
गर्वित हस्केलर

@proudhaskeller बेकार में जटिल है, हालांकि, मेरा संपादन देखें। क्या मैं मूल विचार की व्याख्या करूंगा? यह एक और तरीका बेहतर हो सकता है, लेकिन मैंने पहली बार में जितना संभव हो उतना मिलान करने की कोशिश की। आह, माता-पिता द्वारा आप कोष्ठक का मतलब है: गोल्फ कि!
लीफ विलर्ट्स

Chillax, यह आपके यहाँ पहली बार है। यदि आप लंबे समय तक रहेंगे, तो आप बहुत बेहतर होंगे। कुछ अंतर्दृष्टि के लिए हास्केल गोल्फ टिप्स सवाल की जाँच करना सुनिश्चित करें कोडगॉल्फ.स्टैकएक्सचेंज.com
गर्व हैकेकलर

@proudhaskeller edit का आगमन हुआ ...
Leif Willerts

4

ईएस 6, 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}

मैंने मूल रूप से योग की जगह (प्रभावी रूप से सीजेएम कार्यान्वयन की तर्ज पर) गणना करने की कोशिश की, लेकिन मैं अस्थायी से बाहर भाग रहा था, इसलिए मैंने बस संख्याओं को वास्तविक पूर्णांकों से और पीछे परिवर्तित कर दिया।

(हां, मैं संभवतः एक बाइट को eval का उपयोग करके बचा सकता हूं।)


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) से सभी गैर- zeckendorf संख्या को फ़िल्टर करें।

हमारे पास एक देखने की मेज है, यह यहाँ से नीचे की ओर है।


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)एक सहायक फ़ंक्शन है जो Zeckendorf प्रतिनिधित्व में निहित आसन्न संख्याओं से छुटकारा दिलाता है।

चलो समारोह से शुरू करते हैं 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)

यह फ़ंक्शन दो ज़ेकेनडॉर्फ अभ्यावेदन को चार बाइनरी संख्याओं में परिवर्तित करता है जो गठबंधन करना आसान है। लाइन (ए) बिटबाइन या दो बाइनरी ज़ीकेन्डोर्फ़ अभ्यावेदन का है - ये दोनों समूह में प्रत्येक फाइबोनैचि संख्या की एक प्रति के अनुरूप हैं। (बी) और (सी) क्रमश: १ और २ बार सही-शिफ्ट किए गए दो नंबरों के बिट वाइज हैं। हम जानते हैं कि जब (बी) और (सी) के लिए इसी फाइबोनैचि संख्या को एक साथ जोड़ा जाता है, तो वे बिटवाइंड और हमारे nऔर के बराबर होंगेm क्योंकि एफ (एन) = एफ (एन -1) + एफ (एन -2) ।

उदाहरण के लिए, मान लें कि हमारे पास बाइनरी नंबर n = 101001 (1 + 5 + 13 के अनुरूप) और m = 110110 (2 + 3 + 8 + 13) हैं। तब हमारे पास (ए) = 111111 (1 + 2 + 3 + 5 + 8 + 13) होगा, जो हमारे फ़ंक्शन द्वारा 1010100 (3 + 8 + 21) में बदल दिया जाता है s, (बी) = 10000 (8), और ( C) = 1000 (5)। हम जाँच सकते हैं कि (१ + ५ + १३) + (२ + ३ +) + १३) = (३ + 21 + २१) + ()) + (५) = ४५। यह प्रक्रिया ((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, उन्हें A, B, और C से हटा दिया जाता है, तब उनकी संपत्ति में D को 1 + 1 = 2 और 2 + 2 = 1 + 3 के तहत रखा जाता है। उदाहरण के लिए, यदि हम 1 + 3 (101) + 1 + 3 + 5 (1101) जोड़ते हैं, तो हमें यह मिलता है:

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

(बी): २ (१०)

(C): 1 (1)

(D): 2 (10)

ध्यान दें कि 3 और 5 को A में रखा गया था, डुप्लिकेट 3 को B और C में 2 + 1 में विभाजित किया गया था, और डुप्लिकेट 1s को A, B, और C से हटा दिया गया था, एक साथ जोड़ा गया, और D. में डाला गया, यदि हम 2 + 3 (110) + 2 + 3 + 5 (1110) जोड़ें, हमें मिलता है:

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

(बी): २ (१०)

(C): 1 (1)

(D): 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] &
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.