Skip to content

Instantly share code, notes, and snippets.

@baweaver
Created January 14, 2021 00:25
Show Gist options
  • Save baweaver/590243de43731830c48c582911e0ed98 to your computer and use it in GitHub Desktop.
Save baweaver/590243de43731830c48c582911e0ed98 to your computer and use it in GitHub Desktop.
Using Pattern Matching to solve Tic Tac Toe
MOVE = /[XO]/.freeze
def board(*rows) = rows.map(&:chars)
def winner(board)
case board
in [
[MOVE => move, ^move, ^move],
[_, _, _],
[_, _, _]
]
[:horizontal, move]
in [
[_, _, _],
[MOVE => move, ^move, ^move],
[_, _, _]
]
[:horizontal, move]
in [
[_, _, _],
[_, _, _],
[MOVE => move, ^move, ^move]
]
[:horizontal, move]
in [
[MOVE => move, _, _],
[^move, _, _],
[^move, _, _]
]
[:vertical, move]
in [
[_, MOVE => move, _],
[_, ^move, _],
[_, ^move, _]
]
[:vertical, move]
in [
[_, _, MOVE => move],
[_, _, ^move],
[_, _, ^move]
]
[:vertical, move]
in [
[MOVE => move, _, _],
[_, ^move, _],
[_, _, ^move]
]
[:diagonal, move]
in [
[_, _, MOVE => move],
[_, ^move, _],
[^move, _, _]
]
[:diagonal, move]
else
[:none, false]
end
end
EXAMPLES = {
straights: [
# Win
board('XXX', ' ', ' '),
board(' ', 'OOO', ' '),
board(' ', ' ', 'XXX'),
# No Win
board('X X', ' ', ' '),
board(' ', 'O O', ' '),
board(' ', ' ', 'X X'),
],
verticals: [
# Win
board('X ', 'X ', 'X '),
board(' O ', ' O ', ' O '),
board(' X', ' X', ' X'),
# No Win
board(' ', 'X ', 'X '),
board(' O ', ' ', ' O '),
board(' X', ' X', ' '),
],
diagonals: [
# Win
board('O ', ' O ', ' O'),
board(' X', ' X ', 'X '),
# No Win
board('O ', ' O ', ' '),
board(' X', ' X ', ' '),
]
}
EXAMPLES.each do |type, boards|
boards.each do |board|
puts "type: #{type}, win: #{winner(board)}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment