From c90c7ac30db2cdbf2412ad83c8680f3db03007de Mon Sep 17 00:00:00 2001 From: Alexandre Plateau Date: Thu, 10 Jul 2025 18:31:54 +0200 Subject: [PATCH] feat(rosetta, tests): adding N queens solution --- tests/benchmarks/main.cpp | 5 +-- .../benchmarks/resources/runtime/n_queens.ark | 32 +++++++++++++++++++ .../resources/RosettaSuite/n_queens.ark | 32 +++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 tests/benchmarks/resources/runtime/n_queens.ark create mode 100644 tests/unittests/resources/RosettaSuite/n_queens.ark diff --git a/tests/benchmarks/main.cpp b/tests/benchmarks/main.cpp index f7523201..ca511f7f 100644 --- a/tests/benchmarks/main.cpp +++ b/tests/benchmarks/main.cpp @@ -33,8 +33,9 @@ ARK_CREATE_RUNTIME_BENCH(fibonacci)->Iterations(100); ARK_CREATE_RUNTIME_BENCH(builtins); ARK_CREATE_RUNTIME_BENCH(binary_trees); ARK_CREATE_RUNTIME_BENCH(for_sum); -ARK_CREATE_RUNTIME_BENCH(create_closure); -ARK_CREATE_RUNTIME_BENCH(create_list); +ARK_CREATE_RUNTIME_BENCH(create_closure)->Iterations(500); +ARK_CREATE_RUNTIME_BENCH(create_list)->Iterations(500); +ARK_CREATE_RUNTIME_BENCH(n_queens)->Iterations(50); // -------------------------------------------- // parser benchmarks diff --git a/tests/benchmarks/resources/runtime/n_queens.ark b/tests/benchmarks/resources/runtime/n_queens.ark new file mode 100644 index 00000000..f64e4d9b --- /dev/null +++ b/tests/benchmarks/resources/runtime/n_queens.ark @@ -0,0 +1,32 @@ +(let queenPuzzle (fun (rows columns) + (if (<= rows 0) + [[]] + (addQueen (- rows 1) columns)))) + +(let addQueen (fun (newRow columns) { + (mut newSolutions []) + (let prev (queenPuzzle newRow columns)) + + (mut i 0) + (while (< i (len prev)) { + (let solution (@ prev i)) + (mut newColumn 0) + (while (< newColumn columns) { + (if (not (hasConflict newRow newColumn solution)) (append! newSolutions (append solution newColumn))) + (set newColumn (+ newColumn 1)) }) + + (set i (+ i 1)) }) + + newSolutions })) + +(let hasConflict (fun (newRow newColumn solution) { + (mut i 0) + (mut conflict false) + (while (and (< i newRow) (not conflict)) { + (if (or (= (@ solution i) newColumn) (= (+ (@ solution i) i) (+ newColumn newRow)) (= (- (@ solution i) i) (- newColumn newRow))) + (set conflict true)) + (set i (+ i 1)) }) + + conflict })) + +(assert (= (len (queenPuzzle 8 8)) 92) "92 solutions were found") diff --git a/tests/unittests/resources/RosettaSuite/n_queens.ark b/tests/unittests/resources/RosettaSuite/n_queens.ark new file mode 100644 index 00000000..afe1b169 --- /dev/null +++ b/tests/unittests/resources/RosettaSuite/n_queens.ark @@ -0,0 +1,32 @@ +(let queenPuzzle (fun (rows columns) + (if (<= rows 0) + [[]] + (addQueen (- rows 1) columns)))) + +(let addQueen (fun (newRow columns) { + (mut newSolutions []) + (let prev (queenPuzzle newRow columns)) + + (mut i 0) + (while (< i (len prev)) { + (let solution (@ prev i)) + (mut newColumn 0) + (while (< newColumn columns) { + (if (not (hasConflict newRow newColumn solution)) (append! newSolutions (append solution newColumn))) + (set newColumn (+ newColumn 1)) }) + + (set i (+ i 1)) }) + + newSolutions })) + +(let hasConflict (fun (newRow newColumn solution) { + (mut i 0) + (mut conflict false) + (while (and (< i newRow) (not conflict)) { + (if (or (= (@ solution i) newColumn) (= (+ (@ solution i) i) (+ newColumn newRow)) (= (- (@ solution i) i) (- newColumn newRow))) + (set conflict true)) + (set i (+ i 1)) }) + + conflict })) + +(assert (= (queenPuzzle 4 4) [[1 3 0 2] [2 0 3 1]]) "The two correct solutions were found")