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方言[編集]
以上のように命令が8つしかなく、それも「if」「do」「print」のように意味のある単語ではないため、これらの命令を他の文字列に置き換えたものが多数存在する。漫画やアニメなどで有名になった定型文に便乗して作られたものも多い。
命令文字列を置き換えただけのもの[編集]
- あえぎ声記述言語 - 喘ぎ声で記述。
- うおおおおおおおおおおおおおおおお - 「う」「お」の2文字で記述。
- おっぱい言語 - おっぱいに関する言葉で記述。
- KQ - 京急電鉄の車掌のアナウンス「ドア閉めます」の空耳「ダァシエリイェス」で記述。
- Kemono - けものフレンズに登場するセリフで記述。
- クロオビー - 柔道に関する単語で記述。
- ゲロ言語 - 「漏れそう」「助けて」「トイレ近い」などで記述。
- Gochiusa - ご注文はうさぎですか?の主題歌「Daydream café」の歌詞で記述。
- ジョジョ言語 - ジョジョの奇妙な冒険に登場するセリフで記述。
- にこ言語 - 「にっこにっこにー」など、ラブライブ!の登場人物である矢澤にこのセリフで記述。
- Nyaruko - 這いよれ!ニャル子さんの主題歌「太陽曰く燃えよカオス」の歌詞や合いの手で記述。
- neko mimi Fu**♥ - 月詠 -MOON PHASE-の主題歌「Neko Mimi Mode」のセリフで記述。
- BF-BASIC'n - ログインやファミコン通信に掲載されていた4コマ漫画「べーしっ君」に登場する擬音あるいは奇声で記述。
- Misa - みさくら語で記述。コメントを活用し、みさくらなんこつのセリフ回しで記述することを主目的としている。
- MONAmona - 「MONAmona」の8文字で記述。
3種類の文字列を2つ組み合わせて命令を実行するもの[編集]
- Ook! - 「Ook.」「Ook?」「Ook!」の3種類の組み合わせで記述する、オランウータンのためのプログラミング言語。
- Ikura - 「はーい」「ちゃーん」「ばぶう」の3種類の組み合わせで記述する、サザエさんに登場する波野イクラのためのプログラミング言語。
単純な文字列置換ではないもの[編集]
- 長門有希 - 「…」と鍵括弧で記述するが、「…」で記載される命令間に区切り文字が必要。涼宮ハルヒの憂鬱に登場する長門有希がモチーフ。
- A - 「A」のみで記述。これだけでは命令の区切れ目が分からないため、Aの個数が8進数の各桁として処理される。そのため「$」1文字を出力させるためだけでも「A」を8進数で22222260222222137041個(=10進数で329408205757660705個)書いた292.6ペタバイトの実行ファイルが必要となる。
追加仕様があるもの[編集]
- コミュ障プログラミング言語 - 「アア…」「エット…」「サセン…」など、コミュ障の発する言葉で記述。
- てってってー - ゲーム「アイドルマスター」のBGM「TOWN」の通称、「てってってー」で記述。
- BrainCrash - 「Hello, world!」を出力するのが世界一簡単なプログラミング言語。その仕様から、それ以外のプログラムを記述する場合にはひと工夫が必要になる。
外部リンク[編集]
- Brainfuckコードジェネレータ - 任意の文字列を出力するBrainfuckプログラムを作成できる(UTF-8対応)。
- Brainfuckで書かれたBrainfuck自身のインタプリタ(実行用プログラム)
- Brainf*ck系言語を作るやつ(リンク切れ) - Twitterアカウントで認証し、8個の命令を入力することで自由にBrainfuck方言を作成できる。
- Sashiminf*ck - 刺身の上にタンポポのせる仕事[1]ことでBrainfuckの処理系を実装している。
備考[編集]
- ↑ 実際の刺身に載せるのは食用菊でありタンポポではない。