Impl: get_column for playfield

This commit is contained in:
Jonas Zeunert
2024-02-20 00:10:21 +01:00
parent 780ae5b956
commit d06d55aca9

View File

@@ -20,18 +20,27 @@ impl SudokuSolver {
fn populate_possible_values(&mut self) { fn populate_possible_values(&mut self) {
for open_field in &self.playfield.open_fields { for open_field in &self.playfield.open_fields {
let row_index = open_field / self.playfield.size; let row_index = open_field / self.playfield.size;
let row = &mut self.playfield.fields[row_index]; let row = &self.playfield.fields[row_index];
let possible_values_row = possible_values_from_vec(row, self.playfield.size as u32);
let col_index = open_field % self.playfield.size; let col_index = open_field % self.playfield.size;
let col = self.playfield.get_column(col_index);
let possible_values_col = possible_values_from_vec(&col, self.playfield.size as u32);
let possible_values = possible_values_from_row(row, self.playfield.size as u32); let possible_values = possible_values_row
.symmetric_difference(&possible_values_col)
.map(|v| *v)
.collect();
let row = &mut self.playfield.fields[row_index];
let field = &mut row[col_index]; let field = &mut row[col_index];
field.possible_values = possible_values; field.possible_values = possible_values;
} }
} }
} }
fn possible_values_from_row(row: &Vec<Field>, max_value: u32) -> Vec<u32> { fn possible_values_from_vec(row: &Vec<Field>, max_value: u32) -> HashSet<u32> {
let possible_values: HashSet<u32> = (1..max_value + 1).collect(); let possible_values: HashSet<u32> = (1..max_value + 1).collect();
let populated_values: HashSet<u32> = row let populated_values: HashSet<u32> = row
@@ -94,7 +103,7 @@ mod tests {
assert!(field_4_values.iter().all(|i| expected_4.contains(i))); assert!(field_4_values.iter().all(|i| expected_4.contains(i)));
} }
} }
mod possible_values_from_row { mod possible_values_from_vec {
use super::super::*; use super::super::*;
use super::*; use super::*;
@@ -105,9 +114,9 @@ mod tests {
let expected_row_2 = vec![1, 2]; let expected_row_2 = vec![1, 2];
let expected_row_3 = vec![1, 2, 3]; let expected_row_3 = vec![1, 2, 3];
let possible_values_row_1 = possible_values_from_row(&playfield.fields[0], 3); let possible_values_row_1 = possible_values_from_vec(&playfield.fields[0], 3);
let possible_values_row_2 = possible_values_from_row(&playfield.fields[1], 3); let possible_values_row_2 = possible_values_from_vec(&playfield.fields[1], 3);
let possible_values_row_3 = possible_values_from_row(&playfield.fields[2], 3); let possible_values_row_3 = possible_values_from_vec(&playfield.fields[2], 3);
assert_eq!(possible_values_row_1, expected_row_1); assert_eq!(possible_values_row_1, expected_row_1);
assert!(possible_values_row_2 assert!(possible_values_row_2