引用元:https://www.ioccc.org/2004/vik2.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/2004/vik2.hint
動作
素数列挙。
$ gcc -traditional-cpp -E '-DSTOP=_5' '-DFNAME="vik2_1.c"' vik2.c > vik2_1.c
$ gcc -E vik2_1.c > vik2_2.c
$ gcc -O vik2_2.c -o vik2
$ ./vik2
2
3
5
7
11
13
17
19
23
29
31
解説
純粋にCプリプロセッサでALUを構築し、その上で素数列挙を行っている。
vik2.hintで作者自身が言及している通り、ネタは[[1988/applin]]と同じだが、よりストイックな実装となっている。
#defineでマクロを定義するが、右辺値を常に省略する方針で実装されている(#define Xと定義したら、Xは1として定義される)。
そして、プリプロセッサのレベルで加算などの整数演算は行わず、#ifdefで処理するとのこと。
IOCCCのサイズ制限をクリアするために、プリプロセッサを2段にする必要があった(1段目では#define C #defineなどとして#defineなどを含むコードを生成する)。
あいにく1段階目は現代のgccでは動かないので-traditional-cppを用いた。
しかし-traditiona-cppと#include <stdio.h>は同時に利用できないので、#includeのほうをvik2.cから削除して通した。
パッチ
パッチをダウンロード