summer_tree_home

Check iOでPython3をマスターするぜっ

Xs and Os Referee (Check iO > Home) の続き

他の人の答え

あれこれ他の人の解答を見てみた。やっぱり私の答えは無駄が多かったかな。

まず、縦横斜めのチェックは、一つずつ判定するより、縦+横+斜めのリストを作ってから、リスト内に'XXX'や'OOO'があるかを調べた方が簡単だ。

例えば、引数が ['X.O', 'XX.', 'XOO'] だったら、

['X.O', 'XX.', 'XOO',  # 横
 'XXX', '.XO', 'O.O',  # 縦
 'XXO', 'XXO']         # 斜め

というリストを作る。

横の3ラインは引数と同じだからいいとして、縦の3ラインを作るのに zip を使っている人が多かった。

[''.join(p) for p in zip(*r)]

で、縦のラインが得られる。まあ、でも普通に

[r[0][i] + r[1][i] + r[2][i] for i in range(3)]

と書いた方が読みやすいかもしれない。まあ、お好みで。

まとめて書いてみた。

def checkio(game_result):
    r = game_result  # 横
    r += [r[0][i] + r[1][i] + r[2][i] for i in range(3)]  # 縦
    r += [r[0][0] + r[1][1] + r[2][2], r[0][2] + r[1][1] + r[2][0]]  # 斜め

    o = r.count('OOO')
    x = r.count('XXX')

    if o and x:
        return 'D'  # or raise exception
    elif o:
        return 'O'
    elif x:
        return 'X'
    else:
        return 'D'

だいぶシンプルになったかな。