【ICFPC2014参加記】 〜ぼくらの敵はLambda man〜 #ICFPC2014

f:id:cocodrips:20140729004459p:plain

7/25 21:00~ 7/28 21:00 の 72時間ICFPCに参加しました。

ICFPC:関数型言語の国際学会ICFPが毎年開催している プログラミングコンテストICFP Programming Contest (通称ICFPC)
by ICFP Programming Contest 日本語Wiki

コンテスト概要

パックマン作ってね。高い点数とった人が勝ちだよ。
おばけ(敵)はアセンブリ風言語(GHC)で動くよ。
(肝心のパックマン(Lambda man)については読むの放棄したのでよくわからない)

Lightning round

高い点数とれるラムダマンを作ればいいらしい。
チームメイトがコンパイラとかLispとか言ってて謎。
「どうせ次の日から、おばけも書いてねって言うんでしょ?」って思って
初日からおばけAI担当になる。(それしかできそうにない)

二日目以降

やっぱり「おばけAIも作ってね」って運営言ってきた。わーい。
@yuizumi_y5i さんが作ってくれたプリプロセッサつかってGHCを書く。

GHCの制約

メモリが255個、レジスタが8個
255行までしか命令がかけなくて、
1024命令までしか実行されない
敵はGHCの命令を解析して動くことができる

GHCの方針を考える

  • 最短経路で敵に向かいたい
  • はさみうちしたい

現実的に考える・実際に書く

GHCでは、
if a == b and c == d:
を書くのに4命令使うし、256 * 256 のマップの最短経路の探索はつらい。
小さい範囲で最短経路を探索する手はあるけど書ける気しない

敵の軌跡をを記録し続けて、記録の中にあるマスにきたら、
その軌道にのればとりあえず追いかけられる (= 敵が戻る選択肢をさせづらくできる) ので、
それくらいならできるかな・・・。

結局これくらいしか書いてない

  • pillや敵の方へ向かう
  • 袋小路から抜ける
  • 敵をストーカーする
  • 敵が解析してくるのを邪魔する無限ループを作る
  • frightモードの時は敵から離れる

最後時間なくてどんどん糞コード量産するしかなくて辛かった。

おばけコード

おばけ0
ひたすらお化けの方向に突進する。 縦方向優先で近づく。

おばけ1
pillの上をうろうろする。どちらかといえばお化けの方向に向かう。 横方向優先で近づく。

おばけ2
おばけ0と同じ動きをしつつ、敵の移動を記録する。
記録しているマスに乗ったら、敵の移動を追いかける。

おばけ3
pillの上をうろうろする。どちらかといえばお化けの方向に向かう。 縦方向優先で近づく。

GCCのほうはチームメイトが頑張ってた

なんか@n__yodaがOcamlコンパイラつくってた。ICFPCっぽいなーって眺めてた。
大変そうだった。(小学生並みの感想)

感想

  • if文やfor文、関数なんてものが使えるC言語って「高級」言語だったと実感した。
  • いつも使っている言語のありがたみを実感するコンテストだった。
  • アセンブリのお勉強できてよかった。
  • mod計算できないの辛かった。
  • if文とfor文は途中から書くの慣れた。
  • コンパイラ書けるようになりたい。 -> 今度書く
  • 人数集めるのって大事だと思った。 今回は3人でやったけど、5人くらいやれば最初から役割分担できてよさそう。
  • 一緒にGHCを書いた人がいないので、他の人のGHCがどんなことをしているのか見てみたい。

来年もやりたい

来年から社会人だけど、1年目の夏って休みとれるんだろうか。
入社3ヶ月じゃ有給は取れないかな。(よくわからない)
知り合いの社会人の人たちが有給とってICFPCしてていいなあ〜青春だな〜〜って思った。
就職先でICFPC一緒にやれる友人ができたらいいな。
来年はもっと役に立てる人になってたい。
コンパイラとかふふふ♪っていいながら書けるOLになろう。