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.

183 lines
4.5 KiB

mod utils;
mod playground;
mod solver;
mod mysolver;
mod hecht;
use hecht::HechtSolver;
use playground::Playground;
use solver::Solver;
use clap::Parser;
static FIELDS: [[u8;81];9] =
[
[
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
],
[
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
],
[
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
],
[
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
],
[
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
],
[
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
],
[
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
],
[
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
],
[
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
]
];
#[cfg(test)]
mod tests {
// Note this useful idiom: importing names from outer (for mod tests) scope.
use super::*;
use rstest::*;
#[rstest]
#[case(0)]
#[case(1)]
#[case(2)]
#[case(3)]
#[case(4)]
#[case(5)]
#[case(6)]
#[case(7)]
#[case(8)]
fn solve_sudoku(#[case] field : usize) {
let pg = Playground::from_array(&FIELDS[field]);
let solver = HechtSolver::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));
}
}
/// Sudoku solver program
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Sudoku index number to use
#[arg(short, long, default_value_t = 1,value_parser = clap::value_parser!(u8).range(0..FIELDS.len() as i64))]
scenario: u8,
}
fn main() {
let args = Args::parse();
let pg = Playground::from_array(&FIELDS[args.scenario as usize]);
pg.print();
let solver = HechtSolver::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!")
}
}