引用元:https://www.ioccc.org/2018/poikola/prog.c
審査員・作者による説明:https://www.ioccc.org/2018/poikola/hint.html
動作
北斗七星のアニメーションをする。
$ gcc -o prog prog.c
$ ./prog
端末の24ビットカラーの機能を使って、なるべく実際の星の色に近い色で表示される。
解説
天文学者のアニー・ジャンプ・キャノンが行ったスペクトル分類にしたがって色付きで北斗七星をアニメーションする。
審査員がコメントで書いている”Oh, Be A Fine Gal/Gentlemen, Kiss Me!”は、スペクトル分類のO、B、A、F、G、K、Mを暗記するためのフレーズ。
Fletcher-16のチェックサムアルゴリズムで自分自身を検証するので、下手にソースコードを編集すると動かなくなる。
とは言え、fopen(__FILE__)
しているだけなので、一旦プリプロセスを通したソースコードを作ってしまえば回避できる。
復活祭(イースターの日)に実行すると最後に”Lets find some Easter eggs”というメッセージが出る。
時計を変えなくても、プリプロセスしたソースコードを編集してtime_t j = 1522584000;
とすれば確認できる。
コードは星型形状。
__ATOMIC_SEQ_CST
のような定数を無意味に利用してわかりにくくしている。
Pascal風にbegin;
とend;
で書きたかったが、サイズの都合上B
/E
のマクロになっている。
printf()
は$
のマクロになっている。
47行目の巨大なfloat
型の数字は、IEEE 754の浮動小数点数を文字列として解釈すると、起動直後のメッセージになっていることがわかる。
$ ruby -e 'p [4612954808543207739097088.0, 207.285645, 214354950132336733650542884425029386240.0].pack("f3")'
"25th IOCCC!\x7F"
このプログラムには少なくとも3つの機能がある、とされているが、これはちょっと明確にはわからない。
北斗七星の描画、復活祭の日の判定、チェックサムアルゴリズム、でよいのだろうか。