mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-27 00:13:48 +00:00
53 lines
1.3 KiB
Text
53 lines
1.3 KiB
Text
app "nqueens"
|
|
packages { pf: "platform/main.roc" }
|
|
imports [pf.Task]
|
|
provides [main] to pf
|
|
|
|
main : Task.Task {} []
|
|
main =
|
|
Task.after
|
|
Task.getInt
|
|
\n ->
|
|
queens n # original koka 13
|
|
|> Num.toStr
|
|
|> Task.putLine
|
|
|
|
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
|
|
Cons _ lrest -> lengthHelp lrest (1 + acc)
|
|
Nil -> acc
|
|
|
|
safe : I64, I64, ConsList I64 -> Bool
|
|
safe = \queen, diagonal, xs ->
|
|
when xs is
|
|
Nil -> Bool.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
|
|
Nil -> acc
|
|
Cons soln rest -> extend n (appendSafe n soln acc) rest
|
|
|
|
findSolutions = \n, k ->
|
|
if k == 0 then
|
|
Cons Nil Nil
|
|
else
|
|
extend n Nil (findSolutions n (k - 1))
|