3級になっていた。
例のごとくAとBだけ解けてCはWA。
C問題が解けない(´・ω・`)
A: 週末 - AtCoder Regular Contest #012 | AtCoder
土日までの日数を求める。ただし土日が入力として与えられた場合は0を返す。
やるだけ
# -*- coding: utf-8 -*- import sys import collections day = raw_input().strip() days = ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] i = days.index(day) if i > 1: print (7 - days.index(day)) % 7 else: print 0
B: アキレスと亀 - AtCoder Regular Contest #012 | AtCoder
アキレスと亀の話をn回やったときの距離を求める。
やるだけ。
# -*- coding: utf-8 -*- import math import sys import datetime N, va, vb, L = map(int, raw_input().split()) d = float(L) for i in xrange(N): t = d / va d = vb * t print '{:.10f}'.format(d)
C: 五目並べチェッカー - AtCoder Regular Contest #012 | AtCoder
五目並べの盤面として正しいかどうかを求める。
問題文とサンプルが一致してないような気がするがとりあえず適当に実装。
場合分けの一部を忘れてWA
方針としてはまず石の個数が明らかにおかしいのを除く。
10個以上並んでいる場合はダメ。
5つ以上の石の列に対する交差点が2箇所以上あるとダメ。
同じプレイヤーの5個以上並んでいる列が、交差せずに二箇所以上あったらダメ。
というのを延々と実装したらひどく汚いコードになったorz
こういう場合ってどうやったら綺麗に書けるんでしょう?
参考になりそうなツイートを見つけた
#atcoder Python で W*H の盤面を文字列や1次元配列で表す場合、横五個連続 B[i:i+5]=='o'*5 で、同じく右斜め下は B[i::W+1][:5] のように楽にチェックできる。ただし左右の回り込みがあるので、右端か左端に番兵置いてWを+1しておく。
2013-02-10 21:43:08 via web
そもそも交差する点が各々の連続した石の端から5番目までの距離にあるかどうかという条件を忘れていたので、通るはずがなかった……。
他にも見落としがあるかもしれない。
以下通らないソースコード。
# -*- coding: utf-8 -*- import math import sys import collections stage = [] for line in sys.stdin: stage.append(line.strip()) count_x = 0 count_o = 0 S = len(stage) L = len(stage[0]) check = [[0 for i in xrange(L)] for j in xrange(S)] for i, s in enumerate(stage): for j, c in enumerate(s): if c == 'x': count_x += 1 check[i][j] = -1 elif c == 'o': count_o += 1 check[i][j] = 1 win_o = False win_x = False check_yoko = [[0 for i in xrange(L)] for j in xrange(S)] check_tate = [[0 for i in xrange(L)] for j in xrange(S)] check_mnaname = [[0 for i in xrange(L)] for j in xrange(S)] check_hnaname = [[0 for i in xrange(L)] for j in xrange(S)] if count_o >= count_x and count_o - count_x < 2: for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(j, L): if cur != check[i][k]: break else: count += 1 if count >= 10: print 'NO' sys.exit(0) elif 5 <= count <= 9: for k in xrange(j, j + count): check_yoko[i][k] = 1 if cur == -1: win_x = True else: win_o = True for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(i, S): if cur != check[k][j]: break else: count += 1 if count >= 10: print 'NO' sys.exit(0) elif 5 <= count <= 9: for k in xrange(i, i + count): check_tate[k][j] = 1 if cur == -1: win_x = True else: win_o = True for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(min(S - i, L - j)): if cur != check[i + k][j + k]: break else: count += 1 if count >= 10: print 'NO' sys.exit(0) elif 5 <= count <= 9: for k in xrange(count): check_mnaname[i][j] = 1 if cur == -1: win_x = True else: win_o = True for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(min(i + 1, L - j)): if cur != check[i - k][j + k]: break else: count += 1 if count >= 10: print 'NO' sys.exit(0) elif 5 <= count <= 9: for k in xrange(count): check_hnaname[i][j] = 1 if cur == -1: win_x = True else: win_o = True test = 0 for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 count_check = 0 for k in xrange(j, L): if cur != check[i][k]: break else: count += 1 if check_tate[i][k] == 1 or check_mnaname[i][k] == 1 or check_hnaname[i][k] == 1: count_check += 1 if 5 <= count <= 9: if count_check >= 2: print 'NO' sys.exit(0) elif count_check == 0: test += 1 for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 count_check = 0 for k in xrange(i, S): if cur != check[k][j]: break else: count += 1 if check_yoko[k][j] == 1 or check_mnaname[k][j] == 1 or check_hnaname[k][j] == 1: count_check += 1 if 5 <= count <= 9: if count_check >= 2: print 'NO' sys.exit(0) elif count_check == 0: test += 1 for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(min(S - i, L - j)): if cur != check[i + k][j + k]: break else: count += 1 if check_yoko[i + k][j + k] == 1 or check_tate[i + k][j + k] == 1 or check_hnaname[i + k][j + k] == 1: count_check += 1 if 5 <= count <= 9: if count_check >= 2: print 'NO' sys.exit(0) elif count_check == 0: test += 1 for i in xrange(S): for j in xrange(L): if abs(check[i][j]) == 1: cur = check[i][j] count = 0 for k in xrange(min(i + 1, L - j)): if cur != check[i - k][j + k]: break else: count += 1 if check_yoko[i - k][j + k] == 1 or check_tate[i - k][j + k] == 1 or check_mnaname[i - k][j + k] == 1: count_check += 1 if 5 <= count <= 9: if count_check >= 2: print 'NO' sys.exit(0) elif count_check == 0: test += 1 if test > 1: print 'NO' sys.exit(0) if win_o and win_x: print 'NO' elif not win_o and not win_x: print 'YES' elif win_o: if count_o > count_x: print 'YES' else: print 'NO' elif win_x: if count_o == count_x: print 'YES' else: print 'NO' else: print 'NO'