Skip to content

Commit

Permalink
naked pair
Browse files Browse the repository at this point in the history
  • Loading branch information
Nervonment committed May 31, 2024
1 parent 8f076b0 commit f5d9e3b
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/bin/example/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ use sudoku::{
puzzle::SudokuPuzzle,
techniques::{
hidden_pair_blk, hidden_pair_col, hidden_pair_row, hidden_single_blk,
hidden_single_col, hidden_single_row, naked_single,
hidden_single_col, hidden_single_row, naked_pair_blk, naked_pair_col, naked_pair_row,
naked_single,
},
},
ui::{draw_grid, draw_numbers},
Expand Down Expand Up @@ -39,12 +40,18 @@ fn main() -> io::Result<()> {
let res_hidden_pair_row = hidden_pair_row(&puzzle);
let res_hidden_pair_col = hidden_pair_col(&puzzle);
let res_hidden_pair_blk = hidden_pair_blk(&puzzle);
let res_naked_pair_row = naked_pair_row(&puzzle);
let res_naked_pair_col = naked_pair_col(&puzzle);
let res_naked_pair_blk = naked_pair_blk(&puzzle);
println!("hidden single in row: {:?}", res_hidden_single_row);
println!("hidden single in col: {:?}", res_hidden_single_col);
println!("hidden single in blk: {:?}", res_hidden_single_blk);
println!("naked single: {:?}", res_naked_single);
println!("hidden pair in row: {:?}", res_hidden_pair_row);
println!("hidden pair in col: {:?}", res_hidden_pair_col);
println!("hidden pair in blk: {:?}", res_hidden_pair_blk);
println!("naked pair in row: {:?}", res_naked_pair_row);
println!("naked pair in col: {:?}", res_naked_pair_col);
println!("naked pair in blk: {:?}", res_naked_pair_blk);
Ok(())
}
53 changes: 53 additions & 0 deletions src/neo/techniques.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,56 @@ pub fn hidden_pair_blk(
block_idx_2_coord,
)
}

fn naked_pair<T, F>(
puzzle: &T,
coord_transform: F,
) -> Option<((usize, usize), (usize, usize), i8, i8)>
where
T: Grid + TrackingCandidates,
F: Fn(usize, usize) -> (usize, usize),
{
for i in 0..9 {
let js: Vec<usize> = (0..9)
.filter(|j| {
let (r, c) = coord_transform(i, *j);
puzzle.is_grid_empty(r, c) && puzzle.candidate_cnt_for_grid(r, c) == 2
})
.collect();
for i1 in 0..js.len() {
for i2 in 0..i1 {
let j1 = js[i1];
let j2 = js[i2];
let (r1, c1) = coord_transform(i, j1);
let (r2, c2) = coord_transform(i, j2);
if (1..=9).all(|num| {
puzzle.is_candidate_of(r1, c1, num) == puzzle.is_candidate_of(r2, c2, num)
}) {
let mut num_iter = (1..=9).filter(|num| puzzle.is_candidate_of(r1, c1, *num));
let num1 = num_iter.next().unwrap();
let num2 = num_iter.next().unwrap();
return Some(((r1, c1), (r2, c2), num1, num2));
}
}
}
}
None
}

pub fn naked_pair_row(
puzzle: &(impl Grid + TrackingCandidates),
) -> Option<((usize, usize), (usize, usize), i8, i8)> {
naked_pair(puzzle, |r, c| (r, c))
}

pub fn naked_pair_col(
puzzle: &(impl Grid + TrackingCandidates),
) -> Option<((usize, usize), (usize, usize), i8, i8)> {
naked_pair(puzzle, |c, r| (r, c))
}

pub fn naked_pair_blk(
puzzle: &(impl Grid + TrackingCandidates),
) -> Option<((usize, usize), (usize, usize), i8, i8)> {
naked_pair(puzzle, block_idx_2_coord)
}

0 comments on commit f5d9e3b

Please sign in to comment.