The most obscure program

もっとも不明瞭なプログラム

受賞者:Lennart Augustsson

引用元:https://www.ioccc.org/1985/august/august.c

審査員・作者による説明:https://www.ioccc.org/1985/august/hint.html

動作

2進数表記で素数を列挙する。

$ gcc -o august august.c

$ ./august

10
11
101
111
1011
1101
10001
10011
10111
11101
11111
100101
...

解説

初の数学ネタの作品。

関数ポインタと再帰とループとリスト構造が無駄に駆使されたプログラムが本体であり、それをマクロで圧縮している。 struct bstruct cと変数名bcがいやらしい形で同居しており、賞名の通り、かなり見通しが悪いプログラムとなっている。

素数列挙アルゴリズム自体は、試し割りだと思う。 これまでの発見した素数のリストを保持していて、このリストを再帰呼び出しを使ってそのリストをたどりつつ、リストのノードが持つ素数で割り切れたら検査対象の数を1増やして再挑戦する、ということを行っている。 全貌をきちんと理解できていないが、リストをたどるのは関数vであり、末端に到達したら関数uによってインクリメントする、という構造になっている。 2進数表記はmain関数の再帰で実現している。