Best Abuse of CPP

最高のCPP悪用

受賞者:Daniel Vik

引用元: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と定義したら、X1として定義される)。 そして、プリプロセッサのレベルで加算などの整数演算は行わず、#ifdefで処理するとのこと。

IOCCCのサイズ制限をクリアするために、プリプロセッサを2段にする必要があった(1段目では#define C #defineなどとして#defineなどを含むコードを生成する)。 あいにく1段階目は現代のgccでは動かないので-traditional-cppを用いた。 しかし-traditiona-cpp#include <stdio.h>は同時に利用できないので、#includeのほうをvik2.cから削除して通した。

パッチ

パッチをダウンロード