Impl: get_column for playfield
This commit is contained in:
@@ -20,18 +20,27 @@ impl SudokuSolver {
|
||||
fn populate_possible_values(&mut self) {
|
||||
for open_field in &self.playfield.open_fields {
|
||||
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 = 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];
|
||||
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 populated_values: HashSet<u32> = row
|
||||
@@ -94,7 +103,7 @@ mod tests {
|
||||
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::*;
|
||||
|
||||
@@ -105,9 +114,9 @@ mod tests {
|
||||
let expected_row_2 = vec![1, 2];
|
||||
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_2 = possible_values_from_row(&playfield.fields[1], 3);
|
||||
let possible_values_row_3 = possible_values_from_row(&playfield.fields[2], 3);
|
||||
let possible_values_row_1 = possible_values_from_vec(&playfield.fields[0], 3);
|
||||
let possible_values_row_2 = possible_values_from_vec(&playfield.fields[1], 3);
|
||||
let possible_values_row_3 = possible_values_from_vec(&playfield.fields[2], 3);
|
||||
|
||||
assert_eq!(possible_values_row_1, expected_row_1);
|
||||
assert!(possible_values_row_2
|
||||
|
||||
Reference in New Issue
Block a user