ICFPC2011

ICFPC2011に@Mi_Sawaと参加しました.いつもどおりチームMisa_k.
今回はどんな問題だろうなーと思っていたら,なんとまさかの対戦ゲー.λ式を書いて敵を攻撃するということでなかなかアツいものを感じる.
λ計算は去年授業でやったけどあんまり覚えてない.とりあえず何はなくともループが組めれば強いだろうなー,ということでいろいろ考える(問題の後半に無限ループのサンプルコードがあったのに気づいてなかった).で,いろいろ考えているうちに,Sを使ってうまいことするゲームっぽいぞ……と気づく.式を一度書いたら再構築するよりも使い回したほうが間違いなく効率がいいので,再利用を考えつつ部品を作る.そんな感じで,たしか1日目の夜くらいに遅延オブジェクトλfxy.fxと引数の結合λfgh.f(gh)を作り,これをベースにしていろいろ組み立てていった.最終的に,普通に無限ループでdecを撃つ砲台のつもりでS(K(S(dec))(get)(0)を作ったらdecの数がどんどん増殖するという副作用を持つ物体ができたので,これを撃ちまくるだけのコードをとりあえずSubmit.あと@Mi_Sawaが簡単なシミュレータを作った.

2日目はシミュレータをベースにして作戦決めたほうがいいよねーという話をしながらも,敵に効率よくダメージを与えるにはどうすればいいのか……ということを考える.結局zombieを敵のところに叩き込んでループでdecとかattackとかhelpを撃つのがいいだろうということで落ちつく.この日は最終的に,敵の255をattack(0)(0)(8192)とattack(1)(0)(8192)で潰してからhelp(i)(succ(i))(10000)をzombieとして撃ち込むものを投げて終了.

3日目.シミュレータを使いつつzombieを試すがどうもうまくいかない.なんかzombieのシミュレーションがうまく行ってないっぽい.あれこれ調べた結果,Rubyインスタンス変数をlambdaで直接いじるという構造だったために,zombieとして撃ち込んだ関数が作成側の環境で動いてしまっていたということが発覚.この時点で残り5時間くらいだったので一気にやる気が消失し,結局2日目のzombieプログラムを撃ちこんだあと,気休めとしてS(dec)(dec)をループで撃ち続けるものをSubmitした.

反省点.λ関数を考えるとき,二人でいっぺんに考えるのではなく役割分担してプログラム側・λ側みたいにするべきだった.あと,シミュレータはユニットテストなんかでちゃんと確認しながら書くべきだった.

総評.最終的な成果物はたいしたものではなかったが,λ関数をこねくりまわしてアルゴリズムを作るという作業はかなり楽しかった.もうちょっと遊びたい気持ちもあるけど,まとまった時間がないと手を出しにくいのも事実だからどうだろう…….