09 Sept 2026Go / Python / TypeScriptEasy

Find Winner on a Tic Tac Toe Game

Determine the winner or current state after a valid sequence of tic-tac-toe moves.

Mark alternating moves on a three-by-three board, test all rows, columns, and diagonals, then distinguish draw from pending by move count.

complexity

O(m) time for the moves and O(1) space.

solution files

  • Go find-winner-on-a-tic-tac-toe-game/solution.go
  • Python find-winner-on-a-tic-tac-toe-game/solution.py
  • TypeScript find-winner-on-a-tic-tac-toe-game/solution.ts

Solution files

Gofind-winner-on-a-tic-tac-toe-game/solution.go
package main

func tictactoe(moves [][]int) string {
	board := [3][3]int{}
	for index, move := range moves {
		if index%2 == 0 {
			board[move[0]][move[1]] = 1
		} else {
			board[move[0]][move[1]] = -1
		}
	}
	for index := 0; index < 3; index++ {
		row, column := 0, 0
		for offset := 0; offset < 3; offset++ {
			row += board[index][offset]
			column += board[offset][index]
		}
		if row == 3 || column == 3 {
			return "A"
		}
		if row == -3 || column == -3 {
			return "B"
		}
	}
	first, second := board[0][0]+board[1][1]+board[2][2], board[0][2]+board[1][1]+board[2][0]
	if first == 3 || second == 3 {
		return "A"
	}
	if first == -3 || second == -3 {
		return "B"
	}
	if len(moves) == 9 {
		return "Draw"
	}
	return "Pending"
}
Pythonfind-winner-on-a-tic-tac-toe-game/solution.py
class Solution:
    def tictactoe(self, moves: list[list[int]]) -> str:
        board = [[class="syntax-number">0] * class="syntax-number">3 for _ in range(class="syntax-number">3)]
        for index, (row, column) in enumerate(moves): board[row][column] = class="syntax-number">1 if index % class="syntax-number">2 == class="syntax-number">0 else -class="syntax-number">1
        lines = board + [list(column) for column in zip(*board)] + [[board[i][i] for i in range(class="syntax-number">3)], [board[i][class="syntax-number">2 - i] for i in range(class="syntax-number">3)]]
        for line in lines:
            if sum(line) == class="syntax-number">3: return class="syntax-string">"A"
            if sum(line) == -class="syntax-number">3: return class="syntax-string">"B"
        return class="syntax-string">"Draw" if len(moves) == class="syntax-number">9 else class="syntax-string">"Pending"
TypeScriptfind-winner-on-a-tic-tac-toe-game/solution.ts
function tictactoe(moves: number[][]): string {
  const board = Array.from({ length: class="syntax-number">3 }, () => new Array<number>(class="syntax-number">3).fill(class="syntax-number">0)); moves.forEach(([row, column], index) => { board[row][column] = index % class="syntax-number">2 === class="syntax-number">0 ? class="syntax-number">1 : -class="syntax-number">1; });
  const lines = [...board, ...[class="syntax-number">0, class="syntax-number">1, class="syntax-number">2].map((column) => board.map((row) => row[column])), [board[class="syntax-number">0][class="syntax-number">0], board[class="syntax-number">1][class="syntax-number">1], board[class="syntax-number">2][class="syntax-number">2]], [board[class="syntax-number">0][class="syntax-number">2], board[class="syntax-number">1][class="syntax-number">1], board[class="syntax-number">2][class="syntax-number">0]]];
  for (const line of lines) { const sum = line.reduce((total, value) => total + value, class="syntax-number">0); if (sum === class="syntax-number">3) return class="syntax-string">"A"; if (sum === -class="syntax-number">3) return class="syntax-string">"B"; }
  return moves.length === class="syntax-number">9 ? class="syntax-string">"Draw" : class="syntax-string">"Pending";
}