sudoku - sudoku_test.go
1 package sudoku
2
3 import "testing"
4
5 /*func TestMakeBox(t *testing.T) {
6 ts9 := make([]Constraint, 0, 27)
7 ts9 = append(ts9, MakeBox(9, 9, 9, 1)...)
8 ts9 = append(ts9, MakeBox(9, 9, 1, 9)...)
9 ts9 = append(ts9, MakeBox(9, 9, 3, 3)...)
10 if len(ts9) != 27 {
11 t.Errorf("expecing length of 27, got %d", len(ts9))
12 } else {
13 for i, s := range ts9 {
14 if len(s) != 9 {
15 t.Errorf("section %d, expecing length of 9, got %d", i, len(s))
16 continue
17 }
18 for j, u := range s {
19 if u != s9[i][j] {
20 t.Errorf("section %d, entry %d, expecing %d, got %d", i, j, s9[i][j], u)
21 }
22 }
23 }
24 }
25 ts4 := make([]Constraint, 0, 12)
26 ts4 = append(ts4, MakeBox(4, 4, 4, 1)...)
27 ts4 = append(ts4, MakeBox(4, 4, 1, 4)...)
28 ts4 = append(ts4, MakeBox(4, 4, 2, 2)...)
29 if len(ts4) != 12 {
30 t.Errorf("expecing length of 16, got %d", len(ts4))
31 } else {
32 for i, s := range ts4 {
33 if len(s) != 4 {
34 t.Errorf("section %d, expecing length of 4, got %d", i, len(s))
35 continue
36 }
37 for j, u := range s {
38 if u != s4[i][j] {
39 t.Errorf("section %d, entry %d, expecing %d, got %d", i, j, s4[i][j], u)
40 }
41 }
42 }
43 }
44 }*/
45
46 func Test4(t *testing.T) {
47 t.Parallel()
48 tests := []struct {
49 start, solution []int
50 solveable bool
51 }{
52 {
53 []int{
54 2, 0, 0, 1,
55 0, 4, 3, 0,
56 0, 2, 1, 0,
57 3, 0, 0, 4,
58 },
59 []int{
60 2, 3, 4, 1,
61 1, 4, 3, 2,
62 4, 2, 1, 3,
63 3, 1, 2, 4,
64 },
65 true,
66 },
67 {
68 []int{
69 4, 0, 1, 0,
70 1, 0, 2, 0,
71 0, 4, 0, 1,
72 0, 1, 0, 2,
73 },
74 []int{
75 4, 2, 1, 3,
76 1, 3, 2, 4,
77 2, 4, 3, 1,
78 3, 1, 4, 2,
79 },
80 true,
81 },
82 }
83 for i, test := range tests {
84 solved := Solve4(test.start)
85 if test.solveable {
86 if solved {
87 for j, num := range test.start {
88 if num != test.solution[j] {
89 t.Errorf("solution found does not match solution given for test %d", i)
90 break
91 }
92 }
93 } else {
94 t.Errorf("didn't find solution in puzzle %d when solution expected", i+1)
95 }
96 } else {
97 if solved {
98 t.Errorf("found solution in puzzle %d when no solution expected", i+1)
99 }
100 }
101 }
102 }
103
104 func Test9(t *testing.T) {
105 t.Parallel()
106 tests := []struct {
107 start, solution []int
108 solveable bool
109 }{
110 {
111 []int{
112 0, 0, 0, 0, 9, 5, 0, 0, 6,
113 0, 0, 0, 0, 0, 0, 4, 5, 0,
114 0, 8, 0, 0, 6, 3, 0, 9, 0,
115 0, 3, 0, 0, 0, 0, 0, 0, 2,
116 0, 0, 7, 0, 2, 0, 6, 0, 0,
117 5, 0, 0, 0, 0, 0, 0, 8, 0,
118 0, 9, 0, 2, 7, 0, 0, 6, 0,
119 0, 1, 4, 0, 0, 0, 0, 0, 0,
120 6, 0, 0, 1, 8, 0, 0, 0, 0,
121 },
122 []int{
123 4, 7, 1, 8, 9, 5, 2, 3, 6,
124 3, 6, 9, 7, 1, 2, 4, 5, 8,
125 2, 8, 5, 4, 6, 3, 1, 9, 7,
126 1, 3, 8, 6, 5, 7, 9, 4, 2,
127 9, 4, 7, 3, 2, 8, 6, 1, 5,
128 5, 2, 6, 9, 4, 1, 7, 8, 3,
129 8, 9, 3, 2, 7, 4, 5, 6, 1,
130 7, 1, 4, 5, 3, 6, 8, 2, 9,
131 6, 5, 2, 1, 8, 9, 3, 7, 4,
132 },
133 true,
134 },
135 {
136 []int{
137 9, 5, 0, 0, 7, 2, 0, 0, 0,
138 0, 1, 0, 0, 0, 8, 0, 0, 0,
139 7, 0, 8, 0, 0, 0, 5, 0, 1,
140 2, 0, 6, 9, 0, 0, 0, 0, 0,
141 0, 0, 0, 0, 0, 0, 0, 0, 0,
142 0, 0, 0, 0, 0, 6, 4, 0, 7,
143 8, 0, 1, 0, 0, 0, 7, 0, 4,
144 0, 0, 0, 7, 0, 0, 0, 6, 0,
145 0, 0, 0, 2, 1, 0, 0, 5, 3,
146 },
147 []int{
148 9, 5, 4, 1, 7, 2, 6, 3, 8,
149 6, 1, 3, 4, 5, 8, 9, 7, 2,
150 7, 2, 8, 6, 9, 3, 5, 4, 1,
151 2, 7, 6, 9, 4, 1, 3, 8, 5,
152 1, 4, 5, 8, 3, 7, 2, 9, 6,
153 3, 8, 9, 5, 2, 6, 4, 1, 7,
154 8, 9, 1, 3, 6, 5, 7, 2, 4,
155 5, 3, 2, 7, 8, 4, 1, 6, 9,
156 4, 6, 7, 2, 1, 9, 8, 5, 3,
157 },
158 true,
159 },
160 {
161 []int{
162 0, 0, 0, 7, 0, 9, 0, 6, 0,
163 2, 0, 3, 0, 0, 0, 5, 0, 0,
164 0, 0, 0, 8, 0, 0, 0, 2, 0,
165 0, 0, 7, 0, 4, 0, 0, 0, 3,
166 0, 5, 0, 3, 0, 8, 0, 4, 0,
167 3, 0, 0, 0, 7, 0, 9, 0, 0,
168 0, 1, 0, 0, 0, 2, 0, 0, 0,
169 0, 0, 2, 0, 0, 0, 6, 0, 8,
170 0, 3, 0, 9, 0, 4, 0, 0, 0,
171 },
172 []int{
173 8, 4, 5, 7, 2, 9, 3, 6, 1,
174 2, 7, 3, 4, 6, 1, 5, 8, 9,
175 1, 6, 9, 8, 5, 3, 7, 2, 4,
176 9, 2, 7, 1, 4, 6, 8, 5, 3,
177 6, 5, 1, 3, 9, 8, 2, 4, 7,
178 3, 8, 4, 2, 7, 5, 9, 1, 6,
179 7, 1, 8, 6, 3, 2, 4, 9, 5,
180 4, 9, 2, 5, 1, 7, 6, 3, 8,
181 5, 3, 6, 9, 8, 4, 1, 7, 2,
182 },
183 true,
184 },
185 {
186 []int{
187 0, 1, 0, 0, 3, 0, 0, 0, 0,
188 7, 5, 0, 0, 0, 0, 0, 0, 0,
189 0, 0, 2, 0, 8, 6, 4, 0, 0,
190 6, 0, 0, 0, 0, 1, 0, 2, 0,
191 0, 0, 5, 0, 0, 0, 7, 0, 0,
192 0, 9, 0, 4, 0, 0, 0, 0, 1,
193 0, 0, 4, 2, 6, 0, 1, 0, 0,
194 0, 0, 0, 0, 0, 0, 0, 6, 9,
195 0, 0, 0, 0, 5, 0, 0, 4, 0,
196 },
197 []int{
198 4, 1, 8, 5, 3, 2, 9, 7, 6,
199 7, 5, 6, 9, 1, 4, 8, 3, 2,
200 9, 3, 2, 7, 8, 6, 4, 1, 5,
201 6, 8, 7, 3, 9, 1, 5, 2, 4,
202 1, 4, 5, 6, 2, 8, 7, 9, 3,
203 2, 9, 3, 4, 7, 5, 6, 8, 1,
204 3, 7, 4, 2, 6, 9, 1, 5, 8,
205 5, 2, 1, 8, 4, 7, 3, 6, 9,
206 8, 6, 9, 1, 5, 3, 2, 4, 7,
207 },
208 true,
209 },
210 {
211 []int{
212 0, 6, 0, 0, 4, 7, 0, 5, 0,
213 8, 0, 0, 0, 0, 5, 4, 6, 0,
214 0, 0, 2, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 8, 0, 4, 0,
216 0, 8, 0, 0, 3, 0, 0, 2, 0,
217 0, 1, 0, 2, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 5, 0, 0,
219 0, 3, 4, 5, 0, 0, 0, 0, 1,
220 0, 2, 0, 6, 8, 0, 0, 3, 0,
221 },
222 []int{
223 3, 6, 1, 8, 4, 7, 2, 5, 9,
224 8, 9, 7, 1, 2, 5, 4, 6, 3,
225 5, 4, 2, 9, 6, 3, 8, 1, 7,
226 2, 5, 3, 7, 9, 8, 1, 4, 6,
227 7, 8, 6, 4, 3, 1, 9, 2, 5,
228 4, 1, 9, 2, 5, 6, 3, 7, 8,
229 6, 7, 8, 3, 1, 4, 5, 9, 2,
230 9, 3, 4, 5, 7, 2, 6, 8, 1,
231 1, 2, 5, 6, 8, 9, 7, 3, 4,
232 },
233 true,
234 },
235 {
236 []int{
237 4, 0, 7, 0, 0, 0, 2, 8, 0,
238 0, 0, 1, 0, 5, 0, 0, 0, 0,
239 8, 6, 0, 0, 0, 7, 0, 0, 0,
240 0, 0, 2, 0, 0, 0, 0, 0, 3,
241 0, 0, 0, 5, 8, 1, 0, 0, 0,
242 1, 0, 0, 0, 0, 0, 9, 0, 0,
243 0, 0, 0, 6, 0, 0, 0, 4, 7,
244 0, 0, 0, 0, 7, 0, 5, 0, 0,
245 0, 7, 6, 0, 0, 0, 1, 0, 2,
246 },
247 []int{
248 4, 9, 7, 3, 1, 6, 2, 8, 5,
249 3, 2, 1, 4, 5, 8, 6, 7, 9,
250 8, 6, 5, 2, 9, 7, 4, 3, 1,
251 7, 5, 2, 9, 6, 4, 8, 1, 3,
252 6, 3, 9, 5, 8, 1, 7, 2, 4,
253 1, 8, 4, 7, 3, 2, 9, 5, 6,
254 9, 1, 8, 6, 2, 5, 3, 4, 7,
255 2, 4, 3, 1, 7, 9, 5, 6, 8,
256 5, 7, 6, 8, 4, 3, 1, 9, 2,
257 },
258 true,
259 },
260 {
261 []int{
262 0, 0, 0, 0, 0, 0, 0, 9, 0,
263 0, 3, 0, 5, 0, 9, 8, 0, 0,
264 0, 9, 2, 0, 0, 1, 0, 6, 0,
265 9, 0, 0, 4, 0, 0, 0, 0, 5,
266 0, 0, 0, 1, 0, 5, 0, 0, 0,
267 4, 0, 0, 0, 0, 8, 0, 0, 1,
268 0, 2, 0, 8, 0, 0, 3, 1, 0,
269 0, 0, 1, 6, 0, 3, 0, 4, 0,
270 0, 7, 0, 0, 0, 0, 0, 0, 0,
271 },
272 []int{
273 5, 4, 8, 2, 6, 7, 1, 9, 3,
274 1, 3, 6, 5, 4, 9, 8, 7, 2,
275 7, 9, 2, 3, 8, 1, 5, 6, 4,
276 9, 1, 3, 4, 2, 6, 7, 8, 5,
277 2, 8, 7, 1, 9, 5, 4, 3, 6,
278 4, 6, 5, 7, 3, 8, 9, 2, 1,
279 6, 2, 9, 8, 5, 4, 3, 1, 7,
280 8, 5, 1, 6, 7, 3, 2, 4, 9,
281 3, 7, 4, 9, 1, 2, 6, 5, 8,
282 },
283 true,
284 },
285 {
286 []int{
287 0, 0, 0, 3, 1, 0, 0, 0, 0,
288 0, 7, 3, 0, 0, 0, 0, 0, 0,
289 4, 0, 0, 9, 0, 0, 3, 0, 0,
290 0, 0, 4, 0, 2, 3, 0, 0, 5,
291 0, 0, 9, 0, 4, 0, 1, 0, 0,
292 3, 0, 0, 8, 6, 0, 7, 0, 0,
293 0, 0, 5, 0, 0, 4, 0, 0, 6,
294 0, 0, 0, 0, 0, 0, 2, 9, 0,
295 0, 0, 0, 0, 3, 1, 0, 0, 0,
296 },
297 []int{
298 5, 6, 2, 3, 1, 8, 4, 7, 9,
299 9, 7, 3, 4, 5, 2, 6, 8, 1,
300 4, 1, 8, 9, 7, 6, 3, 5, 2,
301 7, 8, 4, 1, 2, 3, 9, 6, 5,
302 6, 2, 9, 5, 4, 7, 1, 3, 8,
303 3, 5, 1, 8, 6, 9, 7, 2, 4,
304 2, 3, 5, 7, 9, 4, 8, 1, 6,
305 1, 4, 7, 6, 8, 5, 2, 9, 3,
306 8, 9, 6, 2, 3, 1, 5, 4, 7,
307 },
308 true,
309 },
310 }
311 for i, test := range tests {
312 solved := Solve9(test.start)
313 if test.solveable {
314 if solved {
315 for j, num := range test.start {
316 if num != test.solution[j] {
317 t.Errorf("solution found does not match solution given for test %d", i)
318 break
319 }
320 }
321 } else {
322 t.Errorf("didn't find solution in puzzle %d when solution expected", i+1)
323 }
324 } else {
325 if solved {
326 t.Errorf("found solution in puzzle %d when no solution expected", i+1)
327 }
328 }
329 }
330 }
331
332 func TestCustom(t *testing.T) {
333 t.Parallel()
334 /*
335 http://www.websudoku.com/variation/?day=0
336 5 overlapping 9x9 sudoku puzzles (41 regions)
337 1, 2, 3, , 4, 5, 6
338 7, 8, 9, , 10, 11, 12
339 13, 14, 15, 37, 16, 17, 18,
340 38, 39, 40
341 19, 20, 21, 41, 22, 23, 24
342 25, 26, 27, , 28, 29, 30
343 31, 32, 33, , 34, 35, 36
344
345 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 7, 3,
346 5, 0, 0, 0, 7, 3, 2, 0, 0, 0, 0, 0, 0, 3, 0, 6, 0, 1,
347 0, 3, 0, 5, 0, 0, 0, 6, 0, 0, 3, 0, 8, 0, 0, 0, 0, 4,
348 0, 0, 0, 7, 0, 5, 8, 0, 0, 0, 6, 4, 0, 0, 3, 2, 0, 0,
349 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 6, 0,
350 0, 0, 1, 0, 8, 0, 0, 3, 0, 3, 0, 8, 0, 0, 7, 0, 9, 0,
351 0, 0, 0, 9, 0, 7, 6, 5, 4,|0, 0, 0,|1, 0, 3, 0, 0, 2, 0, 5, 0,
352 0, 0, 5, 4, 0, 0, 0, 0, 0,|0, 0, 3,|9, 0, 5, 3, 0, 0, 1, 0, 0,
353 0, 0, 0, 0, 0, 6, 3, 2, 0,|5, 0, 0,|0, 0, 6, 0, 0, 0, 0, 0, 0,
354 \0, 9, 0, 0, 3, 0, 5, 0, 0,\
355 \0, 0, 0, 7, 0, 5, 0, 0, 0,\
356 \0, 0, 7, 0, 2, 0, 0, 8, 0,\
357 0, 0, 0, 0, 0, 0, 9, 0, 0,|0, 0, 7,|0, 6, 1, 3, 0, 0, 0, 0, 0,
358 0, 0, 9, 0, 0, 5, 1, 0, 8,|3, 0, 0,|0, 0, 0, 0, 0, 6, 1, 0, 0,
359 0, 3, 0, 1, 0, 0, 4, 0, 5,|0, 0, 0,|7, 3, 8, 1, 0, 5, 0, 0, 0,
360 0, 1, 0, 5, 0, 0, 2, 0, 9, 0, 9, 0, 0, 3, 0, 5, 0, 0,
361 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7,
362 0, 0, 4, 2, 0, 0, 7, 5, 0, 0, 0, 2, 5, 0, 1, 0, 0, 0,
363 4, 0, 0, 0, 0, 7, 0, 2, 0, 0, 2, 0, 0, 0, 7, 0, 8, 0,
364 1, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 3,
365 8, 7, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 2,
366 */
367 data := []int{
368 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 7, 3, //0 - 17
369 5, 0, 0, 0, 7, 3, 2, 0, 0, 0, 0, 0, 0, 3, 0, 6, 0, 1, //18 - 35
370 0, 3, 0, 5, 0, 0, 0, 6, 0, 0, 3, 0, 8, 0, 0, 0, 0, 4, //36 - 53
371 0, 0, 0, 7, 0, 5, 8, 0, 0, 0, 6, 4, 0, 0, 3, 2, 0, 0, //54 - 71
372 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 6, 0, //72 - 89
373 0, 0, 1, 0, 8, 0, 0, 3, 0, 3, 0, 8, 0, 0, 7, 0, 9, 0, //90 - 107
374 0, 0, 0, 9, 0, 7, 6, 5, 4, 1, 0, 3, 0, 0, 2, 0, 5, 0, //108 - 116, 117 - 125
375 0, 0, 5, 4, 0, 0, 0, 0, 0, 9, 0, 5, 3, 0, 0, 1, 0, 0, //126 - 134, 135 - 143
376 0, 0, 0, 0, 0, 6, 3, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, //144 - 152, 153 - 161
377
378 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 6, 1, 3, 0, 0, 0, 0, 0, //162 - 170, 171 - 179
379 0, 0, 9, 0, 0, 5, 1, 0, 8, 0, 0, 0, 0, 0, 6, 1, 0, 0, //180 - 188, 189 - 197
380 0, 3, 0, 1, 0, 0, 4, 0, 5, 7, 3, 8, 1, 0, 5, 0, 0, 0, //198 - 206, 207 - 215
381 0, 1, 0, 5, 0, 0, 2, 0, 9, 0, 9, 0, 0, 3, 0, 5, 0, 0, //216 - 233
382 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, //234 - 251
383 0, 0, 4, 2, 0, 0, 7, 5, 0, 0, 0, 2, 5, 0, 1, 0, 0, 0, //252 - 269
384 4, 0, 0, 0, 0, 7, 0, 2, 0, 0, 2, 0, 0, 0, 7, 0, 8, 0, //270 - 287
385 1, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 3, //288 - 305
386 8, 7, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 2, //306 - 323
387
388 0, 0, 0, //324, 325, 326
389 0, 0, 3, //327, 328, 329
390 5, 0, 0, //330, 331, 332
391 0, 9, 0, 0, 3, 0, 5, 0, 0, //333 - 341
392 0, 0, 0, 7, 0, 5, 0, 0, 0, //342 - 350
393 0, 0, 7, 0, 2, 0, 0, 8, 0, //351 - 359
394 0, 0, 7, //360, 361, 362
395 3, 0, 0, //363, 364, 365
396 0, 0, 0, //366, 367, 368
397 }
398
399 solution := []int{
400 4, 6, 7, 1, 2, 8, 5, 9, 3, 4, 8, 1, 2, 9, 6, 5, 7, 3,
401 5, 1, 9, 6, 7, 3, 2, 4, 8, 2, 5, 9, 7, 3, 4, 6, 8, 1,
402 2, 3, 8, 5, 4, 9, 1, 6, 7, 6, 3, 7, 8, 1, 5, 9, 2, 4,
403 3, 4, 6, 7, 9, 5, 8, 1, 2, 5, 6, 4, 9, 8, 3, 2, 1, 7,
404 9, 8, 2, 3, 6, 1, 4, 7, 5, 7, 9, 2, 5, 4, 1, 3, 6, 8,
405 7, 5, 1, 2, 8, 4, 9, 3, 6, 3, 1, 8, 6, 2, 7, 4, 9, 5,
406 8, 2, 3, 9, 1, 7, 6, 5, 4, 1, 7, 3, 4, 6, 2, 8, 5, 9,
407 6, 9, 5, 4, 3, 2, 7, 8, 1, 9, 2, 5, 3, 7, 8, 1, 4, 6,
408 1, 7, 4, 8, 5, 6, 3, 2, 9, 8, 4, 6, 1, 5, 9, 7, 3, 2,
409
410 5, 4, 1, 7, 6, 8, 9, 3, 2, 4, 6, 1, 3, 2, 9, 8, 7, 5,
411 6, 2, 9, 4, 3, 5, 1, 7, 8, 2, 5, 9, 8, 7, 6, 1, 3, 4,
412 7, 3, 8, 1, 9, 2, 4, 6, 5, 7, 3, 8, 1, 4, 5, 2, 6, 9,
413 3, 1, 6, 5, 7, 4, 2, 8, 9, 8, 9, 6, 7, 3, 4, 5, 2, 1,
414 2, 5, 7, 9, 8, 3, 6, 1, 4, 1, 4, 5, 2, 6, 8, 3, 9, 7,
415 9, 8, 4, 2, 1, 6, 7, 5, 3, 3, 7, 2, 5, 9, 1, 6, 4, 8,
416 4, 9, 3, 6, 5, 7, 8, 2, 1, 5, 2, 3, 4, 1, 7, 9, 8, 6,
417 1, 6, 5, 8, 2, 9, 3, 4, 7, 6, 1, 7, 9, 8, 2, 4, 5, 3,
418 8, 7, 2, 3, 4, 1, 5, 9, 6, 9, 8, 4, 6, 5, 3, 7, 1, 2,
419
420 2, 8, 9,
421 6, 4, 3,
422 5, 7, 1,
423 2, 9, 6, 4, 3, 8, 5, 1, 7,
424 8, 4, 3, 7, 1, 5, 6, 9, 2,
425 5, 1, 7, 9, 2, 6, 3, 8, 4,
426 8, 5, 7,
427 3, 6, 4,
428 1, 9, 2,
429 }
430
431 sections := make([]Constraint, 0, 131)
432 sections = append(sections, MakeBox(18, 18, 9, 1)...)
433 sections = append(sections, MakeBox(18, 18, 1, 9)...)
434 sections = append(sections, MakeBox(18, 18, 3, 3)...)
435
436 sections = append(sections,
437 Unique{114, 115, 116, 324, 325, 326, 117, 118, 119},
438 Unique{132, 133, 134, 327, 328, 329, 135, 136, 137},
439 Unique{150, 151, 152, 330, 331, 332, 153, 154, 155},
440 Unique{333, 334, 335, 336, 337, 338, 339, 340, 341},
441 Unique{342, 343, 344, 345, 346, 347, 348, 349, 350},
442 Unique{351, 352, 353, 354, 355, 356, 357, 358, 359},
443 Unique{168, 169, 170, 360, 361, 362, 171, 172, 173},
444 Unique{186, 187, 188, 363, 364, 365, 189, 190, 191},
445 Unique{204, 205, 206, 366, 367, 368, 207, 208, 209},
446
447 Unique{114, 132, 150, 333, 342, 351, 168, 186, 204},
448 Unique{115, 133, 151, 334, 343, 352, 169, 187, 205},
449 Unique{116, 134, 152, 335, 344, 353, 170, 188, 206},
450 Unique{324, 327, 330, 336, 345, 354, 360, 363, 366},
451 Unique{325, 328, 331, 337, 346, 355, 361, 364, 367},
452 Unique{326, 329, 332, 338, 347, 356, 362, 365, 368},
453 Unique{117, 135, 153, 339, 348, 357, 171, 189, 207},
454 Unique{118, 136, 154, 340, 349, 358, 172, 190, 208},
455 Unique{119, 137, 155, 341, 350, 359, 173, 191, 209},
456
457 Unique{324, 325, 326, 327, 328, 329, 330, 331, 332},
458 Unique{333, 334, 335, 342, 343, 344, 351, 352, 353},
459 Unique{336, 337, 338, 345, 346, 347, 354, 355, 356},
460 Unique{339, 340, 341, 348, 349, 350, 357, 358, 359},
461 Unique{360, 361, 362, 363, 364, 365, 366, 367, 368},
462 )
463
464 if Solve(data, 9, sections) {
465 for i, n := range data {
466 if solution[i] != n {
467 t.Errorf("solution found does not match solution given")
468 break
469 }
470 }
471 } else {
472 t.Errorf("didn't find solution when solution expected")
473 }
474 }
475
476 func TestHard(t *testing.T) {
477 puzzle := []int{
478 8, 0, 0, 0, 0, 0, 0, 0, 0,
479 0, 0, 3, 6, 0, 0, 0, 0, 0,
480 0, 7, 0, 0, 9, 0, 2, 0, 0,
481 0, 5, 0, 0, 0, 7, 0, 0, 0,
482 0, 0, 0, 0, 4, 5, 7, 0, 0,
483 0, 0, 0, 1, 0, 0, 0, 3, 0,
484 0, 0, 1, 0, 0, 0, 0, 6, 8,
485 0, 0, 8, 5, 0, 0, 0, 1, 0,
486 0, 9, 0, 0, 0, 0, 4, 0, 0,
487 }
488 solution := []int{
489 8, 1, 2, 7, 5, 3, 6, 4, 9,
490 9, 4, 3, 6, 8, 2, 1, 7, 5,
491 6, 7, 5, 4, 9, 1, 2, 8, 3,
492 1, 5, 4, 2, 3, 7, 8, 9, 6,
493 3, 6, 9, 8, 4, 5, 7, 2, 1,
494 2, 8, 7, 1, 6, 9, 5, 3, 4,
495 5, 2, 1, 9, 7, 4, 3, 6, 8,
496 4, 3, 8, 5, 2, 6, 9, 1, 7,
497 7, 9, 6, 3, 1, 8, 4, 5, 2,
498 }
499 if !Solve9(puzzle) {
500 t.Errorf("unable to solve puzzle")
501 } else {
502 for n, d := range puzzle {
503 if solution[n] != d {
504 t.Errorf("solution found does not match solution given")
505 break
506 }
507 }
508 }
509 }