Impl: Calculate Box Size
This commit is contained in:
@@ -3,6 +3,7 @@ use std::fmt;
|
|||||||
#[derive(PartialEq, Debug, Clone)]
|
#[derive(PartialEq, Debug, Clone)]
|
||||||
pub struct Playfield {
|
pub struct Playfield {
|
||||||
pub size: usize,
|
pub size: usize,
|
||||||
|
pub box_size: usize,
|
||||||
pub fields: Vec<Vec<Field>>,
|
pub fields: Vec<Vec<Field>>,
|
||||||
pub open_fields: Vec<usize>,
|
pub open_fields: Vec<usize>,
|
||||||
}
|
}
|
||||||
@@ -11,6 +12,7 @@ impl Playfield {
|
|||||||
pub fn default(size: usize) -> Playfield {
|
pub fn default(size: usize) -> Playfield {
|
||||||
Self {
|
Self {
|
||||||
size,
|
size,
|
||||||
|
box_size: Playfield::calculate_box_size(size),
|
||||||
fields: vec![vec![Field::default(); size]; size],
|
fields: vec![vec![Field::default(); size]; size],
|
||||||
open_fields: Vec::new(),
|
open_fields: Vec::new(),
|
||||||
}
|
}
|
||||||
@@ -55,14 +57,14 @@ impl Playfield {
|
|||||||
pub fn get_column(&self, index: usize) -> Vec<Field> {
|
pub fn get_column(&self, index: usize) -> Vec<Field> {
|
||||||
self.fields.iter().map(|row| row[index].clone()).collect()
|
self.fields.iter().map(|row| row[index].clone()).collect()
|
||||||
}
|
}
|
||||||
pub fn get_field(&self, row: usize, col: usize) -> &Field {
|
|
||||||
&self.fields[row][col]
|
|
||||||
}
|
|
||||||
pub fn convert_index(&self, index: usize) -> (usize, usize) {
|
pub fn convert_index(&self, index: usize) -> (usize, usize) {
|
||||||
let row = index / self.size;
|
let row = index / self.size;
|
||||||
let col = index % self.size;
|
let col = index % self.size;
|
||||||
(row, col)
|
(row, col)
|
||||||
}
|
}
|
||||||
|
fn calculate_box_size(size: usize) -> usize {
|
||||||
|
f64::sqrt(size as f64) as usize
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Playfield {
|
impl fmt::Display for Playfield {
|
||||||
@@ -125,7 +127,21 @@ mod tests {
|
|||||||
assert_eq!(column_3, expected_3);
|
assert_eq!(column_3, expected_3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mod calculate_box_size {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn simple() {
|
||||||
|
let size_1 = Playfield::calculate_box_size(1);
|
||||||
|
let size_2 = Playfield::calculate_box_size(3);
|
||||||
|
let size_3 = Playfield::calculate_box_size(4);
|
||||||
|
let size_4 = Playfield::calculate_box_size(9);
|
||||||
|
|
||||||
|
assert_eq!(size_1, 1);
|
||||||
|
assert_eq!(size_2, 1);
|
||||||
|
assert_eq!(size_3, 2);
|
||||||
|
assert_eq!(size_4, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
mod convert_index {
|
mod convert_index {
|
||||||
use super::*;
|
use super::*;
|
||||||
#[test]
|
#[test]
|
||||||
@@ -162,6 +178,7 @@ mod tests {
|
|||||||
playfield,
|
playfield,
|
||||||
Playfield {
|
Playfield {
|
||||||
size: 3,
|
size: 3,
|
||||||
|
box_size: 1,
|
||||||
fields: vec![
|
fields: vec![
|
||||||
vec![Field::new(1), Field::new(2), Field::new(3)],
|
vec![Field::new(1), Field::new(2), Field::new(3)],
|
||||||
vec![Field::default(), Field::default(), Field::default()],
|
vec![Field::default(), Field::default(), Field::default()],
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ 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_idx, col_idx) = self.playfield.convert_index(*open_field);
|
||||||
let row = &self.playfield.fields[row_index];
|
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 = 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 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 = possible_values_from_vec(&col, self.playfield.size as u32);
|
||||||
|
|
||||||
let possible_values = possible_values_row
|
let possible_values = possible_values_row
|
||||||
@@ -39,7 +39,7 @@ impl SudokuSolver {
|
|||||||
.map(|v| *v)
|
.map(|v| *v)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let row = &mut self.playfield.fields[row_index];
|
let row = &mut self.playfield.fields[row_idx];
|
||||||
let field = &mut row[col_index];
|
let field = &mut row[col_index];
|
||||||
field.possible_values = possible_values;
|
field.possible_values = possible_values;
|
||||||
}
|
}
|
||||||
@@ -86,6 +86,11 @@ mod tests {
|
|||||||
assert_eq!(solved, expected);
|
assert_eq!(solved, expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mod solve_fields {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn simple() {}
|
||||||
|
}
|
||||||
mod possible_values {
|
mod possible_values {
|
||||||
use super::*;
|
use super::*;
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user