kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

ICFP 2008 Programming Contest 結果

ICFPという学会が主催しているICFP Programming Contestという、参加者同士がプログラミングの技能を競うコンテストが毎年あって、今年は7月12午前4時〜15日午前4時(日本時間)にかけて行われていた。去年までは傍観していたものの、今年はチーム名suihan_jarで参加してみたが、なかなか楽しかった。

今年のお題は、クレーターやら岩やら火星人がうようよしている架空の火星を探査する探査機のプログラムを書けというもので、それらの障害物を避けつつ、どれだけ早くマップ中央にあるホームベースにたどりつけるかを競うというもの。

自分のプログラムは割と単純な戦略で、基本的にはマップ中央にあるホームベースに向かいつつ、障害物がレーダーの範囲内にあり、現在の進行速度と方向で一定時間進むと衝突すると思われる場合、その時の障害物と自機の位置に応じて、適当に左または右に避けるというもの。こんなおバカなプログラムだと、当然のごとく、迷路みたいな複雑なマップが出てきたらお手上げ状態なのだが、出てきた障害物をちゃんと記録して、ホームベースへの最短経路を求めるとか、角速度とか諸々をちゃんと計算して、自機の現在の状態に関するモデルを持っておくとか、面倒過ぎて時間内に書ける気がしなかったので、それで提出した。

とはいえ、こんなおバカなプログラムでも、実は結構苦労した。特に、角度の計算をミスって、特定の進行方向から回避しようとするときだけあさっての方向に回避しようとする、などというバグがしょっちゅう発生してた。ちゃんとビジュアライザを作っておけば、この類のバグはすぐに発見できただろうなと思うわけで、その辺、shinhさんのおっしゃる通りだなあと思ったり。

そういえば、実は、問題文をちゃんと精読しなかったせいで、1日目は、ホームベースの場所が可変だと思い込んだままプログラムを組むという凄まじいポカをやらかしていたのだが、そのことについて2日目に

練習用 map って全部 home がど真ん中にあるけど、本番はもちろんそれは想定できないわけだよな。とりあえず、しらみつぶしに home 探すようにした方が良いのか。

http://twitter.com/kmizu/statuses/856999581

とか凄い間抜けなことをTwitterでつぶやいていたら、 okagawaさんmasahiro_sakaiさんに、ホームベースはど真ん中だよというのを教えていただいたおかげで、なんとかまともに動くプログラムが組めるようになったのであった。多謝。

で、そのICFP Programming Contestの途中結果が公開されていたので、見てみたのだが、Trial 4まではなんとか生き残っていたものの、Trial 5で脱落していた。正直、もっと早くに脱落すると思っていたので、Trial 5まで生き残れただけでも結構意外。あんなプログラムでもそこそこ生き残れたってことは、あんまり凶悪なマップじゃなかったのだろうか。