コラム12. :IOCCC
IT界の「イグノーベル賞?」
近年、パソコンが安価になったり、プログラミング環境などがインターネットで無料で入手できるようになったりして、プログラミングがだれにでもできるようになり、学生向けのプログラミングコンテストやアプリコンテストなどが催されたりするようになりました。
こういったコンテストでは洗練されたプログラムやアプリのアイディア・使い勝手などが審査の基準になるのでしょうが、世界は広いもので、IOCCC,という、C言語を使った、実に奇妙なプログラミングコンテストがあるので、ここで紹介したいと思います。
IOCCCとは、The International Obfuscated C Code Contest(IOCCC, 国際難読化Cコードコンテスト)の略であり、その正式名称からわかる通り、「故意に難解なC言語のプログラムを書き、その読みにくさと複雑さを競う」という、実に不思議なコンテストです。
科学の世界にも、非常に変てこな研究を行っている研究者に与えられる「イグ・ノーベル賞」という賞がありますが、このコンテストは、さしずめプログラミング会のイグノーベル賞といったところでしょうか。
不思議なC言語のソースコード
では、このコンテストには一体どのようなソースコードが応募されているのでしょうか?簡単な例として、1987年「Best One Liner」受賞を受賞した、デビッド・コーン氏の作品を見てみましょう。
1987年「Best One Liner」受賞を受賞したソースコードmain() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
これを実行すると、正常にコンパイルされ、実行すると「unix」と表示されます。また、次のソースコードは円周率を計算するプログラムです。
円周率を計算するソースコードの例#define _ -F<00||--F-OO--; int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ }
円のような形のソースコードが、円周率を計算するなんて、本当に面白いですね。
更に、変ったものとしては、以下のような、もうほどとど「ASCIIアート」のようなものまでもちゃんとしたCプログラムで、きちんとコンパイル・実行できるというのだから驚きです。
図1.ASCIIアートのようなIOCCCのソースコードの例

こういうアイディアを考え付くのもすごいですが、それが実際に動くプログラムなのだから、本当に驚きですよね。
IOCCCの規約
そんなIOCCCですが、公式サイトで大会の理念を次のように説明しています。
- 大会ルールの元で最高に意味不明/難解なCプログラムを書くこと
- 皮肉なやり方でプログラミング作法の重要性を訴えること
- 普通書かないコードを用いてCコンパイラに負荷をかけること
- C言語の持つ、ある種の神秘性を解き明かすこと
- 粗雑なCコードに関して邪魔の入らない公開討論の場を提供すること
第一回大会は1984年に行われ、以降2006年まで年1回のペースで入賞者が発表されています。(2007年から2010年の間は開催されず)
なぜこのようなコンテストが開催されるようになったのか、そのきっかけは、初期の開催者であるLandon Curt Noll氏とLarry Bassel氏が、Bourne Shellのソースコード、および初期のBSDのfingerのソースコードを見たことを見たことに由来しているのだとか。とはいえ、一時期中断されていた時期があっても現在まで続いているというのは、プログラミングの世界にいかに「物好き」は「変った人」が多いか…という一つの証拠になりそうですね。