/
boards.js
168 lines (153 loc) · 7.96 KB
/
boards.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/**
* Sudoku puzzles collection
*
* Generated with the gnome-sudoku software
*
* @copyright 2009 Nikolay V. Nemshilov aka St.
*/
Sudoku.Boards = {
/**
* returns a random board for the given level
*
* @param String level easy/normal/hard/extreme
* @return Object board
*/
random: function(level) {
level = level || 'normal';
var els = this[level].random().split(';');
var sequence = els.first();
var puzzle = [];
for (var i=0; i < 81; i++) {
var x = (i/9).floor();
var y = i % 9;
var s = sequence.charAt(i);
puzzle[x] = puzzle[x] || [];
puzzle[x][y] = s == '.' ? null : s.toInt();
}
return {
difficulty: els.last().toInt() / 100,
puzzle: this.shuffle(puzzle)
};
},
/**
* rundomizes the puzzle
*
* @param Array original puzzle
* @retrun Array shuffled puzzle
*/
shuffle: function(puzzle) {
puzzle = this.flip(puzzle);
(128).times(function() {
[function(num, i) { return [num, i, num+1, i]; },
function(num, i) { return [i, num, i, num+1]; }
].each(function(proc) {
var num = [0,1,3,4,6,7].random();
for (var i=0; i < 9; i++) {
var pos = proc(num, i);
var val = puzzle[pos[0]][pos[1]];
puzzle[pos[0]][pos[1]] = puzzle[pos[2]][pos[3]];
puzzle[pos[2]][pos[3]] = val;
}
});
});
return puzzle;
},
/**
* flips the puzzle matrix
*
* @param Array original puzzle
* @return Array flipped puzzle
*/
flip: function(puzzle) {
var flipper = [
function(x, y) { return [x, y]; },
function(x, y) { return [y, x]; },
function(x, y) { return [8-x, y]; },
function(x, y) { return [x, 8-y]; },
function(x, y) { return [8-x, 8-y]; }
].random();
var matrix = [];
for (var x=0; x < 9; x++) {
for (var y=0; y < 9; y++) {
var pos = flipper(x,y);
var new_x = pos.first();
var new_y = pos.last();
matrix[new_x] = matrix[new_x] || [];
matrix[new_x][new_y] = puzzle[x][y];
}
}
return matrix;
},
easy: [
'.1..4.56.23.615.8....8..1...5..2...86..781..59...6..2...6..8....8.473.56.45.9..1.;30',
'.17..256..34.15.8...9...14.45....6...2.781.9...8....21.96...2...8.47.95..452..81.;27',
'..7.4...3...6..7.9...83..4.451.2.67862.....95978.6.321.9..58...1.2..3...3...9.8..;28',
'.....9.565..78.1.....5.38.965.8.4792.2.....6.3976.2.184.31.5.....5.48..121.3.....;37',
'78.....5.5.97...2..4..2..796.....792..49.15..397.....846..9..8..7...86.1.1.....45;29',
'7..4.9..65.9.8612.14.......65.8......249.156......2.18.......87.7524.6.12..3.7..5;20',
'78.....56..9.8.1...46....7.65...4792...9.1...3976...18.6....28...5.4.6..21.....45;39',
'.4...91.6365.........26...54578..6.9..19.58..9.3..45275...91.........3817.63...5.;26',
'.4....1.63.51.72.....2....545.82.61...19.58...83.14.275....1.....47.63.17.6....5.;42',
'8.25..1......47..81.9.6.4354...23.1..2.....4..8.61...7538.9.7.22..75......6..29.4;21',
'84..391..36.1....81.92......5.8..6....19.58....3..4.2......17.22....6.81..638..54;32',
'..9..5.715..7.6.....849..35.3..182...9.342.6...296..4.92..743.....6.9..276.8..4..;15',
'6.9.....1.1...6.24..84..63..3.5..2.71.73.25.88.2..7.4..25..43..38.6...1.7.....4.9;24',
'..9.3.87.5.....9.427..91.3.4.6.182..1..3.2..8..296.1.3.2.17..863.4.....2.61.2.4..;14',
'..9..58.....7.69.42.849....43.51..97..73.25..85..67.43....743.63.46.9.....18..4..;28',
'62..5..9..15824.7..486....2.5..7...9...2.9...2...4..6.5....261..6.43792..9..1..84;22'
],
normal: [
'...81523....9....8..246.51.3.6...1...5.1.6.2...4...6.3.95.418..6....9....83652...;55',
'.1.4...3729..7.5........1.......8714..5...9..7213.......6........9.3..8548...5.7.;52',
'3..512..42..7.8..6.1........9.....62.2.9.6.8.57.....4........5.1..6.4..97..135..8;57',
'.2..514....5....76.4.69..5.1.6.78....8.....3....14.8.7.7..82.1.86....9....251..8.;48',
'.....149..15.2.37.74.6.....1.6..82.94..2.9..12.91..8.7.....2.13.61.3.92..925.....;54',
'.2.7.14...1..2..76....93.521...7.2...8.2.9.3...9.4...757.98....86..3..2...25.6.8.;48',
'4.6....2..2.68.1.5.18.....3.8.7.53....7.3.5....38.6.1.8.....47.6.1.74.3..4....6.1;46',
'4.61.....32.6.7..551.......2.4...3...679.258...3...2.7.......796..5.4.32.....86.1;47',
'.2..95..7.45.3216..7..6..4.49....7....3...2....7....96.3..7..5..6132.47.7..65..2.;55',
'..9......4.6.5.92.25.9.48..8.71......314.527......84.1..58.6.49.98.4.6.5......1..;45',
'.....2893.....3..7.679...42..3....8995.3.8.2668....1..23...597.1..2.....5798.....;45',
'.7....419..9.....2..5.79...7831.2.4....834....9.6.7831...76.5..3.....1..968....7.;55',
'24...97.1..1..6.4..36...2..5..9...16...6.2...69...7..4..3...68..5.8..4..8.27...35;46',
'1...76.93..63...4....41.7...7..9.4..2.9.6.3.7..3.5..1...2.37....1...56..34.68...9;46',
'17..34.9........2.5.6..7...3..1...87.47.5.31.82...9..5...4..9.3.6........3.79..61;45',
'7.2....1..162.4..3..3.6....294.3.15.63..2..74.75.9.362....4.6..4..3.582..2....5.7;45'
],
hard: [
'1..6.5.8.75..2..6..2.3..5..89.7...5...3...8...1...8.79..1..2.3..4..7..16.8.1.6..5;61',
'.9...3.1.2.8..73..4.....58...45.8....8.9.1.7....7.24...46.....2..96..8.1.2.3...5.;62',
'.4.2.63..326.1.5.41...4....5....42..71.5.8.36..47....5....3...16.1.8.953..39.1.4.;62',
'.754.68.28..7..1...4..9..7...19.4.......8.......5.36...1..4..8...4..9..12.73.195.;63',
'...7....51.38.46.9.7....13....47.5.8...2.9...7.6.58....97....5.2.85.39.74....7...;64',
'.3.9..7....5..2.94..7.456.2.4..6.2.1.........7.1.2..6.6.245.1..59.2..4....3..9.2.;65',
'........934.9..52.....21..38..412.7..7.5.9.1..2.876..44..29.....63..4.522........;66',
'6.94...8.8..9..5.4.5...79..7..63289....8.1....68549..3..41...5.3.6..8..9.8...47.6;67',
'.52..893.1..4...52.3.5..8......65..8....8....8..94......9..1.7.37...4..9.168..52.;68',
'.17..3...52.7...8.....2.3.....859.233..2.7..529.134.....6.1.....3...5.72...9..53.;69',
'3.45172.9..7..45.1....2.4..7.....6...413.589...5.....4..3.6....9.61..3..5.27439.6;69',
'.18...64.6..8....3..356179.48.9.3...............4.6.81.641923..1....8..9.32...81.;69',
'.1..2...44.7...2....984.31.7..1..6..39.2.8.51..1..4..9.75.819....8...1.31...9..6.;70',
'.9..7.2...63.......4751.3.9.29...1.....9.2.....5...69.1.4.8796.......72...2.3..4.;70',
'...95..4.9.8..7.124.6...7..5...6182..8.....6..1258...9..3...9.776.2..1.4.9..75...;70',
'.47.6.58...1.9436......34.1.62.....5...956...5.....63.2.46......7532.9...38.4.25.;75'
],
extreme: [
'.8...7.9532..85...75.36......6...4.3..3...9..5.2...7......13.84...74..3943.5...6.;76',
'6..2....42.84516..3...8..1.1..86.3....9...1....6.13..8.1..7...2..21485.35....2..1;78',
'.1.76.9....7..3.2.68..2.....2.8.5..98.5...2.19..2.1.4.....8..92.4.9..7....9.42.8.;78',
'2..3.1.45.....6..2.53.9....98....7.31.7...4.93.5....86....2.96.4..1.....79.6.5..4;78',
'..3...1..68..13...91.4...3.26..517.3..1...2..8.967..15.2...9.84...28..71..8...6..;78',
'.....5.7.2..3.95.115..2...9..8.63.5236.....1842.15.6..5...3..268.12.6..5.9.5.....;80',
'..91.8.4..4.6.57.8.......1.8..3...7.1.57.24.9.9...1..2.6.......9.38.4.2..5.2.61..;82',
'.14.6.3..62...4..9.8..5.6...6.2....3.7..1..5.5....9.6...6.2..3.1..5...92..7.9.41.;83',
'94.1.7..8.....35...6.48..1.5..87.3...7.....6...8.49..7.5..34.8...75.....3..7.8.95;84',
'6....8.3..3.6..59.4....58.1..4..3.799.......531.5..6..1.38....6.49..6.8..6.9....3;84',
'8461...3..5...21.....94....615....4...3...6...8....712....28.....23...6..3...1427;86',
'.....8..22.83..1...73.1.8.......1345...935...5317.......9.6.27...6..74.97..2.....;87',
'..9546.8...8...5.725........4.63...8...1.8...5...24.1........268.5...3...3.2897..;88',
'9..3....6.8......7..52.89....8..4.73.9.....4.76.1..2....78.14..1......5.8....9..1;92',
'8..1.3.5.31.4..8....5.......9.2....5.587.936.4....5.8.......2....2..1.37.3.8.2..1;92',
'..41..3...7...8..1......7.98.3.59..2..96.15..1..82.9.46.1......4..3...9...8..42..;95'
]
};