唯物是真 @Scaled_Wurm

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

AtCoder Regular Contest #012 oox-

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
こういう場合ってどうやったら綺麗に書けるんでしょう?

参考になりそうなツイートを見つけた

そもそも交差する点が各々の連続した石の端から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'