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!") } }