Impl: get_column for playfield
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user