唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

CODE RUNNER 2015 予選Bに参加して32位ぐらいだった #coderunner2015

CODE RUNNERは3時間以内にプログラム(ゲームAIなど)を書いてスコアを競うマラソン型の競技プログラミングのコンテスト
この形式のコンテストは参加したことなくて興味があったので、社会人でも予選までは参加できるので初参加してみた。coderunner.jp

序盤は何故か"Error: Invalid Token"というエラーが出てまともに参加できませんでしたが、途中からはちゃんと動いてタイトルにも書いたように32位になれました

HTTPのリクエストで攻撃や情報取得のAPIを叩く方式でしたが、親切に公式にサンプルプログラムがありましたし、Pythonだったせいか特に困らずにスムーズに動きました

競技と並行でニコニコ生放送がやっていておもしろかったですlive.nicovideo.jp

問題

問題の内容は、3人ずつプレイヤーが部屋に入れられていって、順番に出てくるモンスターに与えたダメージの量で1位から3位までの順位をつけて順位に応じた得点が得られるというものでした
攻撃力は前回の攻撃からの経過した時間の2乗で決まり、モンスターのHP以上のダメージは与えられないようになっていました
どれだけ攻撃力をためてどのタイミングでモンスターを殴るのかを考えるゲームでした

f:id:sucrose:20151101174807j:plain

方針はモンスターの残り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)