読者です 読者をやめる 読者になる 読者になる

第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

f:id:erumoto:20140107233342p:plain

あっ…。

% seq -f '%.0f  ' 90 | ./horizontal_cat - misaka9.c

f:id:erumoto:20140107233357p:plain

ああっ…。これは「ミサカ盛り」(ミサカ盛り - Google 検索) では…。
これでも立派なCのソースコードです。
何故、このソースコードをビルドするとあの猫が表示される実行バイナリが出来上がるのか(唖然

おわりに

プログラムの作者であるDon Yang氏は2005年よりGoogleでSoftware Engineerとして働いている方だそうですが、他の作品も自身のWebサイト上に公開されています。ビックリする事請け合いです(笑)

http://uguu.org/sources.html