Brainf*ckはEOFの扱いがびみょーだよなあと思ってた。
バイナリデータのechoとかもできないし。どうもWikipediaにのってるくらい有名なびみょーどころだったみたい。
http://en.wikipedia.org/wiki/Brainfuck#End-of-file_behavior
16-bit、32-bitのセルを持つBFね。効率的にはどうなんだか、今度試してみよう。
EOFも考えたecho.bf
こう書くかな。でもメモリ領域がbyteの配列だとバイナリを入力とした時の出力が入力と一致しない。
,+[-.,+]
速度比較やってみた。
% time (repeat 10 ./bfi_uchar quine2.b >/dev/null) 2.076 user 0.028 system 2.109 total % time (repeat 10 ./bfi_int quine2.b >/dev/null) 1.744 user 0.032 system 1.784 total % time (repeat 10 ./bfi_uchar echo.bf </usr/include/X11/Xlib.h >hoge) 0.308 user 0.040 system 0.353 total % time (repeat 10 ./bfi_int echo.bf </usr/include/X11/Xlib.h >hoge) 0.276 user 0.044 system 0.318 total
intのが良さげかな。
quine2.bはhttp://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aBrainfuckから拾ってきたもの。処理系のコードは適当に書いたこんなの(リンク先のはbfi_intのもの)。bfi_ucharとbfi_intの違いはメモリ領域が前者unsigned charの配列、後者intの配列というだけ。