Brainfuckのフィボナッチ数

年初に記事「Brainfuck and happy ticket」を読んだ後、私はBrainfuckを勉強し、それに何か面白いことを書く時だと決めました。 長く考える必要はありませんでした。 私は、フィボナッチ数列の表示される要素の数を決定する1桁の数字をユーザーが入力する、 フィボナッチ数の 「異常な」実装を作成することにしました。

BrainfuckサイトとASCII文字テーブルも、プログラムの作成に役立ちました。


まあ、それは始まった!


まず、アルゴリズムを作成する必要があります。 そしてここに彼は:

アルゴリズムは、サイクルの各ステップの最後のセル1(一番上の行はセルの数)に、最後に計算された値が含まれ、セル2-最後から2番目の値を含むことを示します。

順番に行きましょう。 最初に、セルを使用して、何をどこに配置するかを決定します。 記事の本文に多くの不明瞭な点があるというコメントにクレームがないように詳細に書きます。 そして、フィボナッチシリーズでは最初の2つの位置が省略され、3番目の位置(0、1、1、2、3、5、...)からすぐに開始するように予約します。
セル1:値1
セル2:値0
セル3:値32(スペース)
セル4:入力番号
セル5〜8:補助
セル6には合計値があります

さらに、すべてのセルはYahと呼ばれます。xはセルのシリアル番号です。

すぐにコード全体を提供し、その後、詳細に分析します。 コードの理解(および記述)の便宜上、重要な部分はそれぞれ別々の行に記述しました。
+ (1)
>
>++++++++++ ++++++++++ ++++++++++ ++
>,
>++++++++[<------>-] (2)

<[ (3)

>[-]>[-]>[-]>[-] (4)
<<<<<<<[>>>>+>+>>+<<<<<<<-] (5)
>>>>>[<<<<<+>>>>>-] (6)
<<<<[>>>>+>+<<<<<-] (7)
>>>>>[<<<<<+>>>>>-] (8)
<[<+>-] (9)

<<<<[-] (10)
>>>>>>[<<<<<<+>>>>>>-] (11)
<<<<<<<[-] (12)
>>>>[<<<<+>>>>>+<-] (13)

++++++++[>++++++<-]>. (14)

<<<. (15)

>-] (16)

+++++++++++++.---. (17)


コード分​​析を始めましょう。


(1)-ここではすべてが基本です。 最初の3行ではセルにデータを入力し、4行目ではユーザーからの出力用の文字数を取得します。

(2)-計算に必要な数を取得し、48を引きます。

(3)-数値を出力するサイクルの始まり。

(4)-Z5-Z8をリセットします。 原則として、6だけをリセットすれば十分です。

(5)-R1からR5、R6、およびR8にデータをコピーします。 この場合、I1は空になります。
(6)-データをR6からR1に移動します。 したがって、I1、I5、およびI6では、I1からI5へのデータのコピーが実装されます。 2つの空のセル(最終セルと補助セル)を取得し、元のセルからこれらのセルにデータを転送してから、補助セルから元のセルにデータを転送します。
H5では、フィボナッチ数列の次の値を計算するために書きます。
R8では、シリーズの最後から2番目の値が保存されます。

(7、8)-(5、6)と同様に、R7を補助として使用して、R2からR6にデータをコピーします。

(9)-データをR6からR5に移動し、合計します。 次のフィボナッチ数の値の計算が行われます。

(10、11)-R2を無効にし、R2からR2にデータを移動します。
(12、13)-Z1をリセットし、データをZ5からZ1およびZ6に移動します。
したがって、H1では最後に計算された値が記録され、H2では最後から2番目の値が記録されます。

(14)-H6の値を48増やして、画面に表示します。
(15)-スペースを描画します。
(16)-カウンターを減らし、サイクルの終わり。
(17)-新しい行への移行、キャリッジシフト(ピン13、10)。

プログラムの隠されているが公開された能力。


初めてプログラムを書き終えたとき、フィボナッチ数列がまったく得られないことを発見しましたが、プログラミングの世界からそれほど遠くないわずかに異なる数列です。 私は再び鉛筆を取り、各ステップを分解しなければなりませんでした:

ええ、さらに一歩進んだことを知っていれば、エラーをより早く見つけることができます。 したがって、エラーの場所を計算する必要がありました。そのため、I7を使用してI1とI2の内容を表示する次のコードが(15)と(16)の間で役に立ちました。
>>>>[-]
++++++++[<<<<<<++++++>>>>>>-]<<<<<<.>>>>>>++++++++[<<<<<<------>>>>>>-]
++++++++[<<<<<++++++>>>>>-]<<<<<.>>>>>++++++++[<<<<<------>>>>>-]
[-]+++++++++++++.---.[-]<<<<

その後、もう少しプレイしなければならなかったのですが、結局、Z2(10)をリセットしなかったことがわかりました。 行(10)を削除すると、2のべき乗の系列が得られます。 :)

記事を完成させます。


それは基本的にそれです。 短い形式のアプリケーションのテキスト全体:
+>>++++++++++++++++++++++++++++++++>,>++++++++[<------>-]<[>[-]>[-]>[-]>[-]<<<<<<<[>>>>+>+>>+<<<<<<<-]>>>>>[<<<<<+>>>>>-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<[<+>-]<<<<[-]>>>>>>[<<<<<<+>>>>>>-]<<<<<<<[-]>>>>[<<<<+>>>>>+<-]++++++++[>++++++<-]>.<<<.>-][-]+++++++++++++.---.

実行結果:
9
1 2 3 5 8 = ER g


覚えておくべき主なことは、Brainfuckではすべてが現在のセルとそれぞれの値に関連しているということです。 (:

初心者向けの宿題:フィボナッチ数列の要素数の出力Nを実装します。Nは2桁の数字です。

Source: https://habr.com/ru/post/J111935/


All Articles