この記事では、Brainfuckで数字を並べ替える方法を紹介します。
プログラムを呼び出した後、数字を昇順で表示した後、数字を入力します(各数字は8ビットバージョンのインタープリターで255回を超えてはなりません)。
これは、次のように機能する
カウントソートの実装になります。
1.数値kが読み取られます。
2.配列Aで、A [k]を1つ増やします。
3.入力番号がなくなるまで手順1と2を繰り返します。
4. A [i]に数字iを掛けます。iは数字kの可能な値です。
さあ始めましょう
改行(ascii 10)を取得するまで文字を読み取ります
,
次に、検討した値にポインターを移動する必要があります。
[->+<]> [ [->+<] i- i + 1 +>- i- , , ]
その後、ポインターは、入力した文字の元の値に等しいセル上にあります。 最初のセルから始まり、ポインタが単位で満たされる前のセルで終わるすべてのセル-これは、ゼロのセルに戻るのに役立ちます。
さて、アルゴリズムの2番目のステップに従って、セルの値を大きくします。
>>>>> >>>>> + <<<<< <<<<<
注:10セルのシフトは偶然ではありません。それなしでは何が起こるかを考えてください。
次に、ゼロセルに移動します。
<[-<] ,
したがって、アルゴリズムの最初の3つのステップを実装することで得られたものです。
,---------- [ ----- ----- ----- ----- ----- --- [->+<]> [ [->+<] +>- ] >>>>> >>>>> + <<<<< <<<<< <[-<] ,----- ----- ]
応答出力
最も重要なことは、ソートされた数字を表示することです。
しかし、私たちの数字はどこにありますか?
ASCIIコード「0」は48です。
読み取り後、10を減算し、さらに28を減算しました。
読み取り値を最初のセルに移動しました。
しかし、セルを拡張する前に、10個のセルを進めました。
48-10-28 + 1 + 10 = 21
したがって、ゼロの数は21番目のセルにあり、ユニットの数は22番目のセルにあります。
20番目のセルを48に設定します(これはASCIIゼロコードです)。
前のセルの値を現在のセルの値と同じ回数だけ表示します。
現在のセルに前の値+ 1を割り当てます。
これを数字ごとに行います。
>>>>> >>>>> >>>>> >>>>> 20 ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ 48 >[<.>-] <[->+<]>+ , >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] ,
まとめ
これがコード全体です
,---------- [ ----- ----- ----- ----- ----- --- [->+<]> [ [->+<] +>-] >>>>> >>>>> + <<<<< <<<<< <[-<] ,----- ----- ] >>>>> >>>>> >>>>> >>>>> ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-] <[->+<]>+ >[<.>-]
このような簡単な方法で、数値をソートしました。
ほとんどすべての文字がソートされるようにコードを変更するか、降順で数字を表示するのは簡単です。 このアイデアを使用すると、数字だけでなく、2〜3桁の数字も並べ替えることができます。おそらく後で説明します。
ご清聴ありがとうございました。