前回で「Grass 言語でナベアツ」を紹介して、これで無事に「ナベアツ編」は完結して次の課題に進める、と考えていたが、やはり一つ心残りなことがある。このブログの愛読者であれば容易に想像が付くと思われるが、それは、
「Brainfuck でナベアツ」をやっていない
ことである。
このまま放ってしまうと後々に後悔する羽目になる……というわけで、ナベアツを作ってみた。
>>>+>>>>>+[->>>>,+>+<[->-]>[->]<+<[---------->-]>[ ->]<+<[++<++++++++[->-----<<<+<++++++>>>]<<+>>>>>> +++>+<<<-]>[->]>>]<<<<<+++>>++++++++++++++++[->++> ++++++>++++>++++++>+++++++>++++>+++++++>+++++++>++ +++++>++++++++>++++++++<<<<<<<<<<<]>>---->+>++++++ ++>->++++++>->-->++++>----->---<<<<<<<<<<<<<<<<<<< +[-<<+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[> >>>>>>>]>+[<<<<+[->[-]+<<<<+<[-<+>>-]>[-<+++++++++ <---------<<<+>>>>>>]>>+>>[-<<-]<<[->>+++++++++<<< <]<<<<<<]>>>[>>>>>>>>]>>>->+<[<+<<<[<<<<<<<<]<<<<[ >>>>>[>>>>>>>>]>>-<<<<<<<]<<<[>>>>>>>>]>>>>-]>[-<+ ++<+>>>]<<<[->>+>>>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<] <<<<[<<<<<<<<]>>[.>>>>>>>>]>>>>[->>>>>>>>>>>>.<<<< <<<<<<<<]>>.<<<<<<<<<+[-<<[->>>>>[>>>>>>>>]>-<<<<< +<]+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[>>> >>>>>]>]
あとは、ネットで適当に「Brainfuck on TeX」の実装を見つけて、それで実行させれば OK!
……と思ったら、ここにきて困った事態が発生した。TeX 言語による Brainfuck 処理系の実装(で、LaTeX(や plain TeX)を破壊しないもの*1が、
全く存在しない
のである。Brainfuck といえば、Turing 完全な言語の中で処理系の実装が最も容易だと言われている。TeX 上で LISP が動く現在において、最も基本の Brainfuck の処理系実装がないとは、世の TeX 芸人達は余りにも迂闊ではないか……!
嘆いていても仕方がないので、作ってみた。
- bxbluf パッケージ(Gists/zr-tex8r)
パッケージのインタフェースは bxgrassator/ixgrassator パッケージと同様のものにしている。ただし Brainfuck のプログラムソースは LaTeX の特殊文字を含まないので、verbatim 扱いの環境ではなくて命令の形式を用いた。(Brainfuck ソースを表す引数は完全展開されてから解釈される。)
\execbf{<Brainfuckソース>}
: 引数に書かれたプログラムを入力(標準入力から読み込まれるバイト列)を空として実行する。出力(標準出力へ書き出されるバイト列)はそのまま LaTeX への入力(LaTeX ソース)として実行される。\execbfwithinput{<入力>}{<Brainfuckソース>}
: 入力を引数として指定する他は\execbf
命令と同じ。\procbf{\制御綴}{<Brainfuckソース>}
: 「内容のプログラムを実行する」という命令を\制御綴
として定義する。つまり、後で\制御綴{<入力>}
を実行するとプログラムが実行される。\execbf*{<Brainfuckソース>}
\execbfwithinput*{<入力>}{<Brainfuckソース>}
\procbf*{\制御綴}{<Brainfuckソース>}
: verbatim 版。*
なしの命令と同様だが、出力は LaTeX ソースではなく単なる文字列と解釈されそのまま出力される。
これを使って先に示したプログラムを実行してみる。
\documentclass[a4paper]{article} \usepackage{bxbluf} \usepackage{type1cm} \newcommand*\AhoFont[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}} %!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BEGIN BF code \procbf{\NabeAzz}{ >>>+>>>>>+[->>>>,+>+<[->-]>[->]<+<[---------->-]>[ ->]<+<[++<++++++++[->-----<<<+<++++++>>>]<<+>>>>>> +++>+<<<-]>[->]>>]<<<<<+++>>++++++++++++++++[->++> ++++++>++++>++++++>+++++++>++++>+++++++>+++++++>++ +++++>++++++++>++++++++<<<<<<<<<<<]>>---->+>++++++ ++>->++++++>->-->++++>----->---<<<<<<<<<<<<<<<<<<< +[-<<+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[> >>>>>>>]>+[<<<<+[->[-]+<<<<+<[-<+>>-]>[-<+++++++++ <---------<<<+>>>>>>]>>+>>[-<<-]<<[->>+++++++++<<< <]<<<<<<]>>>[>>>>>>>>]>>>->+<[<+<<<[<<<<<<<<]<<<<[ >>>>>[>>>>>>>>]>>-<<<<<<<]<<<[>>>>>>>>]>>>>-]>[-<+ ++<+>>>]<<<[->>+>>>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<] <<<<[<<<<<<<<]>>[.>>>>>>>>]>>>>[->>>>>>>>>>>>.<<<< <<<<<<<<]>>.<<<<<<<<<+[-<<[->>>>>[>>>>>>>>]>-<<<<< +<]+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[>>> >>>>>]>] }%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! END BF code \begin{document} \NabeAzz{40} \end{document}
というわけで、「LISP や Grass 言語はちょっと苦手…」という人も、もはや悩む事は無用である。