⊥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
g←1↓(1,+\⍤,)⍣20⍨1
{⊥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
{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣20⍨1}+⍥({+∘÷⍣(⌽⍳≢⊤⍵)⍨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÷2)×2 = 8
8÷5 | (5÷3)×(3÷2)×2 = 5
5÷3 | (3÷2)×2 = 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,+\⍤,)⍣20⍨1} ⍝ Convert plain integer N to Zeckendorf
(1,+\⍤,)⍣20⍨1 ⍝ 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,+\⍤,)⍣20⍨1
→ 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 ; ≥ एन ∀ 0 ,एफn + 2=एफएन + १+एफn
फिर
≥ एन ∀ 0 ,Σमैं = ०nएफमैं=एफ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.