2021-01-19 00:15:18 +03:00
|
|
|
app "nqueens"
|
2021-12-12 15:55:46 +03:00
|
|
|
packages { pf: "platform" }
|
2021-12-22 04:17:31 +03:00
|
|
|
imports [ pf.Task ]
|
2021-12-12 15:55:46 +03:00
|
|
|
provides [ main ] to pf
|
2021-01-19 00:15:18 +03:00
|
|
|
|
|
|
|
main : Task.Task {} []
|
|
|
|
main =
|
2021-12-22 04:17:31 +03:00
|
|
|
Task.after
|
|
|
|
Task.getInt
|
|
|
|
\n ->
|
|
|
|
queens n# original koka 13
|
|
|
|
|
|
|
|
|> Num.toStr
|
|
|
|
|> Task.putLine
|
2021-01-19 00:15:18 +03:00
|
|
|
|
|
|
|
ConsList a : [ Nil, Cons a (ConsList a) ]
|
|
|
|
|
|
|
|
queens = \n -> length (findSolutions n n)
|
|
|
|
|
|
|
|
length : ConsList a -> I64
|
|
|
|
length = \xs -> lengthHelp xs 0
|
|
|
|
|
|
|
|
lengthHelp : ConsList a, I64 -> I64
|
2021-01-28 17:33:11 +03:00
|
|
|
lengthHelp = \foobar, acc ->
|
|
|
|
when foobar is
|
2021-12-22 04:17:31 +03:00
|
|
|
Cons _ lrest ->
|
|
|
|
lengthHelp lrest (1 + acc)
|
|
|
|
|
|
|
|
Nil ->
|
|
|
|
acc
|
2021-01-19 00:15:18 +03:00
|
|
|
|
|
|
|
safe : I64, I64, ConsList I64 -> Bool
|
|
|
|
safe = \queen, diagonal, xs ->
|
|
|
|
when xs is
|
|
|
|
Nil ->
|
|
|
|
True
|
|
|
|
|
|
|
|
Cons q t ->
|
|
|
|
queen != q && queen != q + diagonal && queen != q - diagonal && safe queen (diagonal + 1) t
|
|
|
|
|
|
|
|
appendSafe : I64, ConsList I64, ConsList (ConsList I64) -> ConsList (ConsList I64)
|
|
|
|
appendSafe = \k, soln, solns ->
|
|
|
|
if k <= 0 then
|
|
|
|
solns
|
|
|
|
else if safe k 1 soln then
|
|
|
|
appendSafe (k - 1) soln (Cons (Cons k soln) solns)
|
|
|
|
else
|
|
|
|
appendSafe (k - 1) soln solns
|
|
|
|
|
2021-01-28 17:33:11 +03:00
|
|
|
extend = \n, acc, solutions ->
|
|
|
|
when solutions is
|
2021-12-22 04:17:31 +03:00
|
|
|
Nil ->
|
|
|
|
acc
|
|
|
|
|
|
|
|
Cons soln rest ->
|
|
|
|
extend n (appendSafe n soln acc) rest
|
2021-01-19 00:15:18 +03:00
|
|
|
|
|
|
|
findSolutions = \n, k ->
|
|
|
|
if k == 0 then
|
|
|
|
Cons Nil Nil
|
|
|
|
else
|
|
|
|
extend n Nil (findSolutions n (k - 1))
|