はじめに
Brainfuckは8チームのみで構成されています。
- >-次のメモリ位置に移動します
- <-前のメモリ位置に移動
- +-現在のメモリセルの値を増やす
- --現在のメモリセルの値を減らす
- [-現在のセルの値がゼロの場合、プログラムテキストで対応するセルの次のセルに進みます](ネストを考慮して)
- ]-現在のセルの値がゼロでない場合、プログラムテキストを介して、対応する[(ネストを考慮に入れて)に続くセルに戻る
- 。 -現在のセルの値を出力する
- 、-値を入力して現在のセルに保存する
通訳者
Brainfuckで記述されたプログラムを実行するには、次を使用できます。
こんにちはBrainfuck!
テキスト「Hello World!」を出力する最初のBrainfuckプログラムを作成しましょう。 アルゴリズムは簡単です:
1.目的の文字に等しくなるまでセルの値を増やします
2.セルに値を表示します(シンボル)
3.次のセルに移動する
4.すべての文字が表示されるまで繰り返します。
結果:
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++。> ++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
+++++++++++++。> +++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++。> ++++++ +++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++。> +++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
+++++++++++++++++++++++。> +++++++++++++++++++++++++++ ++++++。> +++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++。> ++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
+++++++++++++++。> +++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ 。> +++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++。>
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
+++++++++++++++++++。> ++++++++++++++++++++++++++++++ ++++。
また、phpでアルゴリズムを実装します。スクリプトはBrainfuckのソースコードを生成し、目的のテキストを表示します。
$ text =“ Hello、world!”;
$ length = strlen($ text);
for($ i = 0; $ i <$ length; $ i ++){
$ curr = ord($ text [$ i]);
for($ j = 1; $ j <= $ curr; $ j ++){
エコー "+";
if($ j == $ curr&$ i!= $ length-1){
echo "。>";
} elseif($ j == $ curr){
エコー "。";
}
}
「Hello World!」サイズがかなり大きいので、最適化してみましょう。 毎回新しいセルに移動して、最初から目的の文字への「パス」を開始する必要はありません-セルの現在の値を使用できます。 新しいアルゴリズム:
1.目的の文字に等しくなるまでセルの値を増やします
2.セルに値を表示します(シンボル)
3.次の目的の文字が現在の文字よりも大きい場合は、セルの値を増やし、少ない場合は目的の文字が得られるまで値を減らします
4.セルに値を表示します(シンボル)
5.すべての文字が表示されるまで、手順3から繰り返します
結果:
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++。+++++++++
++++++++++++++++++++++。+++++++ .. +++ .--------------- -------------------------------
---------------------------------。+++++++++++++++++ +++++++++++++++++++++++++++++++++
++++++++。+++++++++++++++++++++++++。+++。------ .----- ---.---------------------------
----------------------------------------。
すでに小さい:)同様のソースを生成するphpコードは次のとおりです。
$ text =“ Hello、world!”;
$ length = strlen($ text);
$ curr = 0;
for($ i = 0; $ i <$ length; $ i ++){
$ delta = ord($ text [$ i])-$ curr;
$ curr = ord($ text [$ i]);
if($ delta <0){
$ op = "-";
$ delta = abs($ delta);
} else {
$ op = "+";
}
for($ j = 1; $ j <= $ delta; $ j ++){
echo $ op;
}
エコー "。";
}
Brainfuckで結果のコードを最適化することは可能ですか? できます! ここで再びいくつかのセルを使用しますが、乗算を実装して使用します。 そして、これまで使用されていなかったチームが[そして]これに役立ちます。 乗算-合計を使用して、5 * 10 = 10 + 10 + 10 + 10 + 10 + 10。 つまり、セルへの10の追加を5回繰り返す必要があります。 プログラムアルゴリズム:
1. 10に等しくなるまでセルの値を増やします-サイクルのカウンター、乗数
2.サイクルが始まります[
3. n-目的の文字のコードを10で整数除算した結果に等しくなるまで、セルの値を増やします。
4.次のセルに移動します
5.すべてのキャラクターについてステップ3〜4を繰り返します。
6.サイクルカウンターを減らす(最初のセル)
7.サイクルは終了しました]
8.カウンターの次のセルに移動します。
9.セルに目的の文字のコードの整数除算の10による余りを追加します(セルの「H」の場合は70になり、2 = 72%を追加する必要があります10.つまり、最終的に「H」=(72/10)+(72% 10))
11.セル(シンボル)に値を表示し、次のセルに移動します
12.すべてのキャラクターについてステップ9〜11を繰り返します。
結果:
++++++++++ [+ +++++++> +++++++++++ +++++++++++ +++++++++ ++> +++++++++++> +++> ++++++++> +++
++++++++> +++++++++++> +++++++++++ +++++++++++ +++ <<<< <<<<<<<<-]> ++。> +。> ++++++++。> ++++++++。> +。> ++。> +++++ ++。> +。> ++++。> ++++++++。>。> +++。
出来上がり! PHPジェネレーターコード:
$ text =“ Hello、world!”;
$ length = strlen($ text);
echo "++++++++++ [";
for($ i = 0; $ i <$ length; $ i ++){
エコー ">";
$ ops = floor(ord($ text [$ i])/ 10);
for($ j = 1; $ j <= $ ops; $ j ++){
エコー "+";
}
}
for($ i = 0; $ i <$ length; $ i ++){
エコー "<";
}
echo "-]";
for($ i = 0; $ i <$ length; $ i ++){
エコー ">";
$ ops = ord($ text [$ i])%10;
for($ j = 1; $ j <= $ ops; $ j ++){
エコー "+";
}
エコー "。";
}
まとめ
ここに、Brainfuckのこのような興味深い素晴らしい言語があります:)結論として、私はBrainfuck自身について書かれたジェネレータを提供します。 このプログラムは入力されたテキストを読み取り、このテキストを印刷するBrainfuck(最適化された)コードを生成します。
>>>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++ +>
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++
+++++++++++++++++++++++++++++++++++> ++++++++++++++++ ++
++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++
+++++++++++++++++++++++++ +++++++++++++++++++++++++++ ++
+++++++++++++++++++++++++++++++++++++++ +++++++++++++++ ++
++++++++++++++++++++++++++++++++++++++++++++++++ +++++++ ++
++++++++++++++++++++++++++++++++++++++++++ <<<<<<<<<<<< <<
、---------- [++++++++++ >>>>>>>> .......... >>。>>。<<<< <<
<<<< [-] ++++++++++ << [> + >>>> + <<<<<-] >>>>> [<<<<< + >>>> >-
] <<<< >> [-]> [-] << [>> +> + <<<-] >>> [<<< + >>>-] >> [-] <<<<< <[
>>>> + >> + <<<<<<-] >>>>>> [<<<<<< + >>>>>>-] <<< [>> +> + <<< -]
>>> [<<< + >>>-] [-] << [>> [-] <[> [-] + <[-]] <[-]]> [-]> [<<< <<
<-> >>->>> [-] <<<<<< [>>>> + >> + <<<<<<-] >>>>>> [<<<<<< +> >>
>>>-] <<< [>> +> + <<<-] >>> [<<< + >>>-] [-] << [>> [-] <[> [-] + <[
-]] <[-]]> [-]>] <<<<<< [>> + <[>> +> + <<<-] >>> [<<< + >>>-]> > [
-] <<<<<< [>>>> + >> + <<<<<<-] >>>>>> [<<<<<< + >>>>-] <<< [>
> +> + <<<-] >>> [<<< + >>>-] [-] << [>> [-] <[> [-] + <[-]] <[-]] > [
-]> [<<<<< <-> >>->>> [-] <<<<<< [>>>> + >> + <<<<<<-] >>>>>> [<
<<<<< + >>>>>>-] <<< [>> +> + <<<-] >>> [<<< + >>>-] [-] << [>> [ -]
<[> [-] + <[-]] <[-]]> [-]>] <<<<<<> >>> [> +> + <<-] >> [<< + >> -]
[-] + <[> [-] << [<<->>-] << [>> + <<-] >>> [-]]> [<<< + <[-] >>> > [
-]] <<< [->>>>>。<<<<<] >>>>>>>>>>。<<<<。>>。>。<<<<<<<<< [ ->
>>>。<<<<] >>>>>>>>>>。<<<<。<。>>。>>。<<<<<<<<<<<<<<、--- -
-----]