You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.8 KiB
209 lines
5.8 KiB
|
|
mod playground;
|
|
mod solver;
|
|
mod mysolver;
|
|
|
|
use mysolver::MySolver;
|
|
use playground::Playground;
|
|
use solver::Solver;
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
// Note this useful idiom: importing names from outer (for mod tests) scope.
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_sudoku_1() {
|
|
let field = r#"7 0 6 3 0 8 0 0 9
|
|
0 0 0 2 6 0 3 0 0
|
|
0 5 0 0 0 0 0 8 0
|
|
0 0 0 9 0 1 8 0 2
|
|
4 0 0 0 0 0 0 0 6
|
|
9 0 3 8 0 6 0 0 0
|
|
0 9 0 0 0 0 0 7 0
|
|
0 0 5 0 2 4 0 0 0
|
|
6 0 0 1 0 3 2 0 4"#;
|
|
exec_test(field);
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_2() {
|
|
let field = r#"{0,0,4,1,0,0,3,0,0},
|
|
{0,7,0,0,0,8,0,0,1},
|
|
{0,0,0,0,0,0,7,0,9},
|
|
{8,0,3,0,5,9,0,0,2},
|
|
{0,0,9,6,0,1,5,0,0},
|
|
{1,0,0,8,2,0,9,0,4},
|
|
{6,0,1,0,0,0,0,0,0},
|
|
{4,0,0,3,0,0,0,9,0},
|
|
{0,0,8,0,0,4,2,0,0}};"#;
|
|
|
|
exec_test(field);
|
|
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_3() {
|
|
let field = r#"{0,0,0,0,2,3,4,0,8},
|
|
{0,0,0,0,7,4,6,9,0},
|
|
{0,0,0,8,9,0,0,0,7},
|
|
{0,0,9,3,0,0,7,4,0},
|
|
{0,7,0,0,4,0,0,3,0},
|
|
{0,8,3,0,0,7,2,0,0},
|
|
{5,0,0,0,1,9,0,0,0},
|
|
{0,9,2,4,3,0,0,0,0},
|
|
{3,0,6,7,5,0,0,0,0}}"#;
|
|
|
|
exec_test(field);
|
|
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_4() {
|
|
let field = r#"{0,0,0,0,6,0,0,3,0},
|
|
{0,9,6,0,0,5,0,0,4},
|
|
{0,0,0,7,0,1,0,6,0},
|
|
{0,1,0,0,0,3,0,9,5},
|
|
{0,4,9,0,1,0,7,2,0},
|
|
{7,3,0,5,0,0,0,1,0},
|
|
{0,6,0,9,0,7,0,0,0},
|
|
{4,0,0,8,0,0,9,5,0},
|
|
{0,2,0,0,5,0,0,0,0}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_5() {
|
|
let field = r#"{9,0,6,1,0,7,3,0,4},
|
|
{0,8,3,0,0,5,0,0,7},
|
|
{0,0,0,0,0,0,2,0,9},
|
|
{8,4,5,3,7,1,9,2,6},
|
|
{3,0,2,5,6,8,0,0,1},
|
|
{1,0,7,9,2,4,0,3,0},
|
|
{6,0,9,4,3,2,7,0,8},
|
|
{0,3,0,0,1,6,5,0,0},
|
|
{2,1,8,7,5,0,0,0,3}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_6() {
|
|
let field = r#"{0,8,0,0,0,0,0,0,0},
|
|
{0,0,0,6,3,0,0,4,1},
|
|
{0,0,0,5,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,9,0},
|
|
{0,0,0,0,0,0,0,5,0},
|
|
{9,0,0,0,0,0,0,0,0},
|
|
{0,0,0,8,0,2,0,0,0},
|
|
{0,5,0,0,9,0,0,0,0},
|
|
{0,0,0,4,5,0,9,0,0}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_7() {
|
|
let field = r#"{0,0,0,0,0,7,0,2,0},
|
|
{0,0,4,0,0,0,0,3,0},
|
|
{0,1,0,0,9,0,0,0,5},
|
|
{0,0,0,0,0,6,3,0,0},
|
|
{6,0,0,0,0,0,1,7,0},
|
|
{0,7,3,4,0,0,0,0,2},
|
|
{0,0,0,0,6,0,0,9,0},
|
|
{3,0,7,0,8,0,5,0,0},
|
|
{0,5,1,0,0,0,0,0,0}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
#[test]
|
|
fn test_sudoku_8() {
|
|
let field = r#"{0,0,0,0,0,0,0,1,0},
|
|
{0,3,0,0,0,4,0,0,0},
|
|
{0,0,0,0,0,0,3,9,0},
|
|
{0,4,0,8,0,2,0,0,0},
|
|
{5,0,0,0,0,0,0,0,0},
|
|
{0,0,9,0,6,0,2,5,0},
|
|
{8,0,0,0,3,0,9,0,0},
|
|
{9,0,0,4,0,0,0,8,0},
|
|
{1,0,0,6,0,9,0,0,5}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
/**
|
|
* Tests if the solver can cope with
|
|
* an empty board
|
|
*/
|
|
#[test]
|
|
fn test_sudoku_empty() {
|
|
let field = r#"{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0}}"#;
|
|
|
|
exec_test(field);
|
|
}
|
|
|
|
|
|
fn exec_test(field : &str) {
|
|
let pg = Playground::from(field);
|
|
let solver = MySolver::new();
|
|
let result = solver.solve(&pg);
|
|
|
|
assert!(result.is_some());
|
|
let result_pg = result.unwrap();
|
|
assert!(result_pg.is_valid());
|
|
assert!(result_pg.is_solved());
|
|
|
|
assert!(result_pg.contains(&pg));
|
|
}
|
|
|
|
}
|
|
fn main() {
|
|
|
|
let field = r#"{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0},
|
|
{0,0,0,0,0,0,0,0,0}}"#;
|
|
|
|
let pg = Playground::from(field);
|
|
|
|
pg.print();
|
|
|
|
let solver = MySolver::new();
|
|
|
|
println!("");
|
|
|
|
if let Some(result) = solver.solve(&pg) {
|
|
result.print();
|
|
|
|
if !result.contains(&pg) {
|
|
println!("Solver modified predefined fields!")
|
|
} if !result.is_valid() {
|
|
println!("Solver has not correctly solved the sudoku!")
|
|
} else if !result.is_solved() {
|
|
println!("Solver was not able to solve the sudoku!")
|
|
}
|
|
assert!(result.contains(&pg));
|
|
} else {
|
|
println!("Solver was not able to resolve the sodoku!")
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|