Skip to content

Instantly share code, notes, and snippets.

@devstopfix
Created February 24, 2019 17:46
Show Gist options
  • Save devstopfix/673de62d671de54de585a38d22bc2918 to your computer and use it in GitHub Desktop.
Save devstopfix/673de62d671de54de585a38d22bc2918 to your computer and use it in GitHub Desktop.
Elixir generator of Chess960 openings
defmodule Chess960 do
@moduledoc """
Generate all 960 starting positions for Chess960
https://en.wikipedia.org/wiki/Chess960#Starting_position_requirements
Run with
elixir chess960.exs
"""
def generate_openings do
[:R, :N, :B, :K, :Q, :B, :N, :R]
|> permute
|> Enum.filter(&king_between_rooks/1)
|> Enum.filter(&bishops_on_opposite_colors/1)
|> MapSet.new()
end
# http://rosettacode.org/wiki/Permutations#Elixir
defp permute([]), do: [[]]
defp permute(list) do
for x <- list, y <- permute(list -- [x]), do: [x|y]
end
defp king_between_rooks([:K|_]), do: false
defp king_between_rooks([:R|row]), do: king_between_rooks(:R, row)
defp king_between_rooks([_|row]), do: king_between_rooks(row)
defp king_between_rooks(:R, [:R|_]), do: false
defp king_between_rooks(:R, [:K|_]), do: true
defp king_between_rooks(:R, [_|row]), do: king_between_rooks(:R, row)
defp bishops_on_opposite_colors([:B|row]), do: bishops_on_opposite_colors(:B, row)
defp bishops_on_opposite_colors([_|row]), do: bishops_on_opposite_colors(row)
defp bishops_on_opposite_colors(:B, [:B|_]), do: true
defp bishops_on_opposite_colors(:B, [_|[:B|_]]), do: false
defp bishops_on_opposite_colors(:B, [_|[_|row]]), do: bishops_on_opposite_colors(:B, row)
end
import ExUnit.Assertions
assert Chess960.generate_openings() |> Enum.count == 960
Chess960.generate_openings() |> Enum.sort() |> Enum.each(&IO.inspect/1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment