Solve tic-tac-toe checker
Write a function that verifies whether or not a tic-tac-toe board is valid.
This commit is contained in:
parent
1b3f1b99f5
commit
bfd2180e6b
1 changed files with 99 additions and 0 deletions
99
scratch/facebook/moderate/tic-tac-toe-checker.py
Normal file
99
scratch/facebook/moderate/tic-tac-toe-checker.py
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
import random
|
||||||
|
|
||||||
|
def print_board(board):
|
||||||
|
result = []
|
||||||
|
for row in range(len(board)):
|
||||||
|
r = []
|
||||||
|
for col in range(len(board[row])):
|
||||||
|
cell = board[row][col]
|
||||||
|
if not cell:
|
||||||
|
r.append("-")
|
||||||
|
else:
|
||||||
|
r.append(cell)
|
||||||
|
result.append(" | ".join(r))
|
||||||
|
print("\n---------\n".join(result))
|
||||||
|
|
||||||
|
def init_board():
|
||||||
|
result = []
|
||||||
|
for row in range(3):
|
||||||
|
r = []
|
||||||
|
for col in range(3):
|
||||||
|
r.append(None)
|
||||||
|
result.append(r)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def check(board, player):
|
||||||
|
print_board(board)
|
||||||
|
print()
|
||||||
|
if player not in "XO":
|
||||||
|
raise Exception("Only checking the board for Xs or Os. You supplied {}".format(player))
|
||||||
|
dn, ax, ddg, udg = "DOWN", "ACROSS", "DOWN_DIAGONAL", "UP_DIAGONAL"
|
||||||
|
ways = [
|
||||||
|
[[dn, ax, ddg], [dn], [dn, udg]],
|
||||||
|
[[ax], [], []],
|
||||||
|
[[ax], [], []],
|
||||||
|
]
|
||||||
|
for row in range(len(board)):
|
||||||
|
for col in range(len(board[row])):
|
||||||
|
if board[row][col] == player:
|
||||||
|
xs = ways[row][col]
|
||||||
|
for x in xs:
|
||||||
|
if x == dn:
|
||||||
|
if {player} == {board[row+1][col], board[row+2][col]}:
|
||||||
|
return True
|
||||||
|
if x == ax:
|
||||||
|
if {player} == {board[row][col+1], board[row][col+2]}:
|
||||||
|
return True
|
||||||
|
if x == ddg:
|
||||||
|
if {player} == {board[row+1][col+1], board[row+2][col+2]}:
|
||||||
|
return True
|
||||||
|
if x == udg:
|
||||||
|
if {player} == {board[row+1][col-1], board[row+2][col-2]}:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def op(player):
|
||||||
|
return "X" if player == "O" else "O"
|
||||||
|
|
||||||
|
dn_win = lambda p: [
|
||||||
|
[op(p), p, None],
|
||||||
|
[op(p), p, None],
|
||||||
|
[None, p, None],
|
||||||
|
]
|
||||||
|
|
||||||
|
ax_win = lambda p: [
|
||||||
|
[p, p, p],
|
||||||
|
[op(p), op(p), None],
|
||||||
|
[None, None, None],
|
||||||
|
]
|
||||||
|
|
||||||
|
ddg_win = lambda p: [
|
||||||
|
[p, None, None],
|
||||||
|
[op(p), p, None],
|
||||||
|
[op(p), None, p],
|
||||||
|
]
|
||||||
|
|
||||||
|
udg_win = lambda p: [
|
||||||
|
[op(p), None, p],
|
||||||
|
[op(p), p, None],
|
||||||
|
[p, None, None],
|
||||||
|
]
|
||||||
|
|
||||||
|
# Down
|
||||||
|
p = random.choice(["X", "O"])
|
||||||
|
assert check(dn_win(p), p) == True
|
||||||
|
assert check(dn_win(p), op(p)) == False
|
||||||
|
# Across
|
||||||
|
p = random.choice(["X", "O"])
|
||||||
|
assert check(ax_win(p), p) == True
|
||||||
|
assert check(ax_win(p), op(p)) == False
|
||||||
|
# Down Diagonally
|
||||||
|
p = random.choice(["X", "O"])
|
||||||
|
assert check(ddg_win(p), p) == True
|
||||||
|
assert check(ddg_win(p), op(p)) == False
|
||||||
|
# Down Diagonally
|
||||||
|
p = random.choice(["X", "O"])
|
||||||
|
assert check(udg_win(p), p) == True
|
||||||
|
assert check(udg_win(p), op(p)) == False
|
||||||
|
# Success
|
||||||
|
print("Tests pass!")
|
Loading…
Reference in a new issue