Brainfuck

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
移動先: 案内検索

Brainfuck(ブレインファック)は、プログラミング言語のひとつ。言語仕様が極端に簡略化されており、可読性や実用性はまったくないもののチューリング完全(nicodic)であるため、Brainfuck上でどんなプログラミング言語も動かすことができる。

Wikipedia-logo.pngウィキペディアの生真面目ユーザーたちがBrainfuckの項目をおカタく解説しています。
ニコニコ大百科の住民たちと時報女がBrainfuckの記事を書いているらしいです。

命令[編集]

以下の8つが実行可能である。これ以外はコメントとして無視される。

命令 実行内容
> ポインタをインクリメント(ポインタの位置を1つ進める)
< ポインタをデクリメント(ポインタの位置を1つ戻す)
+ 現在ポインタが指している値をインクリメント(+1する)
- 現在ポインタが指している値をデクリメント(-1する)
. 現在ポインタが指している値(の文字コード番号に該当する文字)を出力
, 現在ポインタが指している値に、入力から読み込んだ1バイトを代入
[ 現在ポインタが指している値が0であれば、対応する「]」の直後にジャンプ
] 現在ポインタが指している値が0でなければ、対応する「[」の直後にジャンプ

[編集]

例えば「E」と出力したい場合、「E」の文字コード番号は「69」なので、ポインタが指す値(初期値は0)に1を69回足してから出力すると「E」が出力される。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

次に「n」と出力したい場合、「n」の文字コード番号は「110」なので、ポインタが指す値(現在69)に1を41回足してから出力すると「n」が出力される。

+++++++++++++++++++++++++++++++++++++++++.

以下同様に、ポインタが指す値の+1と-1を繰り返すことにより、「Enpedia」の文字列を出力することができる。(以下のコード例ではコメントとして出力する文字とコード番号を付記している。)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. ← E:69
+++++++++++++++++++++++++++++++++++++++++. ← n:110=69+41
++. ← p:112=110+2
-----------. ← e:101=112-11
-. ← d:100=101-1
+++++. ← i:105=100+5
--------. ← a:97=105-8

ループの利用[編集]

Brainfuckにはジャンプを行える「[」「]」の命令が用意されているため、これを利用して「Enpedia」を出力するプログラムを短くすることができる。

「E」の文字コード番号「69」を「10×7-1」と考え、1を10回足す操作を7回繰り返してから1を引くことにすると、「E」を出力する部分の文字数が短くなる。

+++++++[>++++++++++<-]>-.

この間に何が起こっているのかを表にすると以下の通り。「←」で現在ポインタが指しているメモリを表す。

命令 メモリ[0] メモリ[1] 解説
初期値 0 0 メモリの初期値は0、ポインタはメモリ[0]が指されている。
+++++++ 7 0 ポインタが指す値に1を7回足す(ループ回数カウンタに使う。つまりあと7回)。
[ 7 0 ポインタが指す値が0ではないためスルー。
> 7 0 ポインタの位置を1つ進める。
++++++++++ 7 10 ポインタが指す値に1を10回足す。
< 7 10 ポインタの位置を1つ戻す。
- 6 10 ポインタが指す値から1を引く(ループあと6回)。
] 6 10 ポインタが指す値が0ではないため、「[」の直後に戻る。
>++++++++++<-] 5 20 ループあと5回。同じ処理を繰り返すため省略。
>++++++++++<-] 4 30 ループあと4回。
>++++++++++<-] 3 40 ループあと3回。
>++++++++++<-] 2 50 ループあと2回。
>++++++++++<-] 1 60 ループあと1回。
>++++++++++<-] 0 70 ループあと0回。ポインタが指す値が0のため、ループを抜け出す。
> 0 70 ポインタの位置を1つ進める。
- 0 69 ポインタが指す値から1を引く。
. 0 69 文字コード番号「69」、つまり「E」が出力される。

「n」の出力時にも同様にループを使うことで、「Enpedia」を出力するプログラムはこのようになる。

+++++++[>++++++++++<-]>-. ← E:69=10×7-1
<+++++++[>++++++<-]>-. ← n:110=69+6×7-1
++. ← p:112=110+2
-----------. ← e:101=112-11
-. ← d:100=101-1
+++++. ← i:105=100+5
--------. ← a:97=105-8

コメントと改行を除くと以下の通り。

+++++++[>++++++++++<-]>-.<+++++++[>++++++<-]>-.++.-----------.-.+++++.--------.

Brainfuck方言[編集]

以上のように命令が8つしかなく、それも「if」「do」「print」のように意味のある単語ではないため、これらの命令を他の文字列に置き換えたものが多数存在する。漫画やアニメなどで有名になった定型文に便乗して作られたものも多い。

この一覧は未完成です。加筆、訂正して下さる協力者を求めています。

外部リンク[編集]