CODE VS (#codevs) Python サンプルコード

概要

昨日からCODE VSにkshi_kshiとして参戦している。
言語が標準入出力を扱えるものであれば何でも可能というのは参加者としてとても嬉しい限り。
ということでPythonです。

実際に動くまでに少しハマったので簡単なテンプレート的なものを晒してみる。


※ この程度のスクリプトなら、公開しても問題ないだろうという勝手な独断で晒しています。
もし関係者の方々にとって不都合なことがありましたら、お手数ですが、コメントなどでご連絡いただければ、この記事を削除する次第です。よろしくお願いいたします。

参考記事

簡単なサンプルを作って、テストの入力ファイル(sample.in)でチェックした後、専用のクライアントアプリケーションで動かしてみたら5分立つまで、何も結果が返ってこなくて、困っていたら、
以下の素晴らしい記事がきっかけで動きました。id:sucrose さんありがとうございます。

動かなかった原因としては

sys.stdout.flush()

がなかったので、ダメだったみたい.

サンプルコード

実行環境
内容

level1の時に砲台を3つ設置してあとは何もしないという内容。1-19面で力尽きるしょぼいAI。
(Moneyは全く考慮していないません。)

スクリプト
import sys

def solve():
	S = int(sys.stdin.readline().strip())

	def _get_map():
		W, H = map(int, sys.stdin.readline().strip().split(u' '))
		M = []
		for i in range(H):
			line = sys.stdin.readline().strip()
			M.append(list(line))
		L = sys.stdin.readline().strip()
		sys.stdin.readline().strip()	# read "END"
		return MapData(W, H, M, L)

	for mapCount in range(S):
		mapData = _get_map()
		#mapData.display()

		for levelCount in range(mapData.level):
			myInfo = MyInfo(sys.stdin.readline().strip().split(u' '))

			towerInfo = []
			for j in range(myInfo.numOfTower):
				towerInfo.append(Tower(sys.stdin.readline().strip().split(u' ')))

			enemyInfo = []
			for j in range(myInfo.numOfEnemy):
				enemyInfo.append(Enemy(sys.stdin.readline().strip().split(u' ')))

			# turn END
			sys.stdin.readline().strip()	# read "END"
			""" describe Action """

			doAction(levelCount, mapData, myInfo, towerInfo, enemyInfo)

			""" describe Action """
			sys.stdout.flush()


class MapData(object):
	def __init__(self, W, H, M, L):
		self.weight = W
		self.height = H
		self.data = M
		self.level = int(L)

	def display(self):
		print "----- MAP DATA -----"
		for line in self.data:
			print(line)


class MyInfo(object):
	def __init__(self, info):
		info = map(int, info)
		self.life = info[0]
		self.money = info[1] 
		self.numOfTower = info[2]
		self.numOfEnemy = info[3] 


class Tower(object):
	def __init__(self, info):
		info = map(int, info)
		self.x = info[0]
		self.y = info[1] 
		self.powerUpCount = info[2]
		self.kindOfTower = info[3] 

	def getOutput(self):
		info = map(str, [self.x, self.y, self.powerUpCount, self.kindOfTower])
		return " ".join(info) + "\n"

	def isPut(self, mapData):
		if mapData.data[self.y][self.x] == "0":
			return True
		else:
			return False


class Enemy(object):
	def __init__(self, info):
		info = map(int, info)
		self.x = info[0]
		self.y = info[1] 
		self.apperTime = info[2]
		self.life = info[3]
		self.moveTime = info[4]


def doAction(levelCount, mapData, myInfo, towerInfo, enemyInfo):
	""" Sample Action : During first level, try to put 3 towers."""
	towerCount = 0
	stdoutStr = ""
	if levelCount == 0:
		candidateTowers = [	Tower([3, 2, 1, 1]),
					Tower([3, 3, 0, 0]),
					Tower([3, 4, 1, 1])]
		for tower in candidateTowers:
			if tower.isPut(mapData):
				towerCount += 1
				stdoutStr += tower.getOutput()
	print towerCount
	if stdoutStr != "":
		print stdoutStr.strip()


if __name__ == "__main__":
	solve()

抱負

とりあえず、最後の40-25に行けるようなアルゴリズムを考えようと思う。
なかなか面白いテーマで本業そっちのけでハマりそうで怖い。
ではでは。