⊥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
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}⊥⊤)
এটি অনলাইন চেষ্টা করুন!
কিভাবে এটা কাজ করে
জেকেন্ডার্ফে যোগ করার মতো কোনও অভিনব অ্যালগরিদম কারণ এপিএল একটি অ্যারেতে পৃথক উপাদানগুলির ক্রিয়াকলাপের জন্য পরিচিত নয়। পরিবর্তে, আমি জেকেন্ডার্ফ থেকে দুটি ইনপুটকে সরল পূর্ণসংখ্যায় রূপান্তর করতে, সেগুলি যুক্ত করতে এবং এটিকে আবার রূপান্তর করতে এগিয়ে গিয়েছিলাম।
পর্ব 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÷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 ; ∀ n ≥ 0 ,এফn + 2=এফn + 1+ +এফএন
তারপর
∀n≥0,∑i=0nFi=Fn+2−1
এর সমষ্টিগত যোগফল 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.