Initial sudoku solver with parser and formatter.
This commit is contained in:
commit
338309fde6
|
@ -0,0 +1 @@
|
||||||
|
/target
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sudoku-solver"
|
||||||
|
version = "0.1.0"
|
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "sudoku-solver"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
|
@ -0,0 +1,68 @@
|
||||||
|
use std::fmt::{self, Write};
|
||||||
|
|
||||||
|
pub enum Square {
|
||||||
|
Value(u8),
|
||||||
|
Options(Vec<u8>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Square {
|
||||||
|
pub fn from_char(c: char) -> Square {
|
||||||
|
match c {
|
||||||
|
'1' => Square::Value(1),
|
||||||
|
'2' => Square::Value(2),
|
||||||
|
'3' => Square::Value(3),
|
||||||
|
'4' => Square::Value(4),
|
||||||
|
'5' => Square::Value(5),
|
||||||
|
'6' => Square::Value(6),
|
||||||
|
'7' => Square::Value(7),
|
||||||
|
'8' => Square::Value(8),
|
||||||
|
'9' => Square::Value(9),
|
||||||
|
'.' => Square::Options(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]),
|
||||||
|
_ => panic!("Unexpected character in input: {}", c),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_str(&self) -> String {
|
||||||
|
match self {
|
||||||
|
Square::Options(_) => " ".to_string(),
|
||||||
|
Square::Value(v) => v.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Board {
|
||||||
|
squares: Vec<Square>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Board {
|
||||||
|
pub fn from_string(str: &str) -> Board {
|
||||||
|
if str.len() != 81 {
|
||||||
|
panic!("Input string not length 81: got {}", str.len())
|
||||||
|
}
|
||||||
|
let mut squares = Vec::new();
|
||||||
|
for c in str.chars() {
|
||||||
|
squares.push(Square::from_char(c))
|
||||||
|
}
|
||||||
|
Board { squares }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for Board {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.write_str("-------------\n")?;
|
||||||
|
for r in 0..9 {
|
||||||
|
f.write_char('|')?;
|
||||||
|
for c in 0..9 {
|
||||||
|
f.write_str(&self.squares[r * 9 + c].to_str())?;
|
||||||
|
if c == 2 || c == 5 || c == 8 {
|
||||||
|
f.write_char('|')?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.write_char('\n')?;
|
||||||
|
if r == 2 || r == 5 || r == 8 {
|
||||||
|
f.write_str("-------------\n")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
mod board;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let nyt_hard = "3...184.9\
|
||||||
|
8.47.....\
|
||||||
|
.....61..\
|
||||||
|
4....25.8\
|
||||||
|
..3.....4\
|
||||||
|
....4..2.\
|
||||||
|
...6.1...\
|
||||||
|
17.2.....\
|
||||||
|
5........";
|
||||||
|
let sudoku_board = board::Board::from_string(nyt_hard);
|
||||||
|
println!("{:#?}", sudoku_board);
|
||||||
|
}
|
Loading…
Reference in New Issue