kmjp's blog

競技プログラミング参加記です

AtCoder ARC #012 : Python練習編

ぼちぼち終わりが見えてきた。
http://arc012.contest.atcoder.jp/assignments

C++の時の記事。
http://kmjp.hatenablog.jp/entry/2013/02/16/0900
http://kmjp.hatenablog.jp/entry/2013/02/16/0930

A - 週末

曜日に対して週末までの日数を答える問題。
曜日は7個しかないので、全部連想配列に入れてしまえばよい。

m={"Monday":5,"Tuesday":4,"Wednesday":3,"Thursday":2,"Friday":1};
print(m.get(raw_input(),0))

B - アキレスと亀

1回アキレスが元々亀のいた位置に到達するたび、両者の距離は両者の速度の比率で減少していく。
後はそれをコードに書くだけ。
小数をrangeに指定すると誤差で範囲がずれるのが怖かったので0.1足してみた。

N,Va,Vb,L=map(float,raw_input().split(" "))

for i in range(int(N+0.1)):
	L *= Vb/Va
print(L)

C - 五目並べチェッカー

五目並べの盤目の状態が与えられて、五目並べのプレイ中正常に到達できる状態か答える。
最後に打った側の手をどれか1個減らし、5目そろってないことを確認する。

B=[];
for i in range(19):
	B.append(list(raw_input().strip()))

def check(BO):
	for y in range(19):
		for x in range(19):
			if BO[y][x]!='.':
				if x<=14 and BO[y][x]==BO[y][x+1]==BO[y][x+2]==BO[y][x+3]==BO[y][x+4]:
					return 0
				if y<=14 and BO[y][x]==BO[y+1][x]==BO[y+2][x]==BO[y+3][x]==BO[y+4][x]:
					return 0
				if x<=14 and y<=14 and BO[y][x]==BO[y+1][x+1]==BO[y+2][x+2]==BO[y+3][x+3]==BO[y+4][x+4]:
					return 0
				if x>=4 and y<=14 and BO[y][x]==BO[y+1][x-1]==BO[y+2][x-2]==BO[y+3][x-3]==BO[y+4][x-4]:
					return 0
	return 1

no=nx=0
for B2 in B:
	for b in B2:
		if b == 'o':
			no += 1
		if b == 'x':
			nx += 1

t=''
if no==nx:
	t='x'
elif no==nx+1:
	t='o'
else:
	print("NO")
	exit()
	
if nx<5:
	print("YES")
	exit()

for y in range(19):
	for x in range(19):
		if B[y][x]==t:
			B[y][x]="."
			if check(B):
				print("YES")
				exit()
			B[y][x]=t

print("NO")

まとめ

PythonはA==B==Cみたいな書き方ができるのはいいな。