brainfuckで使えそうなテクニック集です。
説明は抜きにただ動作だけを書いてます。
配列の状態に依存するものが多いため必ず動くことは保証しません。
基本テクニック
問答無用でポインタが指し示している値を00
にする。
[-]
これはポインタの指し示す値を問答無用で00
にします。
なぜならポインタの指し示す値が00
でない場合は-
が行われて問答無用で00
にされるからです。
-
は+
でも良いでしょう。
Brainfuckの配列の状態はこのように変化します。
# ZZ=00~FF
...|ZZ|...
^[-]
...|00|...
^
ポインタを移動する時にかなり使う構文
[>]
これはポインタが00
となるような値を指し示すまで移動します。
<
の向きを変えれば逆向きに移動するし、>>
などにしたら一つ飛ばしにしてくれます。
可変長のデータ(入力された文字列など)などに対して頻繁に使います。
Brainfuckの配列の状態はこのように変化します。
# NN=01~FF
...|NN|NN|NN|NN|NN|NN|00|NN|NN|00|
^[>]
...|NN|NN|NN|NN|NN|NN|00|NN|NN|00|
^
not(簡単)
[[-]>-<]>+
ポインタの指し示す値のnotが隣の要素に入りますが、その時、 自分自身の値は消費されて消滅します。
Brainfuckの配列の状態はこのように変化します。
NN=01~FF
{*^=00の場合}
...|00|00|...
^[[-]>-<]>+
...|00|01|...
^
{*^=NNの場合}
...|NN|00|...
^[[-]>-<]>+
...|00|00|...
^
not(複雑)
[>]-[<]>>+
ポインタの指し示す値のnotが隣の要素に入ります。
この時、指し示す値が00
である場合を除いて、自分自身の値は消費されず保持されます。。
これは指し示した値が00
である場合に分岐したい場合によく利用します。
NN=01~FF
{*^=00の場合}
...|00|00|00|...
^[>]-[<]>>+
...|00|FF|01|...
^
{*^=NNの場合}
...|00|NN|00|...
^[>]-[<]>>+
...|00|NN|00|...
^