From beaa3cfd61868b9e5b5b9b411445d1481362f3da Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Mon, 19 Feb 2024 18:55:27 +0100 Subject: [PATCH] Impl: Get possible values from row --- src/playfield.rs | 4 ++-- src/sudoku_solver.rs | 26 +++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/playfield.rs b/src/playfield.rs index 952786c..99f7d54 100644 --- a/src/playfield.rs +++ b/src/playfield.rs @@ -2,7 +2,7 @@ use std::fmt; #[derive(PartialEq, Debug, Clone)] pub struct Playfield { - size: usize, + pub size: usize, pub fields: Vec>, pub open_fields: Vec, } @@ -20,7 +20,7 @@ impl Playfield { playfield.parse(field); - return playfield; + playfield } fn parse(&mut self, field: &String) { diff --git a/src/sudoku_solver.rs b/src/sudoku_solver.rs index a2ba2ed..c7ea286 100644 --- a/src/sudoku_solver.rs +++ b/src/sudoku_solver.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use crate::playfield::Field; use crate::playfield::Playfield; @@ -5,7 +7,7 @@ pub struct SudokuSolver { playfield: Playfield, } -impl<'a> SudokuSolver { +impl SudokuSolver { pub fn new(playfield: &Playfield) -> SudokuSolver { Self { playfield: playfield.clone(), @@ -18,17 +20,33 @@ impl<'a> SudokuSolver { fn populate_possible_values(&self) { for open_field in &self.playfield.open_fields {} } - fn possible_values_from_row(&self, row: Vec) -> Vec {} + fn possible_values_from_row(&self, row: &Vec) -> Vec { + let max_value = self.playfield.size as u32; + let possible_values: HashSet = (1..max_value + 1).collect(); + + let populated_values: HashSet = row + .iter() + .filter(|field| field.value.is_some()) + .map(|v| v.value.unwrap()) + .collect(); + + possible_values + .symmetric_difference(&populated_values) + .map(|v| *v) + .collect() + } } #[cfg(test)] mod tests { use crate::sudoku_solver::SudokuSolver; use crate::Playfield; + fn create_test_playfield(input: &str, size: usize) -> Playfield { Playfield::new(&input.to_string(), size) } mod solve { use super::*; + #[test] fn simple() { let playfield = create_test_playfield("1 2 3 2 3 1 3 1 0", 3); @@ -42,13 +60,15 @@ mod tests { mod populate_possible_values { mod possible_values_from_row { use super::super::*; + #[test] fn simple() { let playfield = create_test_playfield("1 2 0 1 2 0 1 2 0", 3); let expected = vec![3]; let possible_values = - SudokuSolver::new(&playfield).possible_values_from_row(playfield.fields[0]); + SudokuSolver::new(&playfield).possible_values_from_row(&playfield.fields[0]); + assert_eq!(possible_values, expected); } }