This is from the /r/dailyprogrammer at reddit.
The challenge is to find the winning move given input in this format (the first letter in the input indicates whose turn it is):
X
XX-
-XO
OO-
and print out the the board :
X | X | -
- | X | 0
0 | 0 | X
If there is no winning move, you print 'No winning move'. Here is my solution:
board_input = """
O
O-X
-OX
---"""
board = map(lambda x: list(x), board_input.split())
player = board.pop(0)[0]
board = [x for x in board]
win = []
def check(x):
return x.count('-') == 1 and x.count(player) == 2
for i in range(3):
row = board[i]
if check(row):
win = (i, row.index('-'))
break
col = zip(*board)[i]
if check(col):
win = (i, col.index('-'))
break
if len(win) == 0:
left_diag = [board[0][0], board[1][1], board[2][2]]
if check(left_diag):
win = (i, left_diag.index('-'))
right_diag = [board[0][2],board[1][1], board[2][0]]
if check(right_diag):
win = (i, right_diag.index('-'))
if win:
row = win[0]
col = win[1]
board[row][col] = player[0]
for i in range(3):
print ' | '.join(board[i])
else:
print 'No winning move.'
Not the most elegant solution, but it works :)