8

初心者のために説明すると、Brainfuckは 8 つのコマンドしかないチューリング完全言語であり、そのすべてが C で文字どおり同等のものを持っています。

bf    c
----------------------
>     ++ptr;
<     --ptr;
+     ++*ptr;
-     --*ptr;
.     putchar(*ptr);
,     *ptr=getchar();
[     while (*ptr) {
]     }

パッケージマネージャーを備えたLinuxディストリビューションでは、Brainfuckインタープリターであるパッケージを見つけてインストールできるはずbeefなので、自宅で遊ぶことができます.

上記のように、Brainfuck には1 つの制御構造しかなく[…]、C に次のように変換されます。

while (*ptr) { … }

IF VAR = 0 THEN GOTO 10これにより、BASIC からのすべての制御が可能になります。getchar()以下は、返されるまで呼び出します0:

,    # *ptr = getchar();
[    # while (*ptr) {
  >,    # *(++ptr) = getchar();
]    # }

しかし、改行文字だけを読みたい場合はどうすればよい\nでしょうか? これを単純に機能させる方法について頭を悩ますのに苦労ifした後、次のことを思いつきました。

,            # *ptr = getchar();      /* store input                               */
----------   # *ptr -= 10;            /* test for \n by subtracting 10 before loop */
[            # while (*ptr) {         /* if *ptr == 0, last char read was \n       */
  ++++++++++   # *ptr += 10;          /*   wasn't \n, add 10 back to val under ptr */
  >,           # *(++ptr) = getchar();
  ----------   # *ptr -= 10;
]            # }

(他に良い方法があれば教えてください)

\rに加えて、そのループから抜け出すことをテストしたいとしましょう\n。ループから抜け出す機会が 1 回しかない場合、どうすればどちらかをテストできますか? switch私の目標は、ネストされたifs またはsをエミュレートできるようにすることif/else ifです。

4

3 に答える 3

4

Brain F*ck の基本的な LOGICAL で複雑な操作を実行するアルゴリズムを以下に示します :)

于 2010-08-10T05:59:17.390 に答える
3

リンクはまだ見ていませんが、ASHellyの答えはおそらくもっと普遍的に役立つと思います...しかし、以前はあえて指でBrainfuckを入力させたことがなかったので、今は同じくらい良いと判断しました時間と同じように、次のものを取得することができました。これはうまくいくと思います。

後半は、前半でとらえたものをプリントアウトするためだけのものです。また、私は嘘をつきません、これを解決しようとした後、私の脳は確かに完全に「めちゃくちゃ」に感じます...非常に適切な名前の言語ですね。

+
[
    >,
    ----------
    [
        ---
        [
            +++++++++++++
            >>
        ]
    ]

    <
    [
      >>
    ]
    <
]

++++++++++++
[
    <
]

>
[
    .>
]
于 2010-08-10T05:49:44.583 に答える
3

単一の BF 制御構造から始めて、より複雑な操作を表す一連のますます複雑になるシーケンスを定義する方法については、このページを参照してください。

于 2010-08-10T05:12:55.523 に答える