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.
This commit is contained in:
parent
65afb11546
commit
5b0a1716b5
|
@ -44,14 +44,20 @@ fn root(size: Int) -> Queue<(Int, ChessSet)> {
|
||||||
queue.append_all_front(queue.new(), mk_starts(size))
|
queue.append_all_front(queue.new(), mk_starts(size))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mk_starts(sze: Int) -> List<(Int, ChessSet)> {
|
fn mk_starts(size: Int) -> List<(Int, ChessSet)> {
|
||||||
let x_list = interval(1, sze)
|
let it = interval(1, size)
|
||||||
let y_list = interval(1, sze)
|
|
||||||
|
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)
|
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<Int> {
|
fn interval(a: Int, b: Int) -> List<Int> {
|
||||||
|
|
|
@ -33,32 +33,21 @@ pub fn last_piece(board: ChessSet) -> Tile {
|
||||||
pub fn delete_first(board: ChessSet) -> ChessSet {
|
pub fn delete_first(board: ChessSet) -> ChessSet {
|
||||||
let ChessSet { move_number, visited, .. } = board
|
let ChessSet { move_number, visited, .. } = board
|
||||||
|
|
||||||
expect Some(deleted_first) = list.init(visited)
|
expect Some(new_visited) = list.init(visited)
|
||||||
|
|
||||||
ChessSet {
|
ChessSet {
|
||||||
..board,
|
..board,
|
||||||
move_number: move_number - 1,
|
move_number: move_number - 1,
|
||||||
start: second_last(visited),
|
start: second_last(visited),
|
||||||
visited: deleted_first,
|
visited: new_visited,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn second_last(visited: List<a>) -> Option<a> {
|
fn second_last(visited: List<a>) -> Option<a> {
|
||||||
when visited is {
|
when list.reverse(visited) is {
|
||||||
[] -> None
|
[] -> fail
|
||||||
[_, ..rest] -> {
|
[_] -> None
|
||||||
let value = second_last(rest)
|
[_, a, ..] -> Some(a)
|
||||||
|
|
||||||
if value == None {
|
|
||||||
if builtin.null_list(rest) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(builtin.head_list(visited))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue