mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 00:24:34 +00:00
add nqueens example
This commit is contained in:
parent
c4e5af554b
commit
c5d3aae878
1 changed files with 54 additions and 0 deletions
54
examples/effect/NQueens.roc
Normal file
54
examples/effect/NQueens.roc
Normal file
|
@ -0,0 +1,54 @@
|
|||
app "effect-example"
|
||||
packages { base: "thing/platform-dir" }
|
||||
imports [base.Task]
|
||||
provides [ main ] to base
|
||||
|
||||
main : Task.Task {} []
|
||||
main =
|
||||
queens 10
|
||||
|> Str.fromInt
|
||||
|> 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 = \xs, acc ->
|
||||
when xs is
|
||||
Nil -> acc
|
||||
Cons _ rest -> lengthHelp rest (1 + acc)
|
||||
|
||||
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, solns ->
|
||||
when solns 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))
|
Loading…
Add table
Add a link
Reference in a new issue