なにがしたいの???
WikipediaによるとどうやらBrainFuckはチューリング完全で計算能力的にはC言語と同等らしい(ほんまに?)ので、簡単なC言語をBrainfuckに直したい!!!あくまで自分のための記録用。
用語
単語を調べるのが面倒で自分で言葉を作っているかもしれないのでここでしか使われていない可能性のある単語を一応羅列します(必要があればさらに追加します)
- セル
Brainfuckで使われるバイト列の一つ一つのマス。セル0から始まってセル1, セル2,,,という感じで数えます。 - 右/左
Brainfuckのバイト列の正/負の方向
注意点
断りのない限り各セルは最初に0に初期化され、ポインタはセル0を指しているものとします。
全てのセルは非負整数であるとして、負の数を取らないようにしますし、負の数が扱われることはないという前提で進みます。負の値を入れた場合の処理は現段階では保証しません。やる気が出たら考えます。
短文(関数?)集
セルのコピー
セル0に予めなんらかの値を与えます。
[->+>+<<]
実行後はセル0の内容がセル1とセル2に書き込まれます。ただし、セル0自身は0になり、ポインタはセル0を指します。
セルの移動
セル1に予めなんらかの値を与えます。最初ポインタはセル1を指しています。
[->+<] #右移動
[-<+>] #左移動
実行後、右移動ではセル1にあった内容がセル2に書き込まれ、セル1は0になります。左移動ではセル1にあった内容がセル0に書き込まれ、セル1は0になります。ポインタはセル1(最初の位置)を指します。上のセルのコピーはこれの応用です。
回数指定の繰り返し
セル0に繰り返し回数を指定します。これには複数の書き方がありますが、そのうち一つを紹介します。
[->(some process)<]
(some process)の最初と最後でポインタの位置が同じでないといけません。実行後は(some process)がセル0の数字の回数だけ繰り返されたあとセル0が0になって、ポインタがセル0を指します。
掛け算
セル0とセル1に予めなんらかの値を与えます。
[->[->+>+<<]>>[-<<+>>]<<<]
実行後はセル0とセル1の積がセル2に書き込まれ、セル0が0、セル1は変化せず残ります。ポインタはセル0を指します。セル1がそのまま残って汚いですね。
ゼロ初期化
セル0に何らかの値を入れます。
[-]
実行後、セル0は0になります。
さいごに
思いつき次第いくらでも追記します。