From 5b0a1716b574f1bb4bf974ca47bacd349efb8745 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Tue, 16 Jul 2024 14:48:51 +0200 Subject: [PATCH] Fix mk_starts and second_last in knights benchmarks. mk_starts was not yielding enough values. It's originally a translation of a double list comprehension in Haskell, which cannot simply be translated to a map2. The latter combine elements two by two, but the former works through all possible permutations. --- examples/benchmarks/lib/benchmarks/knights.ak | 16 +++++++++---- .../lib/benchmarks/knights/chess_set.ak | 23 +++++-------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/examples/benchmarks/lib/benchmarks/knights.ak b/examples/benchmarks/lib/benchmarks/knights.ak index 23926aa5..6aa16529 100644 --- a/examples/benchmarks/lib/benchmarks/knights.ak +++ b/examples/benchmarks/lib/benchmarks/knights.ak @@ -44,14 +44,20 @@ fn root(size: Int) -> Queue<(Int, ChessSet)> { queue.append_all_front(queue.new(), mk_starts(size)) } -fn mk_starts(sze: Int) -> List<(Int, ChessSet)> { - let x_list = interval(1, sze) - let y_list = interval(1, sze) +fn mk_starts(size: Int) -> List<(Int, ChessSet)> { + let it = interval(1, size) + + let l = + list.flat_map( + it, + fn(x) { list.map(it, fn(y) { start_tour((x, y), size) }) }, + ) - let l = x_list |> list.map2(y_list, fn(a, b) { start_tour((a, b), sze) }) let length = list.length(l) - list.repeat(1 - length, length) |> list.zip(l) + expect length == size * size + + list.zip(list.repeat(1 - length, length), l) } fn interval(a: Int, b: Int) -> List { diff --git a/examples/benchmarks/lib/benchmarks/knights/chess_set.ak b/examples/benchmarks/lib/benchmarks/knights/chess_set.ak index 30f78440..5639dacc 100644 --- a/examples/benchmarks/lib/benchmarks/knights/chess_set.ak +++ b/examples/benchmarks/lib/benchmarks/knights/chess_set.ak @@ -33,32 +33,21 @@ pub fn last_piece(board: ChessSet) -> Tile { pub fn delete_first(board: ChessSet) -> ChessSet { let ChessSet { move_number, visited, .. } = board - expect Some(deleted_first) = list.init(visited) + expect Some(new_visited) = list.init(visited) ChessSet { ..board, move_number: move_number - 1, start: second_last(visited), - visited: deleted_first, + visited: new_visited, } } fn second_last(visited: List) -> Option { - when visited is { - [] -> None - [_, ..rest] -> { - let value = second_last(rest) - - if value == None { - if builtin.null_list(rest) { - None - } else { - Some(builtin.head_list(visited)) - } - } else { - value - } - } + when list.reverse(visited) is { + [] -> fail + [_] -> None + [_, a, ..] -> Some(a) } }