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…
	
	Add table
		Add a link
		
	
		Reference in a new issue