roc/examples/benchmarks/NQueens.roc

63 lines
1.4 KiB
Plaintext
Raw Normal View History

2021-01-19 00:15:18 +03:00
app "nqueens"
packages { pf: "platform" }
2021-12-22 04:17:31 +03:00
imports [ pf.Task ]
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
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
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))