Most functional

もっとも関数的

受賞者:John Tromp

引用元: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はテキスト表現(01の列)。 テキスト表現のソースコードを実行するときは”-b”というコマンドライン引数を与える。

入力のバイト列は、長さ8のブーリアンのリストのリスト(チャーチエンコーディングによって表現されている)によって渡される。 同じフォーマットのデータを評価結果とすることで、出力もできる。

入力をそのまま出力するプログラムは、引数をそのまま返す恒等関数(\x x)なので、0010とエンコードされる。 4ビットなので、「ハーフバイト」と主張している。 hint.textには、自分自身のインタプリタ、素数のふるい、ヒルベルト曲線、BrainFuckインタプリタなどのサンプルコードが掲載されている。

実装詳細は見ていないが、問いかけがあるので興味のある人は見てほしい。 how13ファイルに、大まかなデータ構造と各変数および関数の目的が書かれているので、解析するときは参考になる。