Codingame Code a la Mode に参加した
結果
Legendary到達.38/1543.Legendary到達後はコード触ってない(触ると落ちそうだったので).
問題概要
客が常に3人居て,何か料理を注文している.適切な料理を出すと,スコアを獲得する. なるべく高いスコアを獲得したい.
料理は,皿と複数の食材から構成される. 例えば,「皿+アイスクリーム+ブルーベリー」,「皿+タルト+切られたいちご+クロワッサン」など.
一部の食材は調理が必要. 例えば,「切られたいちご」は「いちご」を「まな板」に持っていくことで「切られたいちご」を得る. 「クロワッサン」は「生地」を「オーブン」に持っていき,一定時間待ち,取り出すことで「クロワッサン」を得る. 「オーブン」は,長時間放置すると焦げてしまう. タルトは特に大変.
キッチンには自分を含め2人のプレイヤーが居る.同じマスに2人居たり,すれ違ったりすることは出来ない.
やったこと
ステートマシン. オーブン役・カットする役・運ぶ役のステートを作り込む.
C++で1300行でした.
改良した点など
無駄な動きを取り除く. 例えば,「いちごを切る>置く>皿を取る>切いちごを取る」など. 簡単に改善できそうなところを直す.
向こう側から回って生地取った方が効率が良さそう,みたいな改善はしなかった. 予測が難しい相手プレイヤーの動きによって距離が変わるため. 景品圏内だったら相手プレイヤーの予測もするのかな…
中盤までオーブン中でも結構動き回るAIだった. しかし,あまり動き回りすぎると,相手AIが距離の予測ができなくなる問題が起きる. 焼くのに掛かる時間は10ターン/2人で長くないので,待つAIに変えてみたところ,良さげだった.
必要最小限の食材を作る. 1人しかタルトを要求していないのに,3つも作る必要は無い.
バグを取り除く.ダイクストラでバグらせないでください.
反省
状態を細かく切り分ければよかったと後悔.
ブロンズ辺りまで将棋で言う飛車のような動きをすると誤読をしていた.自由に最大4歩動く.