Brainfuck

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
ナビゲーションに移動 検索に移動
Wikipedia-logo.pngウィキペディアの生真面目ユーザーたちがBrainfuckの項目をおカタく解説しています。
ニコニコ大百科ではプレミアム会員がお金をかけてまでBrainfuckの記事を執筆しています。

Brainfuck(ブレインファック)は、難解なプログラミング言語のひとつ。誤解を避ける為に、敢えてしばしば「Brainf*ck」という表記もされる。言語仕様が極端に簡略化されており、可読性や実用性はまったくないもののチューリング完全であるため、実用性と実行速度を無視すれば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方言[編集]

ニコニコ大百科ではプレミアム会員がお金をかけてまでBrainfuck方言の記事を執筆しています。

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

命令文字列を置き換えただけのもの[編集]

3種類の文字列を2つ組み合わせて命令を実行するもの[編集]

  • Ook! - 「Ook.」「Ook?」「Ook!」の3種類の組み合わせで記述する、オランウータンのためのプログラミング言語。
  • Ikura - 「はーい」「ちゃーん」「ばぶう」の3種類の組み合わせで記述する、サザエさんに登場する波野イクラのためのプログラミング言語。

単純な文字列置換ではないもの[編集]

  • 長門有希 - 「…」と鍵括弧で記述するが、「…」で記載される命令間に区切り文字が必要。涼宮ハルヒの憂鬱に登場する長門有希がモチーフ。
  • A - 「A」のみで記述。これだけでは命令の区切れ目が分からないため、Aの個数が8進数の各桁として処理される。そのため「$」1文字を出力させるためだけでも「A」を8進数で22222260222222137041個(=10進数で329408205757660705個)書いた292.6ペタバイトの実行ファイルが必要となる。

追加仕様があるもの[編集]

外部リンク[編集]

備考[編集]

  1. 実際の刺身に載せるのは食用菊でありタンポポではない。