引用元:https://www.ioccc.org/2012/tromp/tromp.c
審査員・作者による説明:https://www.ioccc.org/2012/tromp/hint.html
動作
バイナリラムダ計算のインタプリタ。
ヒルベルト曲線を描くプログラムを実行する例。
$ gcc -m32 -DInt=int -DX=4 -DA=500000 -o tromp tromp.c
$ ( cat hilbert.Blc; echo -n 1234 ) | ./tromp
_ _ _ _ _ _ _ _
| |_| | | |_| | | |_| | | |_| |
|_ _| |_ _| |_ _| |_ _|
_| |_____| |_ _| |_____| |_
| ___ ___ | | ___ ___ |
|_| _| |_ |_| |_| _| |_ |_|
_ |_ _| _ _ |_ _| _
| |___| |___| |_| |___| |___| |
|_ ___ ___ ___ ___ _|
_| |_ |_| _| |_ |_| _| |_
| _ | _ |_ _| _ | _ |
|_| |_| | |___| |___| | |_| |_|
_ _ | ___ ___ | _ _
| |_| | |_| _| |_ |_| | |_| |
|_ _| _ |_ _| _ |_ _|
_| |___| |___| |___| |___| |_
素数列挙。素数番目のビットが1になっている。
$ cat primes.blc | ./tromp -b
001101010001010001010001000001010000010001010001000001000001010000010001010000010001000001000000010001010001010001000...
解説
バイナリラムダ計算は、作者自身が開発したラムダ計算のバイナリ表現方法。
拡張子が.Blcなファイルはバイナリ表現のソースコードで、.blcはテキスト表現(0
と1
の列)。
テキスト表現のソースコードを実行するときは”-b”というコマンドライン引数を与える。
入力のバイト列は、長さ8のブーリアンのリストのリスト(チャーチエンコーディングによって表現されている)によって渡される。
同じフォーマットのデータを評価結果とすることで、出力もできる。
入力をそのまま出力するプログラムは、引数をそのまま返す恒等関数(\x x
)なので、0010
とエンコードされる。
4ビットなので、「ハーフバイト」と主張している。
hint.textには、自分自身のインタプリタ、素数のふるい、ヒルベルト曲線、BrainFuckインタプリタなどのサンプルコードが掲載されている。
実装詳細は見ていないが、問いかけがあるので興味のある人は見てほしい。
how13ファイルに、大まかなデータ構造と各変数および関数の目的が書かれているので、解析するときは参考になる。