CODE RUNNERは3時間以内にプログラム(ゲームAIなど)を書いてスコアを競うマラソン型の競技プログラミングのコンテスト
この形式のコンテストは参加したことなくて興味があったので、社会人でも予選までは参加できるので初参加してみた。coderunner.jp
序盤は何故か"Error: Invalid Token"というエラーが出てまともに参加できませんでしたが、途中からはちゃんと動いてタイトルにも書いたように32位になれました
#coderunner2015 予選Bに初参加して32位でした。最初の何十分かError: Invalid Tokenで何もできなくて残念だったけど、プレイできるようになってからはまあまあ楽しめた pic.twitter.com/J410jjL2lC
— 無限猿(id:sucrose)@23月病 (@Scaled_Wurm) 2015, 10月 31
HTTPのリクエストで攻撃や情報取得のAPIを叩く方式でしたが、親切に公式にサンプルプログラムがありましたし、Pythonだったせいか特に困らずにスムーズに動きました
競技と並行でニコニコ生放送がやっていておもしろかったですlive.nicovideo.jp
問題
問題の内容は、3人ずつプレイヤーが部屋に入れられていって、順番に出てくるモンスターに与えたダメージの量で1位から3位までの順位をつけて順位に応じた得点が得られるというものでした
攻撃力は前回の攻撃からの経過した時間の2乗で決まり、モンスターのHP以上のダメージは与えられないようになっていました
どれだけ攻撃力をためてどのタイミングでモンスターを殴るのかを考えるゲームでした
方針はモンスターの残りHPの6から9割ぐらいで適当に殴ってればそれなりにダメージを与えられるだろうという簡単なものでした。
時間内はパラメータを適当に手動で調整してました
本当は次のモンスターや他のプレイヤーの情報を使ってもっと賢いことをやればよかったのですがそこまでは手が回らず
今のモンスターを殴って倒してしまうと、次のモンスターの方がHPが高くて他の人に殴られて損をするという囚人のジレンマみたいな状態になるルールでした
ソースコード
import urllib2 import time token = "hoge" def query(url): res = urllib2.urlopen(url) return res.read() def enter(): url = "http://game.coderunner.jp/enter?token=%s" % token return query(url) def info(): url = "http://game.coderunner.jp/info?token=%s" % token return query(url) enter() while True: ret = info().splitlines() if len(ret) > 1: p, x = map(int, ret[0].split()) cur, m = map(int, ret[1].split()) if cur / 1.6 <= p and cur >= 9000000: enter() time.sleep(0.40) else: time.sleep(0.17) else: enter() time.sleep(0.40)