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

@@ -60,8 +60,20 @@ impl Playfield {
.map(|row| row[col_index].clone())
.collect()
}
pub fn get_box(&self, row: usize, col: usize) -> Vec<&Field> {
let result: Vec<&Field> = Vec::new();
pub fn get_box(&self, row: usize, col: usize) -> Vec<Field> {
let mut result: Vec<Field> = Vec::new();
let row_boundary_l = col - col % self.box_size;
let row_boundary_r = row_boundary_l + self.box_size;
let col_boundary_l = col - col % self.box_size;
let col_boundary_r = col_boundary_l + self.box_size;
for i in row_boundary_l..row_boundary_r {
for j in col_boundary_l..col_boundary_r {
let field = self.fields[i][j].clone();
result.push(field);
}
}
result
}
@@ -140,7 +152,13 @@ mod tests {
#[test]
fn simple() {
let playfield = Playfield::new(&"1 2 3 4 4 3 2 1 3 2 1 4 2 1 4 3".to_string(), 4);
let expected = vec![Field::new(1), Field::new(2), Field::new(4), Field::new(5)];
let expected_1 = vec![Field::new(1), Field::new(2), Field::new(4), Field::new(3)];
let result_1 = playfield.get_box(0, 0);
assert_eq!(result_1, expected_1);
let expected_2 = vec![Field::new(2), Field::new(1), Field::new(4), Field::new(3)];
let result_2 = playfield.get_box(3, 1);
assert_eq!(result_2, expected_2);
}
}
mod calculate_box_size {

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,9 +46,7 @@ impl SudokuSolver {
field.possible_values = possible_values;
}
}
}
fn possible_values_from_vec(row: &Vec<Field>, max_value: u32) -> HashSet<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
@@ -59,6 +59,7 @@ fn possible_values_from_vec(row: &Vec<Field>, max_value: u32) -> HashSet<u32> {
.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