sudoku - uniquesum_test.go
1 package sudoku
2
3 import (
4 "fmt"
5 "testing"
6 )
7
8 func TestSumdoku(t *testing.T) {
9 t.Parallel()
10 tests := []struct {
11 start, solution []int
12 solveable bool
13 chars int
14 constraints []Constraint
15 }{
16 {
17 make([]int, 81),
18 []int{
19 6, 2, 9, 1, 4, 3, 8, 5, 7,
20 3, 5, 7, 9, 6, 8, 4, 2, 1,
21 1, 8, 4, 7, 5, 2, 6, 9, 3,
22 2, 9, 5, 3, 1, 4, 7, 8, 6,
23 7, 3, 6, 2, 8, 9, 1, 4, 5,
24 8, 4, 1, 6, 7, 5, 2, 3, 9,
25 9, 1, 8, 4, 3, 7, 5, 6, 2,
26 4, 7, 3, 5, 2, 6, 9, 1, 8,
27 5, 6, 2, 8, 9, 1, 3, 7, 4,
28 },
29 true,
30 9,
31 append(s9,
32 UniqueSum{[]int{0, 1, 2, 11}, 24},
33 UniqueSum{[]int{3, 4, 5}, 8},
34 UniqueSum{[]int{6, 7, 8}, 20},
35 UniqueSum{[]int{9, 10, 18}, 9},
36 UniqueSum{[]int{12, 21}, 16},
37 UniqueSum{[]int{13, 14, 15}, 18},
38 UniqueSum{[]int{16, 17}, 3},
39 UniqueSum{[]int{19, 20, 28, 29}, 26},
40 UniqueSum{[]int{22, 30, 31}, 9},
41 UniqueSum{[]int{23, 32, 40, 41}, 23},
42 UniqueSum{[]int{24, 25, 33}, 22},
43 UniqueSum{[]int{26, 34, 35}, 17},
44 UniqueSum{[]int{27, 36, 45, 54}, 26},
45 UniqueSum{[]int{37, 46, 55}, 8},
46 UniqueSum{[]int{38, 39}, 8},
47 UniqueSum{[]int{42, 43, 51, 60}, 12},
48 UniqueSum{[]int{44, 53}, 14},
49 UniqueSum{[]int{47, 48, 49, 50}, 19},
50 UniqueSum{[]int{52, 61, 62}, 11},
51 UniqueSum{[]int{56, 57}, 12},
52 UniqueSum{[]int{58, 67, 75, 76}, 22},
53 UniqueSum{[]int{59, 68, 69}, 22},
54 UniqueSum{[]int{63, 72}, 9},
55 UniqueSum{[]int{64, 73}, 13},
56 UniqueSum{[]int{65, 66, 74}, 10},
57 UniqueSum{[]int{70, 79}, 8},
58 UniqueSum{[]int{71, 80}, 12},
59 UniqueSum{[]int{77, 78}, 4},
60 ),
61 },
62 {
63 make([]int, 81),
64 []int{
65 2, 6, 7, 9, 5, 1, 3, 4, 8,
66 3, 5, 4, 7, 2, 8, 1, 6, 9,
67 8, 1, 9, 6, 3, 4, 2, 5, 7,
68 9, 3, 6, 2, 4, 7, 5, 8, 1,
69 5, 2, 8, 1, 9, 6, 7, 3, 4,
70 4, 7, 1, 3, 8, 5, 9, 2, 6,
71 1, 4, 5, 8, 7, 3, 6, 9, 2,
72 6, 8, 2, 5, 1, 9, 4, 7, 3,
73 7, 9, 3, 4, 6, 2, 8, 1, 5,
74 },
75 true,
76 9,
77 append(s9,
78 UniqueSum{[]int{0, 9, 18, 27}, 22},
79 UniqueSum{[]int{1, 2, 3, 10}, 27},
80 UniqueSum{[]int{4, 5, 6}, 9},
81 UniqueSum{[]int{7, 16}, 10},
82 UniqueSum{[]int{8, 17}, 17},
83 UniqueSum{[]int{11, 12, 21}, 17},
84 UniqueSum{[]int{13, 22, 31}, 9},
85 UniqueSum{[]int{14, 15, 23, 24}, 15},
86 UniqueSum{[]int{19, 28}, 4},
87 UniqueSum{[]int{20, 29, 38}, 23},
88 UniqueSum{[]int{25, 26, 34}, 20},
89 UniqueSum{[]int{30, 39}, 3},
90 UniqueSum{[]int{32, 33}, 12},
91 UniqueSum{[]int{35, 43, 44}, 8},
92 UniqueSum{[]int{36, 37, 45, 54}, 12},
93 UniqueSum{[]int{40, 41, 49}, 23},
94 UniqueSum{[]int{42, 51, 60}, 22},
95 UniqueSum{[]int{46, 55}, 11},
96 UniqueSum{[]int{47, 48, 56}, 9},
97 UniqueSum{[]int{50, 57, 58, 59}, 23},
98 UniqueSum{[]int{52, 53, 61, 70}, 24},
99 UniqueSum{[]int{62, 71, 79, 80}, 11},
100 UniqueSum{[]int{63, 64, 72, 73}, 30},
101 UniqueSum{[]int{65, 66, 67}, 8},
102 UniqueSum{[]int{68, 69}, 13},
103 UniqueSum{[]int{74, 75}, 7},
104 UniqueSum{[]int{76, 77, 78}, 16},
105 ),
106 },
107 {
108 make([]int, 81),
109 []int{
110 3, 5, 4, 8, 1, 7, 2, 6, 9,
111 8, 9, 2, 6, 3, 4, 7, 1, 5,
112 1, 7, 6, 5, 9, 2, 8, 4, 3,
113 9, 4, 8, 1, 2, 5, 6, 3, 7,
114 7, 6, 5, 4, 8, 3, 1, 9, 2,
115 2, 3, 1, 7, 6, 9, 4, 5, 8,
116 6, 1, 9, 2, 5, 8, 3, 7, 4,
117 4, 8, 3, 9, 7, 6, 5, 2, 1,
118 5, 2, 7, 3, 4, 1, 9, 8, 6,
119 },
120 true,
121 9,
122 append(s9,
123 UniqueSum{[]int{0, 1}, 8},
124 UniqueSum{[]int{2, 9, 10, 11}, 23},
125 UniqueSum{[]int{3, 12}, 14},
126 UniqueSum{[]int{4, 13, 21, 22}, 18},
127 UniqueSum{[]int{5, 6}, 9},
128 UniqueSum{[]int{7, 8, 17, 26}, 23},
129 UniqueSum{[]int{14, 15, 23, 24}, 21},
130 UniqueSum{[]int{16, 25, 34}, 8},
131 UniqueSum{[]int{18, 19}, 8},
132 UniqueSum{[]int{20, 29, 30, 31}, 17},
133 UniqueSum{[]int{27, 36}, 16},
134 UniqueSum{[]int{28, 37, 38, 47}, 16},
135 UniqueSum{[]int{32, 33}, 11},
136 UniqueSum{[]int{35, 44}, 9},
137 UniqueSum{[]int{39, 48}, 11},
138 UniqueSum{[]int{40, 41, 42, 49}, 18},
139 UniqueSum{[]int{43, 52, 53}, 22},
140 UniqueSum{[]int{45, 54}, 8},
141 UniqueSum{[]int{46, 55}, 4},
142 UniqueSum{[]int{50, 57, 58, 59}, 24},
143 UniqueSum{[]int{51, 60, 69}, 12},
144 UniqueSum{[]int{56, 65}, 12},
145 UniqueSum{[]int{61, 62}, 11},
146 UniqueSum{[]int{63, 64, 72, 73}, 19},
147 UniqueSum{[]int{66, 67, 68}, 22},
148 UniqueSum{[]int{70, 71}, 3},
149 UniqueSum{[]int{74, 75, 76, 77}, 15},
150 UniqueSum{[]int{78, 79, 80}, 23},
151 ),
152 },
153 }
154 for i, test := range tests {
155 solved := Solve(test.start, test.chars, test.constraints)
156 if test.solveable {
157 if solved {
158 for j, num := range test.start {
159 if num != test.solution[j] {
160 fmt.Println(test.start[:9])
161 fmt.Println(test.start[9:18])
162 fmt.Println(test.start[18:27])
163 fmt.Println(test.start[27:36])
164 fmt.Println(test.start[36:45])
165 fmt.Println(test.start[45:54])
166 fmt.Println(test.start[54:63])
167 fmt.Println(test.start[63:72])
168 fmt.Println(test.start[72:])
169 t.Errorf("solution found does not match solution given for test %d", i+1)
170 break
171 }
172 }
173 } else {
174 t.Errorf("didn't find solution in puzzle %d when solution expected", i+1)
175 }
176 }
177 }
178 }