|
@@ -0,0 +1,180 @@
|
|
|
+use serde_derive::{Deserialize, Serialize};
|
|
|
+use serde_xml_rs::{from_reader, from_str, to_string};
|
|
|
+
|
|
|
+use std::fs::File;
|
|
|
+
|
|
|
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
|
|
|
+struct Graph {
|
|
|
+ order: i32,
|
|
|
+ #[serde(rename = "type")]
|
|
|
+ game_type: String,
|
|
|
+ #[serde(rename = "specific-type")]
|
|
|
+ specific_type: String,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
|
|
|
+struct Puzzle {
|
|
|
+ graph: Graph,
|
|
|
+ values: String,
|
|
|
+ solution: String,
|
|
|
+}
|
|
|
+
|
|
|
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
|
|
|
+struct Game {
|
|
|
+ #[serde(rename = "had-help")]
|
|
|
+ help: i16,
|
|
|
+ #[serde(rename = "msecs-elapsed")]
|
|
|
+ elapsed: u32,
|
|
|
+ puzzle: Puzzle,
|
|
|
+}
|
|
|
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
|
|
|
+struct Ksudoku {
|
|
|
+ game: Game,
|
|
|
+}
|
|
|
+
|
|
|
+const SIZE: u8 = 9;
|
|
|
+const MAX_SIZE: u8 = 81;
|
|
|
+
|
|
|
+#[derive(Debug)]
|
|
|
+struct Sudoku {
|
|
|
+ board: [u8; MAX_SIZE as usize],
|
|
|
+}
|
|
|
+
|
|
|
+impl Sudoku {
|
|
|
+ fn new() -> Self {
|
|
|
+ let s = Sudoku {
|
|
|
+ board: [0; MAX_SIZE as usize],
|
|
|
+ };
|
|
|
+
|
|
|
+ s
|
|
|
+ }
|
|
|
+ fn clear(&mut self) {
|
|
|
+ for x in 0..MAX_SIZE {
|
|
|
+ self.board[x as usize] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn load_xsudoku(&mut self, s: &str) {
|
|
|
+ self.clear();
|
|
|
+ let mut x :u8= 0;
|
|
|
+ let mut y :u8= 0;
|
|
|
+ for ch in s.chars() {
|
|
|
+ if ch >= 'b' {
|
|
|
+ self.board[pos(x,y) as usize] = ch as u8 - 'a' as u8;
|
|
|
+ };
|
|
|
+ y += 1;
|
|
|
+ if y >= SIZE {
|
|
|
+ y = 0;
|
|
|
+ x += 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn display(&self) {
|
|
|
+ println!("╔═══╦═══╦═══╗");
|
|
|
+ for y in 0..SIZE {
|
|
|
+ print!("║");
|
|
|
+ for x in 0..SIZE {
|
|
|
+ let item = self.board[pos(x as u8, y as u8) as usize];
|
|
|
+ if item == 0 {
|
|
|
+ print!(" ");
|
|
|
+ } else if (item >= 1) && (item <= 9) {
|
|
|
+ print!("{}", item);
|
|
|
+ }
|
|
|
+ if x % 3 == 2 {
|
|
|
+ print!("║");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ println!("");
|
|
|
+ if y % 3 == 2 {
|
|
|
+ if (y+1 == SIZE) {
|
|
|
+ println!("╚═══╩═══╩═══╝");
|
|
|
+ } else {
|
|
|
+ println!("╠═══╬═══╬═══╣");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+/*
|
|
|
+const InRow: [u8; 81] = [1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
|
+];
|
|
|
+ */
|
|
|
+
|
|
|
+// rows, columns, and cells ? (maybe?)
|
|
|
+// With the ability to know what RCC each item belongs?
|
|
|
+
|
|
|
+#[derive(Debug)]
|
|
|
+struct OnlyOne {
|
|
|
+ positions: [u8; SIZE as usize],
|
|
|
+}
|
|
|
+
|
|
|
+const CELLS: [OnlyOne; 3] = [
|
|
|
+ OnlyOne {
|
|
|
+ positions: [
|
|
|
+ pos(1, 1),
|
|
|
+ pos(1, 2),
|
|
|
+ pos(1, 3),
|
|
|
+ pos(1, 4),
|
|
|
+ pos(1, 5),
|
|
|
+ pos(1, 6),
|
|
|
+ pos(1, 7),
|
|
|
+ pos(1, 8),
|
|
|
+ pos(1, 9),
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ OnlyOne {
|
|
|
+ positions: [
|
|
|
+ pos(2, 1),
|
|
|
+ pos(2, 2),
|
|
|
+ pos(2, 3),
|
|
|
+ pos(2, 4),
|
|
|
+ pos(2, 5),
|
|
|
+ pos(2, 6),
|
|
|
+ pos(2, 7),
|
|
|
+ pos(2, 8),
|
|
|
+ pos(2, 9),
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ OnlyOne {
|
|
|
+ positions: [
|
|
|
+ pos(3, 1),
|
|
|
+ pos(3, 2),
|
|
|
+ pos(3, 3),
|
|
|
+ pos(3, 4),
|
|
|
+ pos(3, 5),
|
|
|
+ pos(3, 6),
|
|
|
+ pos(3, 7),
|
|
|
+ pos(3, 8),
|
|
|
+ pos(3, 9),
|
|
|
+ ],
|
|
|
+ },
|
|
|
+];
|
|
|
+
|
|
|
+const fn pos(x: u8, y: u8) -> u8 {
|
|
|
+ x + (y * SIZE as u8)
|
|
|
+}
|
|
|
+
|
|
|
+const POS1: OnlyOne = OnlyOne {
|
|
|
+ positions: [0, 1, 2, 3, 4, 5, 6, 7, 8],
|
|
|
+};
|
|
|
+
|
|
|
+fn main() {
|
|
|
+ let filename = "../puzzle1";
|
|
|
+ let fh = File::open(filename).unwrap();
|
|
|
+
|
|
|
+ let puzzle: Ksudoku = from_reader(fh).unwrap();
|
|
|
+
|
|
|
+ println!("Puzzle: {:?}", puzzle);
|
|
|
+ println!("CELLS: {:?}", CELLS);
|
|
|
+ let mut s = Sudoku::new();
|
|
|
+ s.load_xsudoku(&puzzle.game.puzzle.values);
|
|
|
+ s.display();
|
|
|
+}
|