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'
だいぶシンプルになったかな。