python; checkio日記

checkioを中心にpythonプログラミングの記録

Home 問題5: ●×ゲームの判定

今回は●Xゲームの勝敗決め データの与えられ方は
data = ([
"O.O",
"XX.",
"XOX"])

で勝敗を決定する。 行列を使ってみた。

def checkio(data):    
    mapping = {'X': '1', 'O':'-1', '.':'0'}
    text = [int(i.translate(str.maketrans(mapping))) for i in ''.join(data)]
    testmat = np.array(text).reshape(3,3)
    testrow = testmat.dot(np.ones(3))
    testcol = np.ones(3).dot(testmat)
    testdiag = np.trace(testmat)
    testinvdiag = np.trace(np.flip(testmat, axis=0))
    test = np.concatenate((testrow, testcol, [testdiag], [testinvdiag]), axis = 0)
    if np.sum(test==3) >= 1:
        return 'X'
    elif np.sum(test==-3)>= 1:
        return 'O'
    else:
        return 'D'

上記のtestで、8個のラインをそれぞれ評価する。この流れは皆かわらないが、文字列のままでやっている人がほとんどで、
return 'X' if 'XXX' in test else...
とやっている人が多かったです。
更に、zip関数を上手に使うと

    rows = data
    cols = list(map(''.join, zip(*rows)))
    diag = [(r[i], r[2-i]) for (i, r) in enumerate(rows)]
    diag = list(map(''.join, zip(*diag)))
    test = rows + cols + diag

でtestまでシンプルにいけるということを学びました。この調子でcheckioをしながら、基本的な関数の使い方を少しづつ学びます。