Brainfuckのサンプルコード集
Brainfuck
みんな大好きBrainfuckです.
この記事は,完全に個人用なのでクオリティは無視して下さい.
個人で作っているブラウザ上で動作するインタプリタはこちら.
Sample Codes
Hello, world!
いくつか種類がある.
「w」が小文字か大文字か,または「,」や最後の「\n」の有無によっても変わってくるが,一番短いのはこれ.
1 | +[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+. |
17,896ステップと,Hello, World!のくせにかなり難解.
これを実行できるインタプリタは,1バイト文字およびポインタのオーバーフローとアンダーフローに対応していないと実行できない.
(ポインタが先頭のときにデクリメントをしたら,ポインタは最後尾を指すようになる等)
単純な「Hello, world!」の場合こんな感じ.
1 2 | +++++++++[->++++++++>+++++++++++>+++++<<<]>.>++.+++++++..+++.>-. ------------.<++++++++.--------.+++.------.--------.>+. |
384ステップ (改行含む).
ASCII出力
全てのASCIIコード文字を出力するコード.
とてもシンプル.
1 | .+[.+] |
FizzBuzz
有名な言葉あそび.
1 2 3 4 5 | ++++++[->++++>>+>+>-<<<<<]>[<++++>>+++>++++>>+++>+++++>+++++>>>>>>++>>++< <<<<<<<<<<<<<-]<++++>+++>-->+++>->>--->++>>>+++++[->++>++<<]<<<<<<<<<<[-> -[>>>>>>>]>[<+++>.>.>>>>..>>>+<]<<<<<-[>>>>]>[<+++++>.>.>..>>>+<]>>>>+<-[ <<<]<[[-<<+>>]>>>+>+<<<<<<[->>+>+>-<<<<]<]>>[[-]<]>[>>>[>.<<.<<<]<[.<<<<] >]>.<<<<<<<<<<<] |
13,063ステップ.
入力をそのまま出力
Brainfuckの得意分野(?)
1 | ,[.,] |
100までの素数
1 2 3 4 5 | >++++[<++++++++>-]>++++++++[<++++++>-]<++.<.>+.<.>++.<.>++.<.>------..<.> .++.<.>--.++++++.<.>------.>+++[<+++>-]<-.<.>-------.+.<.> -.+++++++.<.> ------.--.<.>++.++++.<.>---.---.<.> +++.-.<.>+.+++.<.>--.--.<.> ++.++++.<.> ---.-----.<.>+++++.+.<.>.------.<.> ++++++.----.<.> ++++.++.<.> -.-----.<.> +++++.+.<.>.--. |
参考:http://hakugetu.so.land.to/program/brainfuck/1-4.php
453ステップ
02~1002までを出力
1 2 3 | ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+ >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<] <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-] |
157,267ステップ.
長い.ここまでくるとサーバスペックや,実装言語,実装の仕方によって出力までにかかる時間に差が出る.
私が作ったBrainfuckインタプリタは,インタプリタ自体はC++なので問題はないけれど,サーバスペックの問題でレスポンスはやや遅い.
Pythonのみで作成した場合,かなり遅くなると思う.
値の移動
1 | >[-]<[->+<] |
単体で41ステップ.
上は1つ右隣に移動するパターン.
2つ移動したければ,
1 | >>[-]<<[->>+<<] |
もし,{5 | 0 | 0}を{0 | 5 | 0}にしたければ,このように使う.
1 2 | +++++ # {5|0|0} >[-]<[->+<] # {0|5|0} |
メモリのセルサイズ算出
1 2 3 4 5 6 7 8 9 10 11 12 13 | ++++++++[>++++++++<-]>[<++++>-] +<[>-< [>++++<-]>[<++++++++>-]<[>++++++++<-] +>[> ++++++++++[>+++++<-]>+.-.[-]< <[-]<->] <[>> +++++++[>+++++++<-]>.+++++.[-]< <<-]] >[> ++++++++[>+++++++<-]>.[-]< <-]< +++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<. >>.++.+++++++..<-.>>- [[-]<] |
スペース改行含めて2,232ステップ.
もしメモリのセル上限値が255であれば「8 bit cells」と出力される.
コメントをつけると以下のような感じ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 256という値を計算し,それが0になるか否かを確認する ++++++++[>++++++++<-]>[<++++>-] +<[>-< # 0にならなければ256をもう一度かけて65536にする [>++++<-]>[<++++++++>-]<[>++++++++<-] +>[> # Print "32" ++++++++++[>+++++<-]>+.-.[-]< <[-]<->] <[>> # Print "16" +++++++[>+++++++<-]>.+++++.[-]< <<-]] >[> # Print "8" ++++++++[>+++++++<-]>.[-]< <-]< # Print " bit cells\n" +++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<. >>.++.+++++++..<-.>>- # Clean up used cells. [[-]<] |
なかなか難解.
参考:https://esolangs.org/wiki/Brainfuck#Examples