///|
fn demonstrate() -> Unit raise {
let (b, start) = @peg.triangle_board(5, 0)
println("MoonPeg: triangular 15-hole puzzle")
println(b.render(start))
let result = b.solve(start, AnySingle, 100000)
match result.outcome {
Solved(moves) => {
assert_true(b.verify_solution(start, moves, AnySingle))
println(
"Solved: \{moves.length()} jumps; expanded \{result.visited} nodes",
)
let states = b.replay(start, moves)
println(b.render(states[states.length() - 1]))
}
_ => abort("tutorial fixture must solve within the documented budget")
}
let goal = b.goal_at(0, 0)
let end = match goal {
Exact(p) => p
_ => abort("exact coordinate goal")
}
let generated = b.generate(end, 8, 42U)
assert_true(b.verify_solution(generated.start, generated.solution, goal))
let portable = b.encode_steps(generated.solution)
assert_true(b.verify_steps(generated.start, goal, portable))
println(
"Generated: \{generated.start.count()} pegs; verified coordinate certificate",
)
let (line, p) = @peg.parse_board("oo.")
assert_eq(line.solve(p, AnySingle, 0).outcome, Exhausted)
let (_, dead) = @peg.parse_board("o.o")
assert_eq(line.solve(dead, AnySingle, 100).outcome, Unsolvable)
println("Budget exhaustion and proven impossibility remain distinct.")
}
///|
fn main {
demonstrate() catch {
_ => abort("tutorial assertion or operation failed")
}
}