|  | @@ -1,6 +1,8 @@
 | 
	
		
			
				|  |  |  use serde_derive::{Deserialize, Serialize};
 | 
	
		
			
				|  |  |  use serde_xml_rs::{from_reader, from_str, to_string};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +use clap::Parser;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  use std::fmt;
 | 
	
		
			
				|  |  |  use std::fs::File;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -200,6 +202,74 @@ impl Sudoku {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        let mut g = Group::new();
 | 
	
		
			
				|  |  | +        let mut values: HashSet<u8> = HashSet::new();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let mut group_process = |this: &mut Self, grp: &Group| {
 | 
	
		
			
				|  |  | +            // Collect all the possible values within the group.
 | 
	
		
			
				|  |  | +            values.clear();
 | 
	
		
			
				|  |  | +            for gidx in 0..SIZE {
 | 
	
		
			
				|  |  | +                // println!("possible: {:?}", this.possible[grp.items[gidx as usize] as usize]);
 | 
	
		
			
				|  |  | +                values.extend(&this.possible[grp.items[gidx as usize] as usize]);
 | 
	
		
			
				|  |  | +                // println!("now     : {:?}", this.possible[grp.items[gidx as usize] as usize]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // println!("values {:?}", values);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Now, check for singles.
 | 
	
		
			
				|  |  | +            for v in values.iter() {
 | 
	
		
			
				|  |  | +                let mut count = 0;
 | 
	
		
			
				|  |  | +                let mut pos = 0;
 | 
	
		
			
				|  |  | +                for gidx in 0..SIZE {
 | 
	
		
			
				|  |  | +                    if this.possible[grp.items[gidx as usize] as usize].contains(&v) {
 | 
	
		
			
				|  |  | +                        count += 1;
 | 
	
		
			
				|  |  | +                        pos = grp.items[gidx as usize];
 | 
	
		
			
				|  |  | +                        if count > 1 {
 | 
	
		
			
				|  |  | +                            break;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if count == 1 {
 | 
	
		
			
				|  |  | +                    // don't need this, it was v!
 | 
	
		
			
				|  |  | +                    // let value = this.possible[pos as usize].iter().next().cloned().unwrap();
 | 
	
		
			
				|  |  | +                    println!("Set2 {:?} to {}", xy(pos), v);
 | 
	
		
			
				|  |  | +                    this.set(xy(pos).0, xy(pos).1, *v);
 | 
	
		
			
				|  |  | +                    found_something = true;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Change to 0..SIZE ...  Keep it simple.
 | 
	
		
			
				|  |  | +        for i in 0..SIZE {
 | 
	
		
			
				|  |  | +            g.for_column(i, 1);
 | 
	
		
			
				|  |  | +            group_process(self, &g);
 | 
	
		
			
				|  |  | +            g.for_row(1, i);
 | 
	
		
			
				|  |  | +            group_process(self, &g);
 | 
	
		
			
				|  |  | +            g.for_iter(i);
 | 
	
		
			
				|  |  | +            group_process(self, &g);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /*
 | 
	
		
			
				|  |  | +        for i in 0..MAX_SIZE {
 | 
	
		
			
				|  |  | +            let (x, y) = xy(i);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (x % 3 == 0) && (y % 3 == 0) {
 | 
	
		
			
				|  |  | +                g.for_block(x, y);
 | 
	
		
			
				|  |  | +                group_process(self, &g);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if y == 0 {
 | 
	
		
			
				|  |  | +                g.for_column(x, y);
 | 
	
		
			
				|  |  | +                group_process(self, &g);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if x == 0 {
 | 
	
		
			
				|  |  | +                g.for_row(x, y);
 | 
	
		
			
				|  |  | +                group_process(self, &g);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /*
 | 
	
		
			
				|  |  |              // Code currently isn't working.
 | 
	
		
			
				|  |  |              // It seems to eat items that I want and need.
 | 
	
	
		
			
				|  | @@ -211,6 +281,7 @@ impl Sudoku {
 | 
	
		
			
				|  |  |                  let (x, y) = xy(i);
 | 
	
		
			
				|  |  |                  let mut values: HashSet<u8> = HashSet::new();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  g.for_block(x, y);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  // collect all the possible values within these sets.
 | 
	
	
		
			
				|  | @@ -359,6 +430,12 @@ impl Group {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    fn for_iter(&mut self, i: u8) {
 | 
	
		
			
				|  |  | +        let sb_x = (i % 3) * 3;
 | 
	
		
			
				|  |  | +        let sb_y = (i % 3) * 3;
 | 
	
		
			
				|  |  | +        self.for_block(sb_x, sb_y);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      fn display(&self) {
 | 
	
		
			
				|  |  |          for i in 0..SIZE {
 | 
	
		
			
				|  |  |              let v = self.items[i as usize];
 | 
	
	
		
			
				|  | @@ -368,8 +445,18 @@ impl Group {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Command line arguments - via clap
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#[derive(Parser)]
 | 
	
		
			
				|  |  | +struct Cli {
 | 
	
		
			
				|  |  | +    /// The path to the file to read
 | 
	
		
			
				|  |  | +    filename: std::path::PathBuf,
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  fn main() {
 | 
	
		
			
				|  |  | -    let filename = "../puzzle1";
 | 
	
		
			
				|  |  | +    let args = Cli::parse();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let filename = args.filename; // "../puzzle1";
 | 
	
		
			
				|  |  |      let fh = File::open(filename).unwrap();
 | 
	
		
			
				|  |  |      let puzzle: Ksudoku = from_reader(fh).unwrap();
 | 
	
		
			
				|  |  |      println!("Puzzle: {:?}", puzzle);
 | 
	
	
		
			
				|  | @@ -385,8 +472,10 @@ fn main() {
 | 
	
		
			
				|  |  |          s.display_possible();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  |      s.display();
 | 
	
		
			
				|  |  |      s.display_possible();
 | 
	
		
			
				|  |  | +    */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /*
 | 
	
		
			
				|  |  |      let mut g = Group::new();
 |