ICFP Programming Contest 2010 優勝

   Pure Pure Code ++
Language: C++, Haskell, Python
... are the programming
languages of choice for
discriminating hackers.

今年のICFP Programming Contestにて優勝しました。(コンテスト中の様子は http://d.hatena.ne.jp/tanakh/20100702#p1 こちらにあります)

一次ソース(http://www.icfpcontest.org/2010/)はまだ来ていませんが、今年のICFP@ボルチモアにて表彰されてきました。こちら(http://twitpic.com/2swi5c)に証拠写真がアップロードされています。

Our Score: 13597.354
Our Solved: 3451
Our Cars: 72
>=5 users: 15 unsolved
3-4 users: 262 solved, 36 unsolved
2 users: 496 solved, 12 unsolved
Monopoly: 253 unsolved
91% of the Market are belong to us

最終的なスコアはこのような感じでした。特筆すべきは2 usersの占有率の高さで、508個中496個をうちのチームが解いています。しかも、リファレンス解答よりもサイズが小さいものも半分ぐらいあり、ここだけで250近い定期収入がありました。データが出てきたときにはちょっと信じられなくて何度か確かめたのですが、どうやら間違いはなさそうでした。どうしてこうなったのかは当の本人にもよくわかりませんが、コツコツソルバを改良していたのがよかったのかなと思います。http://d.hatena.ne.jp/wata_orz/20100622/1277229671 おそらくこのような被害者をたくさん作ってしまったんじゃないかと思います。でも、責任をとって優勝してきました!

本当に本当に、とても嬉しいです。同時に、やっと勝てた、という安堵の気持ちがあります。2004年に初参加して以来毎年参加していて、今年で7度目の参加です。初参加でいきなり3位になり(http://d.hatena.ne.jp/tanakh/20040926#p1)、次の年で同じく3位ながらも入賞を果たした(http://d.hatena.ne.jp/tanakh/20050930#p1)ときには、なんだかよくわからないけど、そのうち1位は取れるものだと思っていました。ところがその次の年は人数制限に泣き、さらに次の年は5位に入ったものの、それ以降は年々順位は右肩下がりで、もう勝てないんじゃないかと年々衰え行く脳みそを嘆いたりしていました。

しかし、諦めるものではありませんね。ずっと頑張っていれば報われることもあるようです。今年はチームメイトに恵まれました。これだけのメンバが6人も集まれば、文殊をも凌駕します!改めてチームの皆様に感謝します。ぴゅあぴゅあこーどの一員になれて本当によかったです。

さて、我々がDiscriminating Hackersと認められたと同時に、我々の使ったプログラミング言語にはDiscriminating Hackersの選ぶ言語として、今年一年間無制限に宣伝する権利が与えられます。何を選ぶか大変に悩みました。さすがに6人もいるとなかなか合意が得られません。というより、私以外に特に選びたい言語がある人がいないようです。私は断然Haskellを推しますが、さすがに私しか使っていない言語を選ぶのも気が引けます。はてはて、何時まで経っても決まらず、一時は間を取って(?)"crontab"にするという案も挙がりましたが、果たしてcrontabは"プログラミング言語"なのか、というそもそもの議論からして、やはり自粛すべしということになりました。crontabがDiscriminating Hackersの言語になっても喜ぶ人だれもいないですし。

結局言語選びは表彰式当日まで縺れました。最終的には、"ひとつに選べる言語はない"。強いて挙げるなら、使った言語の中で、まともにプログラミングに用いられた"C++, Haskell, Python"の3つがそれである、との結論に至りました。これらの順番には意味がないことを注記しておきます。単に辞書順です。

C++は焼きなましソルバに用いられました。焼きなましソルバに求められるのは他の全てを差し置いて速度です。速度以外に何も必要ないのでC++で書かれました。普段、Haskellでも高性能なプログラムを書けると主張している私ですが、この選択は間違っていません。他ならぬ私が書いたものです。C++で高速なプログラムを書くのは圧倒的に簡単です。普段ならともかく、時間の限られている中では、チューニングの手間がかからないC++がベストです。

Haskellは回路記述に用いられました。Haskellが使われたのは、単に私が書いたからという理由以外にはないかもしれませんが、Lava(http://hackage.haskell.org/package/xilinx-lava)などを挙げるまでもなく、このような用途にHaskellが適していることに異論はないでしょう。開始〜夜明けまでに回路ジェネレータが動いたのはHaskellのおかげだと思っています。その他、Haskellは一部の特殊ソルバなど、私専用スクリプティング言語として働いてくれました。

Pythonはその他ほぼすべての用途に用いられました。大きいのは、CGIと特殊ソルバでしょうか。CGIは制約式の可視化及び、行列表記によるサブミット、ログ蓄積とかなり重要なインフラでした。用意されたCGIでは、解いた問題や作った車すら分からなくなる仕様でしたので、このようなインフラは縁の下の力持ちとしてしっかりとチームを支えてくれました。特殊ソルバは焼きなましソルバで解けないタイプの問題のかなりの部分を潰してくれました。まさにどれが欠けても今回の優勝はなかったでしょう。

という訳で、"C++, Haskell, Python"です。これらの言語に関して、今年一杯はくれぐれも不用意な発言は避けていただくようにお願いいたします。尤も、今回のICFPコンテストにおいて、1番多くのチームに使用された言語はHaskellで、その次がC++で、その次がPythonですので、我々の選択は最も多くの人々を幸せにするものだと自負しております。ただし!私にはその権利があると思いますので、これからもC++の悪口を言いまくると思います。ワハハハは。

さて、ICFPなのです。コンテストの入賞者はICFPに招待されます。ICFPというのはその名の通り、関数プログラミングに関する国際学会です。その分野では最高峰に位置していると思います。私が研究の道に進んでいたらもしかしたら論文の方で参加していたかもしれません。そうなっていないのは、私の怠惰によるところではありますが、別の入口からとはいえ、改めてその中を覗いてみると、面白そうで面白そうで悔しくなってきます。英語が全く聞き取れないのと、そもそも内容が理解出来ないのとで、殆ど分からなかったのが悲しかったです。予習をしておけばよかったと悔やみました。でも、悔やんでも仕方が無いので、復習はしっかりしようと思います。

ICFPに参加できて本当によかったです。ともすれば日々安穏と暮らすことを良しとしようとする私の中に、知的好奇心のかけらと闘争心がまだ残っていることを確認できました。世の中にはこんなに面白くて難しいことが埋れているのに、ゆっくりなんてしていられない。もっと勉強したい。そして、いつか機会があれば論文の方で通してみたいという野望も持ち続けておこうと思いました。

併設イベントのHaskell SymposiumとHaskell Implementors Workshopにも参加しました。Haskell SymposiumはHaskellに関する研究ばかりで、私にも分かりやすいものが多かったです。Haskell Implementors WorkshopはHaskellを取り巻く現状や、ツールチェインの整備の話など、まさにHaskellの今がここにあるといった感じでとても面白かったです。Haskell界隈で有名な人が勢ぞろいしていてすごかったです。Hackageの話など、発表が終わった後も延々と議論が続いて、自分も英語が不自由なく扱えたなら、意見の一つや二つ言えるんだなあと思うと、これまた悔しさと悲しさがこみ上げてきたりして。

当時の様子はkinabaさんのまとめ(http://togetter.com/li/55345)にちょこっと載せていただいているので、よろしければご参照ください。私のはともかく、ICFP本編のkinabaさんのまとめが大変参考になります。

はてさて、そういうわけで今回は本当にいい経験をさせてもらいました。チームの皆さんに改めて感謝。このような楽しいコンテストを開催していただいた、主催者の方々にも感謝。願わくば、来年も優勝せんことを。そうそう、来年のICFPは東京開催です。皆様是非是非奮ってご参加を。