Best Abuse of the C Preprocessor
Cプリプロセッサの最高の悪用
受賞者:David Gibson
引用元:https://www.ioccc.org/1993/dgibson.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1993/dgibson.hint
動作
ライフゲーム。life.dに初期盤面を入れておく。
$ cat life.d
LIFE
L _ _ _ _ _
L _ _ _ O _
L _ O _ O _
L _ _ O O _
L _ _ _ _ _
GEN 0
END
1世代すすめる。
$ gcc -ansi dgibson.c -o dgibson
$ ./dgibson
LIFE
L _ _ _ _ _
L _ _ O _ _
L _ _ _ O O
L _ _ O O _
L _ _ _ _ _
GEN 1 STAT 329040
END
見ての通りこの出力は初期盤面と同じフォーマットになっているので、life.dを更新して再コンパイルするとさらに次の世代が求められる。
$ ./dgibson > life.d
$ gcc -ansi dgibson.c -o dgibson
$ ./dgibson
LIFE
L _ _ _ _ _
L _ _ O _ _
L _ _ _ O _
L _ O O O _
L _ _ _ _ _
GEN 2 STAT 328960
END
解説
dgibson.cの最後で#include "life.d"
としているとおり、この盤面のフォーマットはdgibson.cで定義されたマクロで展開することで有効なCコードとなる。C言語での組み込みDSLと言える。
こんな大きいのも動くので良い。ビルドにちょっと時間がかかるが、実行は一瞬。
$ time gcc -ansi dgibson.c -o dgibson
real 0m2.400s
user 0m2.179s
sys 0m0.211s
$ ./dgibson
LIFE
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ O _ _ O _ _ _ _ O _ O O O O O _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _
L _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O _ _
L _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _
L _ _ _ _ _ _ _ _ O O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O _
L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ O _
L _ _ _ _ _ _ O O O O O _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ O _ O O _ _ O _ O _ _
L _ _ _ O O _ _ _ _ _ O O _ _ _ _ O _ _ _ _ O O O O O O O _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _
L _ _ O _ _ _ O O O _ _ O _ _ O O O _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _
L _ O _ _ _ O _ _ _ _ _ O O _ O O _ _ _ O O O O O O O O O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _
L _ O _ _ _ _ _ O _ _ _ O _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O O O _
L _ O _ _ O _ _ O _ _ _ _ _ O O O _ O O O O O O O O O O O O O O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _
L _ _ O _ O _ _ O O _ O _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ O _ O O _ _ O _ O _ _
L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O O O O O O O O O O O O O O _ O O O _ _ _ _ _ O _ _ O _ _ O _
L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ O _ _ _ O _ _ _ _ _ O _
L _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O O O O O O O O O _ _ _ O O _ O O _ _ _ _ _ O _ _ _ O _
L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ O O O _ _ O _ _ O O O _ _ _ O _ _
L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ O O O O O O O _ _ _ _ O _ _ _ _ O O _ _ _ _ _ O O _ _ _
L _ _ O _ O _ _ O O _ O _ _ _ _ _ _ _ _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ O O O O O _ _ _ _ _ _
L _ O _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _
L _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O O _ _ _ _ _ _ _ _
L _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _
L _ _ O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _
L _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ O O O O O _ O _ _ _ _ O _ _ O _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
GEN 2 STAT 3089152
END