31 lines
975 B
Text
31 lines
975 B
Text
defmodule Chess960 do
|
|
@krn ~w(NNRKR NRNKR NRKNR NRKRN RNNKR RNKNR RNKRN RKNNR RKNRN RKRNN)
|
|
|
|
def start_position, do: start_position(:rand.uniform(960)-1)
|
|
|
|
def start_position(id) do
|
|
pos = List.duplicate(nil, 8)
|
|
q = div(id, 4)
|
|
r = rem(id, 4)
|
|
pos = List.replace_at(pos, r * 2 + 1, "B")
|
|
q = div(q, 4)
|
|
r = rem(q, 4)
|
|
pos = List.replace_at(pos, r * 2, "B")
|
|
q = div(q, 6)
|
|
r = rem(q, 6)
|
|
i = Enum.reject(0..7, &Enum.at(pos,&1)) |> Enum.at(r)
|
|
pos = List.replace_at(pos, i, "Q")
|
|
krn = Enum.at(@krn, q) |> String.codepoints
|
|
Enum.reject(0..7, &Enum.at(pos,&1))
|
|
|> Enum.zip(krn)
|
|
|> Enum.reduce(pos, fn {i,x},acc -> List.replace_at(acc,i,x) end)
|
|
|> Enum.join
|
|
end
|
|
end
|
|
|
|
IO.puts "Generate Start Position from ID number"
|
|
Enum.each([0,518,959], fn id ->
|
|
:io.format "~3w : ~s~n", [id, Chess960.start_position(id)]
|
|
end)
|
|
IO.puts "\nGenerate random Start Position"
|
|
Enum.each(1..5, fn _ -> IO.puts Chess960.start_position end)
|