Add nqueens benchmark (new kraken impl, with koka and cpp moved over from koka_bench)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
set(sources rbtree.kk)
|
||||
set(sources rbtree.kk nqueens.kk nqueens-int.kk)
|
||||
|
||||
set(koka koka)
|
||||
|
||||
|
||||
31
koka_bench/koka/nqueens-int.kk
Normal file
31
koka_bench/koka/nqueens-int.kk
Normal file
@@ -0,0 +1,31 @@
|
||||
module nqueens-int
|
||||
import std/os/env
|
||||
|
||||
alias solution = list<int>
|
||||
alias solutions = list<list<int>>
|
||||
|
||||
fun safe( queen : int, diag : int, ^xs : solution ) : bool
|
||||
match xs
|
||||
Cons(q,qs) -> (queen != q && queen != q + diag && queen != q - diag && safe(queen,diag + 1,qs))
|
||||
_ -> True
|
||||
|
||||
fun append-safe( queen : int, xs : solution, xss : solutions ) : div solutions
|
||||
if queen <= 0 then xss
|
||||
elif safe(queen,1,xs) then append-safe( queen - 1, xs, Cons(Cons(queen,xs),xss) )
|
||||
else append-safe( queen - 1, xs, xss )
|
||||
|
||||
fun extend(queen : int, acc : solutions, xss : solutions ) : div solutions
|
||||
match xss
|
||||
Cons(xs,rest) -> extend(queen, append-safe(queen,xs,acc), rest)
|
||||
Nil -> acc
|
||||
|
||||
fun find-solutions( n : int, queen : int ) : div solutions
|
||||
if queen == 0
|
||||
then [[]]
|
||||
else extend(n,[], find-solutions(n,queen - 1))
|
||||
|
||||
pub fun queens( n : int ) : div int
|
||||
find-solutions(n,n).length
|
||||
|
||||
pub fun main()
|
||||
queens(get-args().head("").parse-int.default(13)).println
|
||||
32
koka_bench/koka/nqueens.kk
Normal file
32
koka_bench/koka/nqueens.kk
Normal file
@@ -0,0 +1,32 @@
|
||||
module nqueens
|
||||
import std/num/int32
|
||||
import std/os/env
|
||||
|
||||
alias solution = list<int32>
|
||||
alias solutions = list<list<int32>>
|
||||
|
||||
fun safe( queen : int32, diag : int32, ^xs : solution ) : bool
|
||||
match xs
|
||||
Cons(q,qs) -> (queen != q && queen != (q+diag) && queen != (q - diag) && safe(queen,diag.inc,qs))
|
||||
_ -> True
|
||||
|
||||
fun append-safe( queen : int32, xs : solution, xss : solutions ) : div solutions
|
||||
if queen <= 0.int32 then xss
|
||||
elif safe(queen,1.int32,xs) then append-safe( queen.dec, xs, Cons(Cons(queen,xs),xss) )
|
||||
else append-safe( queen.dec, xs, xss )
|
||||
|
||||
fun extend( queen : int32, acc : solutions, xss : solutions ) : div solutions
|
||||
match xss
|
||||
Cons(xs,rest) -> extend(queen, append-safe(queen,xs,acc), rest)
|
||||
Nil -> acc
|
||||
|
||||
fun find-solutions( n : int32, queen : int32 ) : div solutions
|
||||
if queen.is-zero
|
||||
then [[]]
|
||||
else extend(n, [], find-solutions(n,queen.dec))
|
||||
|
||||
pub fun queens( n : int32 ) : div int
|
||||
find-solutions(n,n).length
|
||||
|
||||
pub fun main()
|
||||
queens(get-args().head("").parse-int.default(13).int32).println
|
||||
Reference in New Issue
Block a user