11//! A sudoku solver.
2+ //!
3+ //! Uses `Arc<usize>` for being closer to real versions.
24// SPDX-License-Identifier: MPL-2.0
35
4- use std:: fmt;
5-
66use pubgrub:: {
77 resolve, DefaultStringReporter , OfflineDependencyProvider , PubGrubError , Range , Reporter ,
88 SelectedDependencies ,
99} ;
10+ use std:: fmt;
11+ use std:: sync:: Arc ;
1012use version_ranges:: Ranges ;
1113
1214use criterion:: * ;
1315
1416/// The size of a box in the board.
15- const BOARD_BASE : u8 = 3 ;
17+ const BOARD_BASE : usize = 3 ;
1618/// The size of the board.
17- const BOARD_SIZE : u8 = BOARD_BASE * BOARD_BASE ;
19+ const BOARD_SIZE : usize = BOARD_BASE * BOARD_BASE ;
1820
19- type DP = OfflineDependencyProvider < SudokuPackage , Range < u8 > > ;
21+ type DP = OfflineDependencyProvider < SudokuPackage , Range < Arc < usize > > > ;
2022
2123#[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
2224enum SudokuPackage {
2325 /// Add all known fields.
2426 Root ,
2527 /// Version is the value of the cell.
26- Cell { row : u8 , col : u8 } ,
28+ Cell { row : usize , col : usize } ,
2729}
2830
2931impl fmt:: Display for SudokuPackage {
@@ -37,7 +39,7 @@ impl fmt::Display for SudokuPackage {
3739 }
3840}
3941
40- fn from_board ( b : & str ) -> Vec < ( SudokuPackage , Range < u8 > ) > {
42+ fn from_board ( b : & str ) -> Vec < ( SudokuPackage , Range < Arc < usize > > ) > {
4143 let mut out = vec ! [ ] ;
4244 for ( row, line) in b
4345 . trim ( )
@@ -57,7 +59,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
5759 row : ( row + 1 ) . try_into ( ) . unwrap ( ) ,
5860 col : ( col + 1 ) . try_into ( ) . unwrap ( ) ,
5961 } ,
60- Range :: singleton ( val as u8 ) ,
62+ Range :: singleton ( val as usize ) ,
6163 ) ) ;
6264 }
6365 }
@@ -67,7 +69,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
6769
6870/// Encode all the exclusions from assigning a cell to a value
6971fn encode_constraints (
70- dependency_provider : & mut OfflineDependencyProvider < SudokuPackage , Ranges < u8 > > ,
72+ dependency_provider : & mut OfflineDependencyProvider < SudokuPackage , Ranges < Arc < usize > > > ,
7173) {
7274 for row in 1 ..=BOARD_SIZE {
7375 for col in 1 ..=BOARD_SIZE {
@@ -80,7 +82,7 @@ fn encode_constraints(
8082 }
8183 deps. push ( (
8284 SudokuPackage :: Cell { row : row_, col } ,
83- Range :: singleton ( val) . complement ( ) ,
85+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
8486 ) )
8587 }
8688 // A number may only occur once in a col
@@ -90,7 +92,7 @@ fn encode_constraints(
9092 }
9193 deps. push ( (
9294 SudokuPackage :: Cell { row, col : col_ } ,
93- Range :: singleton ( val) . complement ( ) ,
95+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
9496 ) )
9597 }
9698 // A number may only occur once in a box
@@ -106,7 +108,7 @@ fn encode_constraints(
106108 row : row_,
107109 col : col_,
108110 } ,
109- Range :: singleton ( val) . complement ( ) ,
111+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
110112 ) )
111113 }
112114 }
@@ -117,11 +119,11 @@ fn encode_constraints(
117119 }
118120}
119121
120- fn solve ( board : Vec < ( SudokuPackage , Ranges < u8 > ) > ) -> SelectedDependencies < DP > {
122+ fn solve ( board : Vec < ( SudokuPackage , Ranges < Arc < usize > > ) > ) -> SelectedDependencies < DP > {
121123 let mut dependency_provider = DP :: new ( ) ;
122124 encode_constraints ( & mut dependency_provider) ;
123- dependency_provider. add_dependencies ( SudokuPackage :: Root , 1 , board) ;
124- match resolve ( & dependency_provider, SudokuPackage :: Root , 1 ) {
125+ dependency_provider. add_dependencies ( SudokuPackage :: Root , Arc :: new ( 1usize ) , board) ;
126+ match resolve ( & dependency_provider, SudokuPackage :: Root , Arc :: new ( 1usize ) ) {
125127 Ok ( sol) => sol,
126128 Err ( PubGrubError :: NoSolution ( mut derivation_tree) ) => {
127129 derivation_tree. collapse_no_versions ( ) ;
0 commit comments