Impl: Calculate Box Size

This commit is contained in:
Jonas Zeunert
2024-02-20 13:48:10 +01:00
parent c189d4ac3b
commit 7118165568
2 changed files with 47 additions and 21 deletions

View File

@@ -28,11 +28,13 @@ impl SudokuSolver {
let (row_idx, col_idx) = self.playfield.convert_index(*open_field);
let row = &self.playfield.fields[row_idx];
let possible_values_row = possible_values_from_vec(row, self.playfield.size as u32);
let possible_values_row =
SudokuSolver::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_idx);
let possible_values_col = possible_values_from_vec(&col, self.playfield.size as u32);
let possible_values_col =
SudokuSolver::possible_values_from_vec(&col, self.playfield.size as u32);
let possible_values = possible_values_row
.intersection(&possible_values_col)
@@ -44,21 +46,20 @@ impl SudokuSolver {
field.possible_values = possible_values;
}
}
}
fn possible_values_from_vec(row: &Vec<Field>, max_value: u32) -> HashSet<u32> {
let possible_values: HashSet<u32> = (1..max_value + 1).collect();
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
.iter()
.filter(|field| field.value.is_some())
.map(|v| v.value.unwrap())
.collect();
let populated_values: HashSet<u32> = row
.iter()
.filter(|field| field.value.is_some())
.map(|v| v.value.unwrap())
.collect();
possible_values
.difference(&populated_values)
.map(|v| *v)
.collect()
possible_values
.difference(&populated_values)
.map(|v| *v)
.collect()
}
}
#[cfg(test)]
@@ -113,6 +114,10 @@ mod tests {
assert!(field_3_values.iter().all(|i| expected_3.contains(i)));
assert!(field_4_values.iter().all(|i| expected_4.contains(i)));
}
#[test]
fn populate_from_box() {
let solver = &mut setup_solver("1 2 0 0 3 0 0 0 0 0 0 0 0 0 0 0", 4);
}
}
mod possible_values_from_vec {
use super::super::*;
@@ -125,9 +130,12 @@ 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_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);
let possible_values_row_1 =
SudokuSolver::possible_values_from_vec(&playfield.fields[0], 3);
let possible_values_row_2 =
SudokuSolver::possible_values_from_vec(&playfield.fields[1], 3);
let possible_values_row_3 =
SudokuSolver::possible_values_from_vec(&playfield.fields[2], 3);
assert_eq!(possible_values_row_1, expected_row_1);
assert!(possible_values_row_2