1
1
//! A sudoku solver.
2
+ //!
3
+ //! Uses `Arc<usize>` for being closer to real versions.
2
4
// SPDX-License-Identifier: MPL-2.0
3
5
4
- use std:: fmt;
5
-
6
6
use pubgrub:: {
7
7
resolve, DefaultStringReporter , OfflineDependencyProvider , PubGrubError , Range , Reporter ,
8
8
SelectedDependencies ,
9
9
} ;
10
+ use std:: fmt;
11
+ use std:: sync:: Arc ;
10
12
use version_ranges:: Ranges ;
11
13
12
14
use criterion:: * ;
13
15
14
16
/// The size of a box in the board.
15
- const BOARD_BASE : u8 = 3 ;
17
+ const BOARD_BASE : usize = 3 ;
16
18
/// The size of the board.
17
- const BOARD_SIZE : u8 = BOARD_BASE * BOARD_BASE ;
19
+ const BOARD_SIZE : usize = BOARD_BASE * BOARD_BASE ;
18
20
19
- type DP = OfflineDependencyProvider < SudokuPackage , Range < u8 > > ;
21
+ type DP = OfflineDependencyProvider < SudokuPackage , Range < Arc < usize > > > ;
20
22
21
23
#[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
22
24
enum SudokuPackage {
23
25
/// Add all known fields.
24
26
Root ,
25
27
/// Version is the value of the cell.
26
- Cell { row : u8 , col : u8 } ,
28
+ Cell { row : usize , col : usize } ,
27
29
}
28
30
29
31
impl fmt:: Display for SudokuPackage {
@@ -37,7 +39,7 @@ impl fmt::Display for SudokuPackage {
37
39
}
38
40
}
39
41
40
- fn from_board ( b : & str ) -> Vec < ( SudokuPackage , Range < u8 > ) > {
42
+ fn from_board ( b : & str ) -> Vec < ( SudokuPackage , Range < Arc < usize > > ) > {
41
43
let mut out = vec ! [ ] ;
42
44
for ( row, line) in b
43
45
. trim ( )
@@ -57,7 +59,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
57
59
row : ( row + 1 ) . try_into ( ) . unwrap ( ) ,
58
60
col : ( col + 1 ) . try_into ( ) . unwrap ( ) ,
59
61
} ,
60
- Range :: singleton ( val as u8 ) ,
62
+ Range :: singleton ( val as usize ) ,
61
63
) ) ;
62
64
}
63
65
}
@@ -67,7 +69,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
67
69
68
70
/// Encode all the exclusions from assigning a cell to a value
69
71
fn encode_constraints (
70
- dependency_provider : & mut OfflineDependencyProvider < SudokuPackage , Ranges < u8 > > ,
72
+ dependency_provider : & mut OfflineDependencyProvider < SudokuPackage , Ranges < Arc < usize > > > ,
71
73
) {
72
74
for row in 1 ..=BOARD_SIZE {
73
75
for col in 1 ..=BOARD_SIZE {
@@ -80,7 +82,7 @@ fn encode_constraints(
80
82
}
81
83
deps. push ( (
82
84
SudokuPackage :: Cell { row : row_, col } ,
83
- Range :: singleton ( val) . complement ( ) ,
85
+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
84
86
) )
85
87
}
86
88
// A number may only occur once in a col
@@ -90,7 +92,7 @@ fn encode_constraints(
90
92
}
91
93
deps. push ( (
92
94
SudokuPackage :: Cell { row, col : col_ } ,
93
- Range :: singleton ( val) . complement ( ) ,
95
+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
94
96
) )
95
97
}
96
98
// A number may only occur once in a box
@@ -106,7 +108,7 @@ fn encode_constraints(
106
108
row : row_,
107
109
col : col_,
108
110
} ,
109
- Range :: singleton ( val) . complement ( ) ,
111
+ Range :: singleton ( Arc :: new ( val) ) . complement ( ) ,
110
112
) )
111
113
}
112
114
}
@@ -117,11 +119,11 @@ fn encode_constraints(
117
119
}
118
120
}
119
121
120
- fn solve ( board : Vec < ( SudokuPackage , Ranges < u8 > ) > ) -> SelectedDependencies < DP > {
122
+ fn solve ( board : Vec < ( SudokuPackage , Ranges < Arc < usize > > ) > ) -> SelectedDependencies < DP > {
121
123
let mut dependency_provider = DP :: new ( ) ;
122
124
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 ) ) {
125
127
Ok ( sol) => sol,
126
128
Err ( PubGrubError :: NoSolution ( mut derivation_tree) ) => {
127
129
derivation_tree. collapse_no_versions ( ) ;
0 commit comments