初心者のために説明すると、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
私の目標は、ネストされたif
s またはsをエミュレートできるようにすることif/else if
です。