Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

CodinGame Spring Challenge 2021

CodinGameのコンテスト、Spring Challenge 2021に参加しました。

結果

f:id:mdstoy:20210519001844p:plain

コンテストのフル参戦は初めてで、さすがにLegendの壁は厚く、最終順位は551位でした。(最終提出前は450位あたりだったのに、攻めた結果がこれ・・・)

戦術

最後の土日にビームサーチを実装しようと思ったのですが、両プレイヤーの同時行動であることやターンと日の更新処理など思いのほか処理すべきことが多く、成果が得られないままコンテストが終わってしまうリスクが大きくなったので、結局諦めてひたすらルールベースであたたかみのあるif文を積み重ねることに終始しました。

大きく成果の出たもの

初日WAIT

ツイッターで拾ってきた戦術ですが、めちゃくちゃ伸びて驚きました。

隣り合わせにしない

これもツイッターに上がっていた画像を参考に実装。隣接させたら影になる確率が大幅に増えるのだからそれはそうですが。

その他

  • COMPLETE
    • 翌日以降影になっているかどうかを見る
      • 日・影・影、と影・日・日だと後者を切ると損かと思って数日分見ることにしたんですが、それがどうだったかよくわからず
      • 翌日分だけ見ることにするとだいたい弱くなっていたので、間違ってなかったのか?
      • あと、GROWも当然影を見る効果があると思うのですが、自分が実装すると必ず激弱になってしまい原因が最後までわからず・・・
    • サイズ3の木が増え過ぎたら刈る
    • 終盤につれて刈る頻度を上げる
      • 初期に生やしたままゲームセットになっていたのを解消しようとして、そのロジックを最後まで引きずってしまった
    • 点差を離されたらとりあえず刈る
    • 相手が0点かつサイズ3の木が4本以下なら刈らない
      • 我慢比べ的な
  • GROW
    • COMPLETEまで到達できないことが確定した木はそれ以上育てない
    • サイズが大きい木を優先して育てる
    • 一つ上のサイズの木の本数が少ないほど優先(sunポイントの関係で)
      • コンテスト後の感想戦を見る限り、このへんはちょっと甘くて、全体のバランスを見ないといけなかったらしい?
  • SEED
    • 終盤は撒かない
    • なるだけ2つ以上撒かない
    • 小さな木から撒くことを優先、という謎ロジック
      • これ自分でも意味がわからないのですが、消すとなぜか弱くなってしまうという・・・

工夫した点

いろいろlong longで持つ

隣接セルの情報を

neighbor[0] = 000000000000000000000000000001111110
neighbor[1] = 000000000000000001000000000111000101
...

こんな感じで持つとか、richness = 0の位置とか、木が生えているセルの位置とか、long longで持ってbit演算でいろいろできるようにしました。

影の差す場所、SEEDしたい場所の前計算

前者はshadow[自分セル][向き][距離] = 影になるセル、後者はseed[元][先] = 撒きたい度の情報をあらかじめ計算しておきました。

  • @iwashi31さん作成のTwitterの参加者リストがめちゃくちゃ重宝しました。ありがとうございました。
    • なにがすごいって、結構な人数がいるリストなのにみんな期間中ほとんどこどげの話しかしていないw

まとめ

初めてフル参戦してみて、やりたいことはさっさと実装してしまってできるだけ先行するのが賢いのかなぁというのが一番の気づきでした。土日だけでビームサーチに載せ替えるというのは、自分の実力では無理がありすぎた。

秋はぜひLegendになりたいものです。(クエストの残りがLegendだけなのでなおさら・・・)