第22回IOCCCで入賞した”とある”ソースコード
はじめに
第22回IOCCC(International Obfuscated C Code Contest、国際難解Cコードコンテスト http://ioccc.org/ )が開催され、1月3日にそのソースコードが公開されました。
受賞したコードの中で、Most catty賞を受賞したとあるコードに目が止まったので、紹介します。
misaka プロジェクト
ソースコード入手
以下で公開されているmisakaというコードから以下の3ファイルを入手しましょう。(名前で察し…)
http://ioccc.org/years.html#2013
$ wget http://ioccc.org/2013/misaka/Makefile $ wget http://ioccc.org/2013/misaka/bf.pl $ wget http://ioccc.org/2013/misaka/misaka.c
ビルド
下記のページの記載に従ってビルドします。
http://ioccc.org/2013/misaka/hint.html
$ make misaka cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka.c -o horizontal_cat rm -f misaka2.c ./horizontal_cat misaka.c misaka.c > misaka2.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka2.c -o vertical_cat rm -f misaka3.c ./vertical_cat misaka.c misaka.c > misaka3.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka3.c -o long_cat rm -f misaka4.c ./vertical_cat misaka.c misaka.c misaka.c > misaka4.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka4.c -o loong_cat rm -f misaka5.c ./vertical_cat misaka.c misaka.c misaka.c misaka.c > misaka5.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka5.c -o loooong_cat rm -f misaka6.c ./vertical_cat misaka.c misaka.c misaka.c misaka.c misaka.c > misaka6.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka6.c -o loooooooong_cat rm -f misaka7.c ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - > misaka7.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka7.c -o long_fat_cat rm -f misaka8.c ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - - > misaka8.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka8.c -o long_faat_cat rm -f misaka9.c ./horizontal_cat misaka.c misaka.c | ./vertical_cat misaka.c - > misaka9.c cc -Wall -W -Wno-comment -Wno-empty-body -std=c99 -O2 misaka9.c -o same_as_long_cat
Makefileに従って、〜catという実行バイナリが出来上がります。
horizontal_catが文字列の水平連結、vertical_catが文字列の垂直連結を行う実行バイナリになっています。
$ ls -l 合計 264 drwxrwxr-x 2 psy psy 4096 1月 7 22:37 ./ drwxr-xr-x 43 psy psy 4096 1月 7 22:37 ../ -rw-rw-r-- 1 psy psy 5559 1月 4 07:46 Makefile -rwxrwxr-x 1 psy psy 6796 1月 4 07:46 bf.pl* -rwxrwxr-x 1 psy psy 12055 1月 7 22:37 horizontal_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 long_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 long_faat_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 long_fat_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 loong_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 loooong_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 loooooooong_cat* -rw-rw-r-- 1 psy psy 3808 1月 4 07:46 misaka.c -rw-rw-r-- 1 psy psy 8415 1月 7 22:37 misaka2.c -rw-rw-r-- 1 psy psy 7616 1月 7 22:37 misaka3.c -rw-rw-r-- 1 psy psy 11424 1月 7 22:37 misaka4.c -rw-rw-r-- 1 psy psy 15232 1月 7 22:37 misaka5.c -rw-rw-r-- 1 psy psy 19040 1月 7 22:37 misaka6.c -rw-rw-r-- 1 psy psy 16830 1月 7 22:37 misaka7.c -rw-rw-r-- 1 psy psy 25200 1月 7 22:37 misaka8.c -rw-rw-r-- 1 psy psy 12223 1月 7 22:37 misaka9.c -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 same_as_long_cat* -rwxrwxr-x 1 psy psy 12056 1月 7 22:37 vertical_cat*
下記のコマンドの実行結果を見る事で、プログラムの概要が掴みやすくなります。
$ make understanding
実行してみる
$ ./long_cat o""8o o" "8 o88ooo o8 8 "8 ""8ooo8"""" 8o "8o oooo 88 8 o""8 o"8" ""oo8ooo o""""oo""""""88oooo8 8oo8 8o8o "8o 8o 8 "" """8oo "8o "8ooooooooo 8 o "8o 8 "8oo "o """" o8"8ooooo8" "8oo "8ooo ooo8"" "8 ""ooo888""""" 8 8 8 8 8 8 8 8 8
猫が出てきました。
% ./loong_cat o""8o o" "8 o88ooo o8 8 "8 ""8ooo8"""" 8o "8o oooo 88 8 o""8 o"8" ""oo8ooo o""""oo""""""88oooo8 8oo8 8o8o "8o 8o 8 "" """8oo "8o "8ooooooooo 8 o "8o 8 "8oo "o """" o8"8ooooo8" "8oo "8ooo ooo8"" "8 ""ooo888""""" 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
猫の胴が伸びました。
他の実行バイナリも、名前の通りの出力結果となります。
で、何が凄いの?
以下のコマンドを実行してみます。
$ seq -f '%.0f ' 45 | ./horizontal_cat - misaka.c
あっ…。
% seq -f '%.0f ' 90 | ./horizontal_cat - misaka9.c
ああっ…。これは「ミサカ盛り」(ミサカ盛り - Google 検索) では…。
これでも立派なCのソースコードです。
何故、このソースコードをビルドするとあの猫が表示される実行バイナリが出来上がるのか(唖然
おわりに
プログラムの作者であるDon Yang氏は2005年よりGoogleでSoftware Engineerとして働いている方だそうですが、他の作品も自身のWebサイト上に公開されています。ビックリする事請け合いです(笑)