cubing 0.25.3 → 0.25.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -30
- package/dist/esm/{2x2x2.sgs.json-MMXKAIKZ.js → 2x2x2.sgs.json-3ZT7QXX6.js} +3 -3
- package/dist/esm/{2x2x2.sgs.json-MMXKAIKZ.js.map → 2x2x2.sgs.json-3ZT7QXX6.js.map} +0 -0
- package/dist/esm/{3d-dynamic-N4H7XJWX.js → 3d-dynamic-PTVO24C3.js} +4 -4
- package/dist/esm/{3d-dynamic-N4H7XJWX.js.map → 3d-dynamic-PTVO24C3.js.map} +0 -0
- package/dist/esm/{444-solver-PV2GUWP2.js → 444-solver-BYA4CXZO.js} +4 -4
- package/dist/esm/{444-solver-PV2GUWP2.js.map → 444-solver-BYA4CXZO.js.map} +0 -0
- package/dist/esm/bluetooth/index.js +3 -3
- package/dist/esm/{chunk-TXTMBIUR.js → chunk-ANYSPBCR.js} +2 -2
- package/dist/esm/{chunk-TXTMBIUR.js.map → chunk-ANYSPBCR.js.map} +0 -0
- package/dist/esm/{chunk-LMZIKLXW.js → chunk-CNIY6YZL.js} +24 -3
- package/dist/esm/chunk-CNIY6YZL.js.map +7 -0
- package/dist/esm/{chunk-5GJ5C7NZ.js → chunk-HFQZM22L.js} +3 -3
- package/dist/esm/{chunk-5GJ5C7NZ.js.map → chunk-HFQZM22L.js.map} +0 -0
- package/dist/esm/{chunk-OH2FLVZM.js → chunk-JGAZXWH2.js} +2 -2
- package/dist/esm/{chunk-OH2FLVZM.js.map → chunk-JGAZXWH2.js.map} +0 -0
- package/dist/esm/{chunk-QEDC2QTN.js → chunk-JW2JE4D3.js} +2 -2
- package/dist/esm/{chunk-QEDC2QTN.js.map → chunk-JW2JE4D3.js.map} +0 -0
- package/dist/esm/{chunk-Y32HHZUY.js → chunk-MVKZPDII.js} +20 -2
- package/dist/esm/chunk-MVKZPDII.js.map +7 -0
- package/dist/esm/{chunk-NGA3FW7U.js → chunk-NROLOGGL.js} +3 -3
- package/dist/esm/{chunk-NGA3FW7U.js.map → chunk-NROLOGGL.js.map} +0 -0
- package/dist/esm/{chunk-KJZNEDOV.js → chunk-OAPHPP4R.js} +2 -2
- package/dist/esm/{chunk-KJZNEDOV.js.map → chunk-OAPHPP4R.js.map} +0 -0
- package/dist/esm/{chunk-UNROETIO.js → chunk-ZIHFCBOI.js} +2 -2
- package/dist/esm/{chunk-UNROETIO.js.map → chunk-ZIHFCBOI.js.map} +0 -0
- package/dist/esm/{fto.dynamic-UHH65HEC.js → fto.dynamic-FLX5JKRG.js} +3 -3
- package/dist/esm/{fto.dynamic-UHH65HEC.js.map → fto.dynamic-FLX5JKRG.js.map} +0 -0
- package/dist/esm/kilosolver-N6JM5PUY.js +713 -0
- package/dist/esm/kilosolver-N6JM5PUY.js.map +7 -0
- package/dist/esm/kpuzzle/index.js +1 -1
- package/dist/esm/{megaminx.sgs.json-3ZEDZMWF.js → megaminx.sgs.json-CGIZZZMZ.js} +3 -3
- package/dist/esm/{megaminx.sgs.json-3ZEDZMWF.js.map → megaminx.sgs.json-CGIZZZMZ.js.map} +0 -0
- package/dist/esm/protocol/index.js +2 -2
- package/dist/esm/puzzles/index.js +2 -2
- package/dist/esm/{pyraminx.sgs.json-5IA2F65U.js → pyraminx.sgs.json-XGJQTHLV.js} +4 -4
- package/dist/esm/{pyraminx.sgs.json-5IA2F65U.js.map → pyraminx.sgs.json-XGJQTHLV.js.map} +0 -0
- package/dist/esm/redi_cube-E5F64NIQ.js +564 -0
- package/dist/esm/redi_cube-E5F64NIQ.js.map +7 -0
- package/dist/esm/redi_cube.kpuzzle.json-EPBKWOMV.js +66 -0
- package/dist/esm/redi_cube.kpuzzle.json-EPBKWOMV.js.map +7 -0
- package/dist/esm/redi_cube.kpuzzle.svg-BSHCMC2Z.js +160 -0
- package/dist/esm/redi_cube.kpuzzle.svg-BSHCMC2Z.js.map +7 -0
- package/dist/esm/scramble/index.js +4 -4
- package/dist/esm/search/index.js +4 -4
- package/dist/esm/{search-worker-js-entry-AXEFSQVG.js → search-worker-js-entry-A4VBA2ZD.js} +34 -16
- package/dist/esm/{search-worker-js-entry-AXEFSQVG.js.map → search-worker-js-entry-A4VBA2ZD.js.map} +3 -3
- package/dist/esm/{search-worker-ts-entry-OOL7WATY.js → search-worker-ts-entry-LUHAXJBE.js} +2 -2
- package/dist/esm/{search-worker-ts-entry-OOL7WATY.js.map → search-worker-ts-entry-LUHAXJBE.js.map} +0 -0
- package/dist/esm/{skewb.sgs.json-6NDFH63U.js → skewb.sgs.json-HNUN4G7F.js} +3 -3
- package/dist/esm/{skewb.sgs.json-6NDFH63U.js.map → skewb.sgs.json-HNUN4G7F.js.map} +0 -0
- package/dist/esm/twisty/index.js +17 -5
- package/dist/esm/twisty/index.js.map +2 -2
- package/dist/esm/worker-inside-generated-string-VHOABMFC.js +3674 -0
- package/dist/esm/worker-inside-generated-string-VHOABMFC.js.map +7 -0
- package/dist/types/kpuzzle/KPuzzleDefinition.d.ts +1 -0
- package/dist/types/kpuzzle/KState.d.ts +1 -0
- package/dist/types/kpuzzle/KTransformation.d.ts +1 -0
- package/dist/types/puzzles/implementations/redi-cube/index.d.ts +2 -0
- package/dist/types/puzzles/implementations/redi-cube/redi_cube.kpuzzle.json.d.ts +2 -0
- package/dist/types/puzzles/implementations/redi-cube/redi_cube.kpuzzle.svg.d.ts +1 -0
- package/dist/types/search/inside/solve/puzzles/kilominx.d.ts +2 -0
- package/dist/types/search/inside/solve/puzzles/redi_cube.d.ts +2 -0
- package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.d.ts +1 -0
- package/dist/types/vendor/xyzzy/fto-solver-original.d.ts +1 -56
- package/dist/types/vendor/xyzzy/kilosolver.d.ts +2 -140
- package/dist/types/vendor/xyzzy/redi_cube.d.ts +2 -0
- package/package.json +65 -70
- package/dist/esm/chunk-LMZIKLXW.js.map +0 -7
- package/dist/esm/chunk-Y32HHZUY.js.map +0 -7
- package/dist/esm/worker-inside-generated-string-CSXWVF2Y.js +0 -3522
- package/dist/esm/worker-inside-generated-string-CSXWVF2Y.js.map +0 -7
- package/dist/types/vendor/xyzzy/rediscrambler.d.ts +0 -94
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
import {
|
|
2
|
+
randomUIntBelowFactory
|
|
3
|
+
} from "./chunk-RENZB7QN.js";
|
|
4
|
+
import {
|
|
5
|
+
Alg
|
|
6
|
+
} from "./chunk-EWRBHQFX.js";
|
|
7
|
+
import "./chunk-WO2AXYFE.js";
|
|
8
|
+
|
|
9
|
+
// src/cubing/vendor/xyzzy/kilosolver.js
|
|
10
|
+
"use strict";
|
|
11
|
+
var PHASE4_THRESHOLD = 7;
|
|
12
|
+
function factorial(n) {
|
|
13
|
+
if (n < 2)
|
|
14
|
+
return n;
|
|
15
|
+
let f = 1;
|
|
16
|
+
for (let i = 2; i <= n; i++)
|
|
17
|
+
f *= i;
|
|
18
|
+
return f;
|
|
19
|
+
}
|
|
20
|
+
function C(n, k) {
|
|
21
|
+
if (k < 0 || k > n)
|
|
22
|
+
return 0;
|
|
23
|
+
if (k === 0 || k === n)
|
|
24
|
+
return 1;
|
|
25
|
+
let c = 1;
|
|
26
|
+
for (let i = 0; i < k; i++) {
|
|
27
|
+
c = c * (n - i) / (i + 1) | 0;
|
|
28
|
+
}
|
|
29
|
+
return c;
|
|
30
|
+
}
|
|
31
|
+
function permutation_to_index(perm) {
|
|
32
|
+
perm = perm.slice();
|
|
33
|
+
let n = perm.length;
|
|
34
|
+
let f = factorial(n - 1);
|
|
35
|
+
let ind = 0;
|
|
36
|
+
while (n > 1) {
|
|
37
|
+
n--;
|
|
38
|
+
let e = perm[0];
|
|
39
|
+
ind += e * f;
|
|
40
|
+
for (let i = 0; i < n; i++) {
|
|
41
|
+
let x = perm[i + 1];
|
|
42
|
+
perm[i] = x - (x > e);
|
|
43
|
+
}
|
|
44
|
+
f /= n;
|
|
45
|
+
}
|
|
46
|
+
return ind;
|
|
47
|
+
}
|
|
48
|
+
function permutation_parity(A) {
|
|
49
|
+
let n = A.length;
|
|
50
|
+
let parity = 0;
|
|
51
|
+
for (let i = 0; i < n - 1; i++) {
|
|
52
|
+
for (let j = i; j < n; j++) {
|
|
53
|
+
if (A[i] > A[j])
|
|
54
|
+
parity ^= 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return parity;
|
|
58
|
+
}
|
|
59
|
+
function evenpermutation_to_index(perm) {
|
|
60
|
+
return permutation_to_index(perm) >> 1;
|
|
61
|
+
}
|
|
62
|
+
var [evenpermutation10_to_index, index_to_evenpermutation10] = (() => {
|
|
63
|
+
let index_in_set_bits = new Int8Array(1024 * 10);
|
|
64
|
+
let look_up_set_bits = new Int8Array(1024 * 10);
|
|
65
|
+
for (let i = 0; i < 1024; i++) {
|
|
66
|
+
for (let j = 0, counter = 0; j < 10; j++) {
|
|
67
|
+
if ((i >>> j & 1) === 0) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
index_in_set_bits[j << 10 | i] = counter;
|
|
71
|
+
look_up_set_bits[counter << 10 | i] = j;
|
|
72
|
+
counter++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function evenpermutation10_to_index2(perm) {
|
|
76
|
+
let unused = 1023;
|
|
77
|
+
let f = 181440;
|
|
78
|
+
let ind = 0;
|
|
79
|
+
for (let i = 0; i < 8; i++) {
|
|
80
|
+
let v = perm[i];
|
|
81
|
+
ind += index_in_set_bits[unused | v << 10] * f;
|
|
82
|
+
unused &= ~(1 << v);
|
|
83
|
+
f /= 9 - i;
|
|
84
|
+
}
|
|
85
|
+
return ind;
|
|
86
|
+
}
|
|
87
|
+
function index_to_evenpermutation102(ind, perm) {
|
|
88
|
+
let unused = 1023;
|
|
89
|
+
let f = 181440;
|
|
90
|
+
let parity = 0;
|
|
91
|
+
for (let i = 0; i < 8; i++) {
|
|
92
|
+
let a = ind / f | 0;
|
|
93
|
+
ind -= a * f;
|
|
94
|
+
parity ^= a & 1;
|
|
95
|
+
let v = look_up_set_bits[unused | a << 10];
|
|
96
|
+
perm[i] = v;
|
|
97
|
+
unused &= ~(1 << v);
|
|
98
|
+
f /= 9 - i;
|
|
99
|
+
}
|
|
100
|
+
perm[8] = look_up_set_bits[unused | parity << 10];
|
|
101
|
+
perm[9] = look_up_set_bits[unused | (parity ^ 1) << 10];
|
|
102
|
+
return perm;
|
|
103
|
+
}
|
|
104
|
+
return [evenpermutation10_to_index2, index_to_evenpermutation102];
|
|
105
|
+
})();
|
|
106
|
+
function comb_to_index(l) {
|
|
107
|
+
let bits = l.length;
|
|
108
|
+
let ones = 0;
|
|
109
|
+
for (let i = 0; i < bits; i++)
|
|
110
|
+
ones += +(l[i] === 1);
|
|
111
|
+
let zeros = bits - ones;
|
|
112
|
+
if (zeros === 0 || ones === 0 || bits === 1)
|
|
113
|
+
return 0;
|
|
114
|
+
let b = C(bits - 1, ones);
|
|
115
|
+
let ind = 0;
|
|
116
|
+
for (let i = 0; zeros > 0 && ones > 0 && bits > 1; i++) {
|
|
117
|
+
bits--;
|
|
118
|
+
if (l[i] === 0) {
|
|
119
|
+
b = b * --zeros / bits;
|
|
120
|
+
} else {
|
|
121
|
+
ind += b;
|
|
122
|
+
b = b * ones-- / bits;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return ind;
|
|
126
|
+
}
|
|
127
|
+
function index_to_comb(ind, ones, bits) {
|
|
128
|
+
let zeros = bits - ones;
|
|
129
|
+
let b = C(bits - 1, ones);
|
|
130
|
+
let l = [];
|
|
131
|
+
let n = bits - 1;
|
|
132
|
+
for (let i = 0; i < n; i++) {
|
|
133
|
+
bits--;
|
|
134
|
+
if (ind < b) {
|
|
135
|
+
l.push(0);
|
|
136
|
+
b = b * --zeros / bits;
|
|
137
|
+
} else {
|
|
138
|
+
l.push(1);
|
|
139
|
+
ind -= b;
|
|
140
|
+
b = b * ones-- / bits;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
l.push(ones);
|
|
144
|
+
return l;
|
|
145
|
+
}
|
|
146
|
+
function compose(A, B) {
|
|
147
|
+
let C2 = [];
|
|
148
|
+
for (let i = 0; i < B.length; i++)
|
|
149
|
+
C2[i] = A[B[i]];
|
|
150
|
+
return C2;
|
|
151
|
+
}
|
|
152
|
+
function compose_o(A, B) {
|
|
153
|
+
let p = compose(A[0], B[0]);
|
|
154
|
+
let o = [];
|
|
155
|
+
let n = B[0].length;
|
|
156
|
+
for (let i = 0; i < n; i++) {
|
|
157
|
+
o[i] = (A[1][B[0][i]] + B[1][i]) % 3;
|
|
158
|
+
}
|
|
159
|
+
return [p, o];
|
|
160
|
+
}
|
|
161
|
+
function permutation_from_cycle(cycle, n) {
|
|
162
|
+
let perm = [];
|
|
163
|
+
for (let i = 0; i < n; i++)
|
|
164
|
+
perm[i] = i;
|
|
165
|
+
for (let i = 0; i < cycle.length; i++) {
|
|
166
|
+
perm[cycle[i]] = cycle[(i + 1) % cycle.length];
|
|
167
|
+
}
|
|
168
|
+
return perm;
|
|
169
|
+
}
|
|
170
|
+
function unsparsify_list(d, n) {
|
|
171
|
+
let l = Array(n).fill(0);
|
|
172
|
+
for (let k in d)
|
|
173
|
+
l[k] = d[k];
|
|
174
|
+
return l;
|
|
175
|
+
}
|
|
176
|
+
var move_U = [
|
|
177
|
+
permutation_from_cycle([0, 1, 2, 3, 4], 20),
|
|
178
|
+
unsparsify_list({}, 20)
|
|
179
|
+
];
|
|
180
|
+
var move_R = [
|
|
181
|
+
permutation_from_cycle([4, 3, 11, 12, 13], 20),
|
|
182
|
+
unsparsify_list({ 4: 2, 3: 1, 11: 1, 12: 1, 13: 1 }, 20)
|
|
183
|
+
];
|
|
184
|
+
var move_F = [
|
|
185
|
+
permutation_from_cycle([3, 2, 9, 10, 11], 20),
|
|
186
|
+
unsparsify_list({ 3: 2, 2: 1, 9: 1, 10: 1, 11: 1 }, 20)
|
|
187
|
+
];
|
|
188
|
+
var move_L = [
|
|
189
|
+
permutation_from_cycle([2, 1, 7, 8, 9], 20),
|
|
190
|
+
unsparsify_list({ 2: 2, 1: 1, 7: 1, 8: 1, 9: 1 }, 20)
|
|
191
|
+
];
|
|
192
|
+
var move_BL = [
|
|
193
|
+
permutation_from_cycle([1, 0, 5, 6, 7], 20),
|
|
194
|
+
unsparsify_list({ 1: 2, 0: 1, 5: 1, 6: 1, 7: 1 }, 20)
|
|
195
|
+
];
|
|
196
|
+
var move_BR = [
|
|
197
|
+
permutation_from_cycle([0, 4, 13, 14, 5], 20),
|
|
198
|
+
unsparsify_list({ 0: 2, 4: 1, 13: 1, 14: 1, 5: 1 }, 20)
|
|
199
|
+
];
|
|
200
|
+
var move_x2 = [
|
|
201
|
+
[15, 16, 17, 18, 19, 10, 9, 8, 7, 6, 5, 14, 13, 12, 11, 0, 1, 2, 3, 4],
|
|
202
|
+
unsparsify_list({}, 20)
|
|
203
|
+
];
|
|
204
|
+
var move_y = [
|
|
205
|
+
[1, 2, 3, 4, 0, 7, 8, 9, 10, 11, 12, 13, 14, 5, 6, 19, 15, 16, 17, 18],
|
|
206
|
+
unsparsify_list({}, 20)
|
|
207
|
+
];
|
|
208
|
+
var moves = [move_U, move_R, move_F, move_L, move_BL, move_BR, move_x2];
|
|
209
|
+
var move_names = ["U", "R", "F", "L", "BL", "BR", "x2"];
|
|
210
|
+
var id = compose_o(move_x2, move_x2);
|
|
211
|
+
var moves_full = [];
|
|
212
|
+
for (let i = 0; i < moves.length; i++) {
|
|
213
|
+
moves_full[i] = [id];
|
|
214
|
+
for (let j = 1; j < 5; j++)
|
|
215
|
+
moves_full[i][j] = compose_o(moves_full[i][j - 1], moves[i]);
|
|
216
|
+
}
|
|
217
|
+
function random_state(randomUintBelow2) {
|
|
218
|
+
let p = [0];
|
|
219
|
+
for (let i = 1; i < 20; i++) {
|
|
220
|
+
let r = randomUintBelow2(i + 1);
|
|
221
|
+
p[i] = p[r];
|
|
222
|
+
p[r] = i;
|
|
223
|
+
}
|
|
224
|
+
if (permutation_parity(p) === 1)
|
|
225
|
+
[p[0], p[1]] = [p[1], p[0]];
|
|
226
|
+
let o = Array(20).fill(0);
|
|
227
|
+
for (let i = 0; i < 19; i++) {
|
|
228
|
+
o[i] = randomUintBelow2(3);
|
|
229
|
+
o[19] += 3 - o[i];
|
|
230
|
+
}
|
|
231
|
+
o[19] %= 3;
|
|
232
|
+
return [p, o];
|
|
233
|
+
}
|
|
234
|
+
function stringify_move_sequence(move_sequence) {
|
|
235
|
+
let suffixes = ["0", "", "2", "2'", "'"];
|
|
236
|
+
let s = move_sequence.map(([m, r]) => move_names[m] + suffixes[r]);
|
|
237
|
+
return s.join(" ");
|
|
238
|
+
}
|
|
239
|
+
function apply_move_sequence(state, move_sequence) {
|
|
240
|
+
for (let [m, r] of move_sequence) {
|
|
241
|
+
for (let i = 0; i < r; i++)
|
|
242
|
+
state = compose_o(state, moves[m]);
|
|
243
|
+
}
|
|
244
|
+
return state;
|
|
245
|
+
}
|
|
246
|
+
function generate_random_state_scramble(randomUintBelow2) {
|
|
247
|
+
return solve(random_state(randomUintBelow2));
|
|
248
|
+
}
|
|
249
|
+
var translation_amounts;
|
|
250
|
+
{
|
|
251
|
+
let A = Math.sin(Math.PI / 5), B = Math.cos(Math.PI / 10);
|
|
252
|
+
let C2 = Math.cos(Math.PI / 5), D = Math.sin(Math.PI / 10);
|
|
253
|
+
translation_amounts = {
|
|
254
|
+
U: [0, 0],
|
|
255
|
+
L: [-A - B, C2 - D],
|
|
256
|
+
F: [0, 2 * C2],
|
|
257
|
+
R: [A + B, C2 - D],
|
|
258
|
+
BR: [B, -1 - D],
|
|
259
|
+
BL: [-B, -1 - D],
|
|
260
|
+
DBR: [2 * A + 2 * B, 0],
|
|
261
|
+
DB: [3 * A + 3 * B, -C2 - D],
|
|
262
|
+
DBL: [4 * A + 4 * B, 0],
|
|
263
|
+
DFL: [3 * A + 4 * B, 1 + C2],
|
|
264
|
+
DFR: [3 * A + 2 * B, 1 + C2],
|
|
265
|
+
D: [3 * A + 3 * B, C2 - D]
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function solve_phase1(state) {
|
|
269
|
+
let p = state[0];
|
|
270
|
+
if (p.slice(15, 20).every((x) => x < 15))
|
|
271
|
+
return [];
|
|
272
|
+
if (p.slice(0, 5).every((x) => x < 15))
|
|
273
|
+
return [[6, 1]];
|
|
274
|
+
let flags = p.map((x) => x >= 15);
|
|
275
|
+
let depth = 0, sol;
|
|
276
|
+
while (sol === void 0) {
|
|
277
|
+
depth++;
|
|
278
|
+
sol = search_phase1(flags, depth, -1);
|
|
279
|
+
}
|
|
280
|
+
sol.push([6, 1]);
|
|
281
|
+
return sol;
|
|
282
|
+
}
|
|
283
|
+
function search_phase1(flags, depth, last) {
|
|
284
|
+
if (depth == 0) {
|
|
285
|
+
if (flags.slice(0, 5).some((x) => x))
|
|
286
|
+
return;
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
for (let move_index = 0; move_index < 6; move_index++) {
|
|
290
|
+
if (move_index === last)
|
|
291
|
+
continue;
|
|
292
|
+
for (let r = 1; r < 5; r++) {
|
|
293
|
+
let new_flags = compose(flags, moves_full[move_index][r][0]);
|
|
294
|
+
let sol = search_phase1(new_flags, depth - 1, move_index);
|
|
295
|
+
if (sol !== void 0)
|
|
296
|
+
return [[move_index, r]].concat(sol);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
function index_phase2(state) {
|
|
302
|
+
let p = state[0].slice(0, 15), o = state[1];
|
|
303
|
+
let index_c = comb_to_index(p.map((x) => +(x >= 15)));
|
|
304
|
+
let index_o = 243 * index_c;
|
|
305
|
+
for (let i = 0, j = 0; i < 15; i++) {
|
|
306
|
+
if (p[i] < 15)
|
|
307
|
+
continue;
|
|
308
|
+
index_o += o[i] * Math.pow(3, j);
|
|
309
|
+
j++;
|
|
310
|
+
}
|
|
311
|
+
let index_p = 0;
|
|
312
|
+
for (let i = 0; i < 5; i++) {
|
|
313
|
+
index_p += p.indexOf(15 + i) * Math.pow(15, i);
|
|
314
|
+
}
|
|
315
|
+
return [index_o, index_p];
|
|
316
|
+
}
|
|
317
|
+
function solve_phase2(state) {
|
|
318
|
+
let mtables = [
|
|
319
|
+
generate_phase23_orientation_mtable(),
|
|
320
|
+
generate_phase23_permutation_mtable()
|
|
321
|
+
];
|
|
322
|
+
let ptables = [
|
|
323
|
+
generate_phase2_orientation_ptable(),
|
|
324
|
+
generate_phase2_permutation_ptable()
|
|
325
|
+
];
|
|
326
|
+
return ida_solve(index_phase2(state), mtables, ptables).concat([[6, 1]]);
|
|
327
|
+
}
|
|
328
|
+
function index_phase3(state) {
|
|
329
|
+
let pieces = [5, 6, 7, 8, 14];
|
|
330
|
+
let p = state[0].slice(0, 15), o = state[1];
|
|
331
|
+
let index_c = comb_to_index(p.map((x) => +(pieces.indexOf(x) !== -1)));
|
|
332
|
+
let index_o = 243 * index_c;
|
|
333
|
+
for (let i = 0, j = 0; i < 15; i++) {
|
|
334
|
+
if (pieces.indexOf(p[i]) === -1)
|
|
335
|
+
continue;
|
|
336
|
+
index_o += o[i] * Math.pow(3, j);
|
|
337
|
+
j++;
|
|
338
|
+
}
|
|
339
|
+
let index_p = 0;
|
|
340
|
+
for (let i = 0; i < 5; i++) {
|
|
341
|
+
index_p += p.indexOf(pieces[i]) * Math.pow(15, i);
|
|
342
|
+
}
|
|
343
|
+
return [index_o, index_p];
|
|
344
|
+
}
|
|
345
|
+
function solve_phase3(state) {
|
|
346
|
+
let mtables = [
|
|
347
|
+
generate_phase23_orientation_mtable(),
|
|
348
|
+
generate_phase23_permutation_mtable()
|
|
349
|
+
];
|
|
350
|
+
let ptables = [
|
|
351
|
+
generate_phase3_orientation_ptable(),
|
|
352
|
+
generate_phase3_permutation_ptable()
|
|
353
|
+
];
|
|
354
|
+
return ida_solve(index_phase3(state), mtables, ptables);
|
|
355
|
+
}
|
|
356
|
+
function index_phase4(state) {
|
|
357
|
+
let p = state[0].slice(0, 14), o = state[1];
|
|
358
|
+
let index_o = 0, perm = [];
|
|
359
|
+
let j = 0;
|
|
360
|
+
for (let i of [0, 1, 2, 3, 4, 9, 10, 11, 12, 13]) {
|
|
361
|
+
if (i !== 13)
|
|
362
|
+
index_o += o[i] * Math.pow(3, j);
|
|
363
|
+
perm[j] = p[i] < 5 ? p[i] : p[i] - 4;
|
|
364
|
+
j++;
|
|
365
|
+
}
|
|
366
|
+
return [index_o, evenpermutation_to_index(perm)];
|
|
367
|
+
}
|
|
368
|
+
function solve_phase4_fast(state) {
|
|
369
|
+
return phase4_ida_solve(index_phase4(state));
|
|
370
|
+
}
|
|
371
|
+
function solve(state) {
|
|
372
|
+
let sol = [];
|
|
373
|
+
for (let solver of [
|
|
374
|
+
solve_phase1,
|
|
375
|
+
solve_phase2,
|
|
376
|
+
solve_phase3,
|
|
377
|
+
solve_phase4_fast
|
|
378
|
+
]) {
|
|
379
|
+
let phase_sol = solver(state);
|
|
380
|
+
state = apply_move_sequence(state, phase_sol);
|
|
381
|
+
sol = sol.concat(phase_sol);
|
|
382
|
+
}
|
|
383
|
+
return sol;
|
|
384
|
+
}
|
|
385
|
+
var tables = {};
|
|
386
|
+
function generate_phase23_orientation_mtable() {
|
|
387
|
+
if (tables.phase23om)
|
|
388
|
+
return tables.phase23om;
|
|
389
|
+
const C15_5 = C(15, 5), THREE = [1, 3, 9, 27, 81, 243];
|
|
390
|
+
let phase23om = Array(C(15, 5) * THREE[5]);
|
|
391
|
+
tables.phase23om = phase23om;
|
|
392
|
+
for (let i = 0; i < C15_5; i++) {
|
|
393
|
+
let comb = index_to_comb(i, 5, 15).concat(Array(5).fill(0));
|
|
394
|
+
let new_comb_indices = [];
|
|
395
|
+
for (let move_index = 0; move_index < 6; move_index++) {
|
|
396
|
+
let new_comb = compose(comb, moves[move_index][0]).slice(0, 15);
|
|
397
|
+
new_comb_indices[move_index] = comb_to_index(new_comb);
|
|
398
|
+
}
|
|
399
|
+
for (let j = 0; j < THREE[5]; j++) {
|
|
400
|
+
phase23om[j + 243 * i] = [];
|
|
401
|
+
let orient_full = [];
|
|
402
|
+
for (let k = 0, l = 0; k < 20; k++) {
|
|
403
|
+
if (comb[k] === 1) {
|
|
404
|
+
orient_full[k] = (j / THREE[l] | 0) % 3;
|
|
405
|
+
l++;
|
|
406
|
+
} else
|
|
407
|
+
orient_full[k] = 99;
|
|
408
|
+
}
|
|
409
|
+
for (let move_index = 0; move_index < 6; move_index++) {
|
|
410
|
+
let move = moves[move_index];
|
|
411
|
+
let new_orient_full = [];
|
|
412
|
+
for (let k = 0; k < 15; k++) {
|
|
413
|
+
new_orient_full[k] = orient_full[move[0][k]] + move[1][k];
|
|
414
|
+
}
|
|
415
|
+
let new_orient = new_orient_full.filter((x) => x < 10);
|
|
416
|
+
let J = 0;
|
|
417
|
+
for (let k = 0; k < 5; k++) {
|
|
418
|
+
J += new_orient[k] % 3 * THREE[k];
|
|
419
|
+
}
|
|
420
|
+
phase23om[j + 243 * i][move_index] = J + 243 * new_comb_indices[move_index];
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return phase23om;
|
|
425
|
+
}
|
|
426
|
+
function generate_phase2_orientation_ptable() {
|
|
427
|
+
if (tables.phase2op)
|
|
428
|
+
return tables.phase2op;
|
|
429
|
+
let mtable = generate_phase23_orientation_mtable();
|
|
430
|
+
return tables.phase2op = bfs(mtable, [243 * 3002]);
|
|
431
|
+
}
|
|
432
|
+
function generate_phase3_orientation_ptable() {
|
|
433
|
+
if (tables.phase3op)
|
|
434
|
+
return tables.phase3op;
|
|
435
|
+
let mtable = generate_phase23_orientation_mtable();
|
|
436
|
+
return tables.phase3op = bfs(mtable, [243 * 246]);
|
|
437
|
+
}
|
|
438
|
+
function generate_phase23_permutation_mtable() {
|
|
439
|
+
if (tables.phase23pm)
|
|
440
|
+
return tables.phase23pm;
|
|
441
|
+
const FIFTEEN = [
|
|
442
|
+
1,
|
|
443
|
+
15,
|
|
444
|
+
225,
|
|
445
|
+
Math.pow(15, 3),
|
|
446
|
+
Math.pow(15, 4),
|
|
447
|
+
Math.pow(15, 5)
|
|
448
|
+
];
|
|
449
|
+
let phase23pm = Array(FIFTEEN[5]);
|
|
450
|
+
let single = Array(15);
|
|
451
|
+
for (let i = 0; i < 15; i++) {
|
|
452
|
+
single[i] = Array(6);
|
|
453
|
+
for (let move_index = 0; move_index < 6; move_index++) {
|
|
454
|
+
single[i][move_index] = moves[move_index][0].indexOf(i);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
let locations = [0, 0, 0, 0, 0];
|
|
458
|
+
for (let ind = 0; ind < FIFTEEN[5]; ind++) {
|
|
459
|
+
phase23pm[ind] = Array(6);
|
|
460
|
+
for (let move_index = 0; move_index < 6; move_index++) {
|
|
461
|
+
let new_ind = 0;
|
|
462
|
+
for (let i = 0; i < 5; i++) {
|
|
463
|
+
new_ind += single[locations[i]][move_index] * FIFTEEN[i];
|
|
464
|
+
}
|
|
465
|
+
phase23pm[ind][move_index] = new_ind;
|
|
466
|
+
}
|
|
467
|
+
locations[0]++;
|
|
468
|
+
for (let i = 0; i < 4; i++) {
|
|
469
|
+
if (locations[i] === 15) {
|
|
470
|
+
locations[i] = 0;
|
|
471
|
+
locations[i + 1]++;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return tables.phase23pm = phase23pm;
|
|
476
|
+
}
|
|
477
|
+
function generate_phase2_permutation_ptable() {
|
|
478
|
+
if (tables.phase2pp)
|
|
479
|
+
return tables.phase2pp;
|
|
480
|
+
let mtable = generate_phase23_permutation_mtable();
|
|
481
|
+
return tables.phase2pp = bfs(mtable, [213090]);
|
|
482
|
+
}
|
|
483
|
+
function generate_phase3_permutation_ptable() {
|
|
484
|
+
if (tables.phase3pp)
|
|
485
|
+
return tables.phase3pp;
|
|
486
|
+
let mtable = generate_phase23_permutation_mtable();
|
|
487
|
+
return tables.phase3pp = bfs(mtable, [737420]);
|
|
488
|
+
}
|
|
489
|
+
function generate_phase4_orientation_mtable() {
|
|
490
|
+
if (tables.phase4om)
|
|
491
|
+
return tables.phase4om;
|
|
492
|
+
const THREE = [1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049];
|
|
493
|
+
let mtable = Array(THREE[9]);
|
|
494
|
+
for (let i = 0; i < THREE[9]; i++) {
|
|
495
|
+
let o = Array(14).fill(0);
|
|
496
|
+
for (let j = 0; j < 9; j++) {
|
|
497
|
+
let J = j < 5 ? j : j + 4;
|
|
498
|
+
o[J] = (i / THREE[j] | 0) % 3;
|
|
499
|
+
o[13] -= o[J];
|
|
500
|
+
}
|
|
501
|
+
o[13] = (o[13] + 999) % 3;
|
|
502
|
+
mtable[i] = [];
|
|
503
|
+
for (let move_index = 0; move_index < 3; move_index++) {
|
|
504
|
+
let move = moves[move_index];
|
|
505
|
+
let new_o = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13].map((i2) => o[move[0][i2]] + move[1][i2]);
|
|
506
|
+
let new_i = 0;
|
|
507
|
+
for (let j = 0; j < 9; j++)
|
|
508
|
+
new_i += new_o[j] % 3 * THREE[j];
|
|
509
|
+
mtable[i][move_index] = new_i;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return tables.phase4om = mtable;
|
|
513
|
+
}
|
|
514
|
+
function generate_phase4_permutation_mtable() {
|
|
515
|
+
if (tables.phase4pm)
|
|
516
|
+
return tables.phase4pm;
|
|
517
|
+
const HALFFACT10 = factorial(10) / 2, n = 10;
|
|
518
|
+
let pre = [0, 1, 2, 3, 4, -1, -1, -1, -1, 5, 6, 7, 8, 9];
|
|
519
|
+
let post = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13];
|
|
520
|
+
let move_permutations = [
|
|
521
|
+
compose(pre, compose(move_U[0], post)),
|
|
522
|
+
compose(pre, compose(move_R[0], post)),
|
|
523
|
+
compose(pre, compose(move_F[0], post))
|
|
524
|
+
];
|
|
525
|
+
let mtable = Array(HALFFACT10);
|
|
526
|
+
let perm = Array(10);
|
|
527
|
+
for (let i = 0; i < HALFFACT10; i++) {
|
|
528
|
+
index_to_evenpermutation10(i, perm);
|
|
529
|
+
mtable[i] = [];
|
|
530
|
+
for (let move_index = 0; move_index < 3; move_index++) {
|
|
531
|
+
let new_perm = compose(perm, move_permutations[move_index]);
|
|
532
|
+
mtable[i][move_index] = evenpermutation10_to_index(new_perm);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return tables.phase4pm = mtable;
|
|
536
|
+
}
|
|
537
|
+
function generate_phase4_orientation_ptable() {
|
|
538
|
+
if (tables.phase4op)
|
|
539
|
+
return tables.phase4op;
|
|
540
|
+
let mtable = generate_phase4_orientation_mtable();
|
|
541
|
+
return tables.phase4op = bfs(mtable, [0]);
|
|
542
|
+
}
|
|
543
|
+
function generate_phase4_permutation_ptable() {
|
|
544
|
+
if (tables.phase4pp)
|
|
545
|
+
return tables.phase4pp;
|
|
546
|
+
let mtable = generate_phase4_permutation_mtable();
|
|
547
|
+
return tables.phase4pp = bfs(mtable, [0]);
|
|
548
|
+
}
|
|
549
|
+
function generate_phase4_near_ptable_list(threshold) {
|
|
550
|
+
if (tables.phase4np_list && tables.phase4np_list.threshold === threshold)
|
|
551
|
+
return tables.phase4np_list;
|
|
552
|
+
let mtables = [
|
|
553
|
+
generate_phase4_orientation_mtable(),
|
|
554
|
+
generate_phase4_permutation_mtable()
|
|
555
|
+
];
|
|
556
|
+
let base = Math.pow(3, 9);
|
|
557
|
+
let states = [0];
|
|
558
|
+
populate(threshold, [0, 0], -1);
|
|
559
|
+
function populate(depth, state, last2) {
|
|
560
|
+
states.push(state[0] + base * state[1]);
|
|
561
|
+
if (depth === 0)
|
|
562
|
+
return;
|
|
563
|
+
let new_state = [];
|
|
564
|
+
for (let move_index = 0; move_index < 3; move_index++) {
|
|
565
|
+
if (move_index === last2)
|
|
566
|
+
continue;
|
|
567
|
+
new_state[0] = state[0];
|
|
568
|
+
new_state[1] = state[1];
|
|
569
|
+
for (let r = 1; r < 5; r++) {
|
|
570
|
+
new_state[0] = mtables[0][new_state[0]][move_index];
|
|
571
|
+
new_state[1] = mtables[1][new_state[1]][move_index];
|
|
572
|
+
populate(depth - 1, new_state, move_index);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
states.sort((x, y) => x - y);
|
|
578
|
+
let unique_states = [], last = -1;
|
|
579
|
+
for (let state of states)
|
|
580
|
+
if (state !== last)
|
|
581
|
+
unique_states.push(last = state);
|
|
582
|
+
unique_states.threshold = threshold;
|
|
583
|
+
return tables.phase4np_list = unique_states;
|
|
584
|
+
}
|
|
585
|
+
function binary_search(A, x) {
|
|
586
|
+
let lo = 0, hi = A.length - 1;
|
|
587
|
+
while (hi - lo > 1) {
|
|
588
|
+
let mid = lo + hi >> 1;
|
|
589
|
+
if (x > A[mid])
|
|
590
|
+
lo = mid + 1;
|
|
591
|
+
else
|
|
592
|
+
hi = mid;
|
|
593
|
+
}
|
|
594
|
+
return x === A[lo] || x === A[hi];
|
|
595
|
+
}
|
|
596
|
+
function bfs(mtable, goal_states) {
|
|
597
|
+
let N = mtable.length;
|
|
598
|
+
let nmoves = mtable[0].length;
|
|
599
|
+
let ptable = Array(N).fill(-1);
|
|
600
|
+
for (let state of goal_states) {
|
|
601
|
+
ptable[state] = 0;
|
|
602
|
+
}
|
|
603
|
+
let depth = 0;
|
|
604
|
+
let done = false;
|
|
605
|
+
while (!done) {
|
|
606
|
+
done = true;
|
|
607
|
+
for (let state = 0; state < N; state++) {
|
|
608
|
+
if (ptable[state] !== depth) {
|
|
609
|
+
continue;
|
|
610
|
+
}
|
|
611
|
+
for (let move_index = 0; move_index < nmoves; move_index++) {
|
|
612
|
+
let new_state = mtable[state][move_index];
|
|
613
|
+
while (new_state !== state) {
|
|
614
|
+
if (ptable[new_state] === -1) {
|
|
615
|
+
done = false;
|
|
616
|
+
ptable[new_state] = depth + 1;
|
|
617
|
+
}
|
|
618
|
+
new_state = mtable[new_state][move_index];
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
depth++;
|
|
623
|
+
}
|
|
624
|
+
return ptable;
|
|
625
|
+
}
|
|
626
|
+
function ida_solve(indices, mtables, ptables) {
|
|
627
|
+
let ncoords = indices.length;
|
|
628
|
+
let bound = 0;
|
|
629
|
+
for (let i = 0; i < ncoords; i++)
|
|
630
|
+
bound = Math.max(bound, ptables[i][indices[i]]);
|
|
631
|
+
while (true) {
|
|
632
|
+
let path = ida_search(indices, mtables, ptables, bound, -1);
|
|
633
|
+
if (path !== void 0)
|
|
634
|
+
return path;
|
|
635
|
+
bound++;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
function ida_search(indices, mtables, ptables, bound, last) {
|
|
639
|
+
let ncoords = indices.length;
|
|
640
|
+
let nmoves = mtables[0][0].length;
|
|
641
|
+
let heuristic = 0;
|
|
642
|
+
for (let i = 0; i < ncoords; i++)
|
|
643
|
+
heuristic = Math.max(heuristic, ptables[i][indices[i]]);
|
|
644
|
+
if (heuristic > bound)
|
|
645
|
+
return;
|
|
646
|
+
if (bound === 0 || heuristic === 0)
|
|
647
|
+
return [];
|
|
648
|
+
for (let m = 0; m < nmoves; m++) {
|
|
649
|
+
if (m === last)
|
|
650
|
+
continue;
|
|
651
|
+
let new_indices = indices.slice();
|
|
652
|
+
for (let c = 0; c < ncoords; c++)
|
|
653
|
+
new_indices[c] = mtables[c][indices[c]][m];
|
|
654
|
+
let r = 1;
|
|
655
|
+
while (indices.some((_, i) => indices[i] != new_indices[i])) {
|
|
656
|
+
let subpath = ida_search(new_indices, mtables, ptables, bound - 1, m);
|
|
657
|
+
if (subpath !== void 0)
|
|
658
|
+
return [[m, r]].concat(subpath);
|
|
659
|
+
for (let c = 0; c < ncoords; c++) {
|
|
660
|
+
new_indices[c] = mtables[c][new_indices[c]][m];
|
|
661
|
+
}
|
|
662
|
+
r++;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
function phase4_ida_solve(indices) {
|
|
668
|
+
let mtable_o = generate_phase4_orientation_mtable();
|
|
669
|
+
let mtable_p = generate_phase4_permutation_mtable();
|
|
670
|
+
let ptable_o = generate_phase4_orientation_ptable();
|
|
671
|
+
let ptable_p = generate_phase4_permutation_ptable();
|
|
672
|
+
let ptable_n = generate_phase4_near_ptable_list(PHASE4_THRESHOLD);
|
|
673
|
+
let bound = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);
|
|
674
|
+
while (true) {
|
|
675
|
+
let path = phase4_ida_search(indices, bound, -1, mtable_o, mtable_p, ptable_o, ptable_p, ptable_n);
|
|
676
|
+
if (path !== void 0)
|
|
677
|
+
return path;
|
|
678
|
+
bound++;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
function phase4_ida_search(indices, bound, last, mtable_o, mtable_p, ptable_o, ptable_p, ptable_n) {
|
|
682
|
+
let heuristic = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);
|
|
683
|
+
if (heuristic > bound)
|
|
684
|
+
return;
|
|
685
|
+
if (heuristic <= PHASE4_THRESHOLD && !binary_search(ptable_n, indices[0] + 19683 * indices[1]))
|
|
686
|
+
heuristic = PHASE4_THRESHOLD + 1;
|
|
687
|
+
if (heuristic > bound)
|
|
688
|
+
return;
|
|
689
|
+
if (bound === 0 || heuristic === 0)
|
|
690
|
+
return [];
|
|
691
|
+
for (let m = 0; m < 3; m++) {
|
|
692
|
+
if (m === last)
|
|
693
|
+
continue;
|
|
694
|
+
let new_indices = indices.slice();
|
|
695
|
+
for (let r = 1; r < 5; r++) {
|
|
696
|
+
new_indices[0] = mtable_o[new_indices[0]][m];
|
|
697
|
+
new_indices[1] = mtable_p[new_indices[1]][m];
|
|
698
|
+
let subpath = phase4_ida_search(new_indices, bound - 1, m, mtable_o, mtable_p, ptable_o, ptable_p, ptable_n);
|
|
699
|
+
if (subpath !== void 0)
|
|
700
|
+
return [[m, r]].concat(subpath);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
var randomUintBelow = randomUIntBelowFactory();
|
|
706
|
+
async function getRandomKilominxScramble() {
|
|
707
|
+
return new Alg(stringify_move_sequence(generate_random_state_scramble(await randomUintBelow)));
|
|
708
|
+
}
|
|
709
|
+
getRandomKilominxScramble().then((alg) => alg.log());
|
|
710
|
+
export {
|
|
711
|
+
getRandomKilominxScramble
|
|
712
|
+
};
|
|
713
|
+
//# sourceMappingURL=kilosolver-N6JM5PUY.js.map
|