n-knuu's logs

憧れ駆動。だいたい競プロ

CODE RUNNER 2015 予選Bに参加しました

CODE RUNNER 2015 予選Bに参加しました。
この記事を2ツイートでまとめると以下のようになります。



結果: f:id:n_knuu:20151102175356p:plain
多分予選通過しました。

問題

予選 B 問題 - CODE RUNNER

最初にとった方針

とりあえず1〜5秒くらいでランダムに攻撃しまくる。→1万後半から2万点くらい取れる
最初にこれを投げた時点で60位くらいだったように思う。

60分くらいまで

実家勢なのでご飯の時間と被る。こんな日に限って鍋が出てきてかなりロスする。

ご飯後

infoのAPIを全く使っていないのでどう使えるかをご飯を食べながら考えた末、一番前の敵の体力が自分の攻撃力より小さくなったら攻撃するという方針でいくことにする。

  1. 部屋に入る
    • もし部屋にはいれてなければ部屋に入りなおす
  2. 0.2秒ごとにinfoが取れるので、0.2秒sleepしてはinfoを取りつづけるようループする。ループを抜ける条件は、
    • 一番前の敵の体力 + (一秒間に貯められる攻撃値) <= 敵の攻撃値 となったとき
      • 一秒というのはあまり意味がなくて、とりあえず人より先に攻撃したいからある程度早目に攻撃、みたいなことをしていた
    • 自分の攻撃力が変化しなくなる(つまり部屋が終了した)とき
    • 自分の攻撃力がある程度大きくなる
    • ただし、1秒未満では攻撃力が低すぎるので攻撃しない
      • ただ後から聞いた話だと、1秒未満というのは短すぎたらしい(3秒くらい待たないとほとんど意味がないとyosupoさんがツイートしていた)

これを10分くらいで実装して、さあ動かそうと思ったら、なぜかエラーが出る。
なにかバグが出ていたらしく、ゲームが止まっていると知る。とりあえず待つ。

90分後くらい

ゲームが再開するので投げる。多分この時点で120位くらい。
なかなか点数が上がらず、ランダム解法の点数さえ超えない...

120分後くらい

敵の今現在の体力ではなくて、最初の体力を使っていたことに気がつく。
修正して投げると、少しずつ点数が上がり始めて、3万点を超えて、45位くらいにまで上がる。
とりあえずあと1時間もあるし、まあ70位くらいまでには入れるだろうと思って、お風呂に入る。

150分後くらい〜終了まで

お風呂から上がると、currentスコアが少しずつ下がっていることに気がつく。
max scoreの順位はまだ50位くらいをうろうろしていた。
他の人のmax scoreが上がるの妨害すべく、プログラムを動かし続ける。
最終的にcurrentスコアは下がり続けて、currentスコアの最終順位は95位まで落ちたが、他の人のmax scoreがあまり上がらなかったおかげで、59位だった。

感想

早目に実装して点数が上がったのでmax scoreが落ちなかったと言えそう
最後の方は、みんな賢くなってスコアが上がりにくくなっていた(自分のmax scoreの31745点は最終cureent scoreだと17位まで順位が上がる)

反省とか

rankingとかroomのAPIから、ほかの人がどれだけ攻撃力を貯めてから攻撃しているかとかを見るべきだった
結局infoのAPIで得られる情報のうち、自分の攻撃力と一番前の体力しか使っていなかったので、他の人の攻撃したタイミングとかから相手が次にいつ攻撃してきそうかとかを予想できたらよかったかもしれない。
あとrankingのAPIから、他の人の攻撃スタイルとかをモデル化できたら面白かったかも

おまけ

全体のcurrent scoreの推移
f:id:n_knuu:20151102175207p:plain
自分のみのcurrent scoreの推移
f:id:n_knuu:20151102175215p:plain