cubing 0.24.7 → 0.25.3
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 +14 -5
- package/dist/esm/{2x2x2.sgs.json-KBCXHIZP.js → 2x2x2.sgs.json-MMXKAIKZ.js} +2 -2
- package/dist/esm/{2x2x2.sgs.json-KBCXHIZP.js.map → 2x2x2.sgs.json-MMXKAIKZ.js.map} +0 -0
- package/dist/esm/{3d-dynamic-inside-IIG5EJZP.js → 3d-dynamic-N4H7XJWX.js} +28 -26
- package/dist/esm/3d-dynamic-N4H7XJWX.js.map +7 -0
- package/dist/esm/{gwt-B7CBESZR.js → 3x3x3-min2phase-FPRJ5PCJ.js} +2 -2
- package/dist/esm/{gwt-B7CBESZR.js.map → 3x3x3-min2phase-FPRJ5PCJ.js.map} +1 -1
- package/dist/esm/{scramble_444-ZFKBLRUE.js → 444-solver-PV2GUWP2.js} +5 -5
- package/dist/esm/{scramble_444-ZFKBLRUE.js.map → 444-solver-PV2GUWP2.js.map} +1 -1
- package/dist/esm/bluetooth/index.js +1 -1
- package/dist/esm/{chunk-DMCRTYR4.js → chunk-5GJ5C7NZ.js} +31 -23
- package/dist/esm/chunk-5GJ5C7NZ.js.map +7 -0
- package/dist/esm/chunk-BEXHMXCT.js +9 -0
- package/dist/esm/chunk-BEXHMXCT.js.map +7 -0
- package/dist/esm/{chunk-KRL5KQQK.js → chunk-F5WNHV7V.js} +2 -2
- package/dist/esm/{chunk-KRL5KQQK.js.map → chunk-F5WNHV7V.js.map} +2 -2
- package/dist/esm/chunk-IVQ4ITE2.js +33 -0
- package/dist/esm/chunk-IVQ4ITE2.js.map +7 -0
- package/dist/esm/{chunk-T5KQKRR3.js → chunk-KJZNEDOV.js} +2 -2
- package/dist/esm/{chunk-T5KQKRR3.js.map → chunk-KJZNEDOV.js.map} +0 -0
- package/dist/esm/{chunk-MVJPIWT7.js → chunk-LMZIKLXW.js} +84 -29
- package/dist/esm/chunk-LMZIKLXW.js.map +7 -0
- package/dist/esm/{chunk-UOI5KUW4.js → chunk-NGA3FW7U.js} +4 -4
- package/dist/esm/{chunk-UOI5KUW4.js.map → chunk-NGA3FW7U.js.map} +2 -2
- package/dist/esm/{chunk-OOIEAACO.js → chunk-OH2FLVZM.js} +7 -2
- package/dist/esm/{chunk-OOIEAACO.js.map → chunk-OH2FLVZM.js.map} +2 -2
- package/dist/esm/{chunk-QMZKTP7F.js → chunk-QEDC2QTN.js} +2 -2
- package/dist/esm/{chunk-QMZKTP7F.js.map → chunk-QEDC2QTN.js.map} +0 -0
- package/dist/esm/{chunk-37EHU3GZ.js → chunk-RENZB7QN.js} +4 -2
- package/dist/esm/chunk-RENZB7QN.js.map +7 -0
- package/dist/esm/{chunk-V7BTHDW3.js → chunk-UNROETIO.js} +2 -2
- package/dist/esm/{chunk-V7BTHDW3.js.map → chunk-UNROETIO.js.map} +0 -0
- package/dist/esm/chunk-WDJDRVZZ.js +28 -0
- package/dist/esm/chunk-WDJDRVZZ.js.map +7 -0
- package/dist/esm/fto-solver-HI6NIV74.js +1537 -0
- package/dist/esm/fto-solver-HI6NIV74.js.map +7 -0
- package/dist/esm/{fto.sgs.json-USV4WNQJ.js → fto.dynamic-UHH65HEC.js} +8 -3
- package/dist/esm/fto.dynamic-UHH65HEC.js.map +7 -0
- package/dist/esm/kilominx.kpuzzle.svg-7XJBOKFU.js +83 -0
- package/dist/esm/kilominx.kpuzzle.svg-7XJBOKFU.js.map +7 -0
- package/dist/esm/master_tetraminx-solver-KBQJGW4A.js +729 -0
- package/dist/esm/master_tetraminx-solver-KBQJGW4A.js.map +7 -0
- package/dist/esm/{megaminx.sgs.json-KKR4VPHV.js → megaminx.sgs.json-3ZEDZMWF.js} +3 -3
- package/dist/esm/{megaminx.sgs.json-KKR4VPHV.js.map → megaminx.sgs.json-3ZEDZMWF.js.map} +0 -0
- package/dist/esm/puzzle-geometry/index.js +1 -1
- package/dist/esm/puzzles/index.js +3 -1
- package/dist/esm/{pyraminx.sgs.json-HMKDN3ZT.js → pyraminx.sgs.json-5IA2F65U.js} +3 -3
- package/dist/esm/{pyraminx.sgs.json-HMKDN3ZT.js.map → pyraminx.sgs.json-5IA2F65U.js.map} +0 -0
- package/dist/esm/scramble/index.js +6 -4
- package/dist/esm/search/index.js +6 -4
- package/dist/esm/{entry-FHL2XSAP.js → search-worker-js-entry-AXEFSQVG.js} +49 -66
- package/dist/esm/search-worker-js-entry-AXEFSQVG.js.map +7 -0
- package/dist/esm/search-worker-ts-entry-OOL7WATY.js +22 -0
- package/dist/esm/search-worker-ts-entry-OOL7WATY.js.map +7 -0
- package/dist/esm/{skewb.sgs.json-MWONK6HT.js → skewb.sgs.json-6NDFH63U.js} +3 -3
- package/dist/esm/{skewb.sgs.json-MWONK6HT.js.map → skewb.sgs.json-6NDFH63U.js.map} +0 -0
- package/dist/esm/{scramble_sq1-PQ2AYBFW.js → sq1-solver-P3IWWET7.js} +3 -3
- package/dist/esm/{scramble_sq1-PQ2AYBFW.js.map → sq1-solver-P3IWWET7.js.map} +1 -1
- package/dist/esm/twisty/index.js +55 -12
- package/dist/esm/twisty/index.js.map +3 -3
- package/dist/esm/worker-inside-generated-string-CSXWVF2Y.js +3522 -0
- package/dist/esm/worker-inside-generated-string-CSXWVF2Y.js.map +7 -0
- package/dist/types/puzzles/async/async-pg3d.d.ts +2 -0
- package/dist/types/puzzles/events.d.ts +8 -0
- package/dist/types/puzzles/implementations/kilominx/index.d.ts +2 -0
- package/dist/types/puzzles/implementations/kilominx/kilominx.kpuzzle.svg.d.ts +1 -0
- package/dist/types/puzzles/index.d.ts +6 -11
- package/dist/types/{esm-test-worker.d.ts → search/inside/search-worker-js-entry.d.ts} +0 -0
- package/dist/types/search/inside/{module-entry-path-getter.d.ts → search-worker-ts-entry-path-getter.d.ts} +0 -0
- package/dist/types/search/inside/{module-entry.d.ts → search-worker-ts-entry.d.ts} +0 -0
- package/dist/types/search/inside/solve/puzzles/fto.d.ts +1 -1
- package/dist/types/search/inside/solve/puzzles/{fto.sgs.json.d.ts → fto.dynamic.d.ts} +1 -0
- package/dist/types/search/inside/solve/puzzles/master_tetraminx.d.ts +2 -0
- package/dist/types/search/inside/worker-guard.d.ts +3 -0
- package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
- package/dist/types/twisty/heavy-code-imports/3d.d.ts +1 -1
- package/dist/types/twisty/heavy-code-imports/dynamic-entries/{3d-dynamic-inside.d.ts → 3d-dynamic.d.ts} +0 -0
- package/dist/types/twisty/model/TwistyPlayerModel.d.ts +4 -0
- package/dist/types/twisty/model/props/TwistyPropDebugger.d.ts +1 -2
- package/dist/types/twisty/model/props/general/ArbitraryStringProp.d.ts +4 -0
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.d.ts +1 -0
- package/dist/types/twisty/views/TwistyPlayer.d.ts +6 -0
- package/dist/types/twisty/views/TwistyPlayerSettable.d.ts +6 -0
- package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +1 -1
- package/dist/types/vendor/comlink-everywhere/inside/index.d.ts +4 -1
- package/dist/types/vendor/comlink-everywhere/node-adapter.d.ts +6 -0
- package/dist/types/vendor/comlink-everywhere/outside/index.d.ts +4 -2
- package/dist/types/vendor/cstimer/src/js/scramble/{scramble_444.d.ts → 444-solver.d.ts} +0 -0
- package/dist/types/vendor/min2phase/{gwt.d.ts → 3x3x3-min2phase.d.ts} +0 -0
- package/dist/types/vendor/sq12phase/{scramble_sq1.d.ts → sq1-solver.d.ts} +0 -0
- package/dist/types/vendor/xyzzy/fto-solver-original.d.ts +203 -0
- package/dist/types/vendor/xyzzy/fto-solver.d.ts +1 -0
- package/dist/types/vendor/xyzzy/kilosolver.d.ts +140 -0
- package/dist/types/vendor/xyzzy/master_tetraminx-solver.d.ts +1 -0
- package/dist/types/vendor/xyzzy/rediscrambler.d.ts +94 -0
- package/package.json +3 -3
- package/dist/esm/3d-dynamic-inside-IIG5EJZP.js.map +0 -7
- package/dist/esm/chunk-37EHU3GZ.js.map +0 -7
- package/dist/esm/chunk-BJIOROQC.js +0 -18
- package/dist/esm/chunk-BJIOROQC.js.map +0 -7
- package/dist/esm/chunk-DMCRTYR4.js.map +0 -7
- package/dist/esm/chunk-MVJPIWT7.js.map +0 -7
- package/dist/esm/entry-FHL2XSAP.js.map +0 -7
- package/dist/esm/esm-test-worker.js +0 -15
- package/dist/esm/esm-test-worker.js.map +0 -7
- package/dist/esm/fto.sgs.json-USV4WNQJ.js.map +0 -7
- package/dist/esm/module-entry-TKJ6ZAZB.js +0 -18
- package/dist/esm/module-entry-TKJ6ZAZB.js.map +0 -7
- package/dist/esm/node-SP4L2AKI.js +0 -12
- package/dist/esm/node-SP4L2AKI.js.map +0 -7
- package/dist/esm/node-W3AD4HBK.js +0 -39
- package/dist/esm/node-W3AD4HBK.js.map +0 -7
- package/dist/esm/worker-inside-generated-string-XYHIVIPG.js +0 -3447
- package/dist/esm/worker-inside-generated-string-XYHIVIPG.js.map +0 -7
- package/dist/types/search/esm-test-worker.d.ts +0 -3
- package/dist/types/search/inside/entry.d.ts +0 -1
- package/dist/types/vendor/comlink-everywhere/inside/node.d.ts +0 -1
- package/dist/types/vendor/comlink-everywhere/outside/node.d.ts +0 -2
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
import {
|
|
2
|
+
randomUIntBelowFactory
|
|
3
|
+
} from "./chunk-RENZB7QN.js";
|
|
4
|
+
import "./chunk-WO2AXYFE.js";
|
|
5
|
+
|
|
6
|
+
// src/cubing/vendor/xyzzy/master_tetraminx-solver.js
|
|
7
|
+
"use strict";
|
|
8
|
+
function factorial(n) {
|
|
9
|
+
if (n < 2)
|
|
10
|
+
return n;
|
|
11
|
+
let f = 1;
|
|
12
|
+
for (let i = 2; i <= n; i++)
|
|
13
|
+
f *= i;
|
|
14
|
+
return f;
|
|
15
|
+
}
|
|
16
|
+
function identity_permutation(n) {
|
|
17
|
+
let a = Array(n);
|
|
18
|
+
for (let i = 0; i < n; i++) {
|
|
19
|
+
a[i] = i;
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
}
|
|
23
|
+
function permutation_to_index(perm) {
|
|
24
|
+
perm = perm.slice();
|
|
25
|
+
let n = perm.length;
|
|
26
|
+
let f = factorial(n - 1);
|
|
27
|
+
let ind = 0;
|
|
28
|
+
while (n > 1) {
|
|
29
|
+
n--;
|
|
30
|
+
let e = perm[0];
|
|
31
|
+
ind += e * f;
|
|
32
|
+
for (let i = 0; i < n; i++) {
|
|
33
|
+
let x = perm[i + 1];
|
|
34
|
+
perm[i] = x - (x > e);
|
|
35
|
+
}
|
|
36
|
+
f /= n;
|
|
37
|
+
}
|
|
38
|
+
return ind;
|
|
39
|
+
}
|
|
40
|
+
function index_to_evenpermutation(ind, n) {
|
|
41
|
+
let perm = [];
|
|
42
|
+
let f = factorial(n - 1) / 2;
|
|
43
|
+
let parity = 0;
|
|
44
|
+
for (let i = 0; i < n - 1; i++) {
|
|
45
|
+
perm[i] = ind / f | 0;
|
|
46
|
+
ind %= f;
|
|
47
|
+
f /= n - 1 - i;
|
|
48
|
+
}
|
|
49
|
+
perm[n - 1] = 0;
|
|
50
|
+
for (let i = n - 2; i >= 0; i--) {
|
|
51
|
+
for (let j = i + 1; j < n; j++) {
|
|
52
|
+
if (perm[j] >= perm[i])
|
|
53
|
+
perm[j]++;
|
|
54
|
+
else
|
|
55
|
+
parity ^= 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (parity === 1)
|
|
59
|
+
[perm[n - 2], perm[n - 1]] = [perm[n - 1], perm[n - 2]];
|
|
60
|
+
return perm;
|
|
61
|
+
}
|
|
62
|
+
function evenpermutation_to_index(perm) {
|
|
63
|
+
return permutation_to_index(perm) >> 1;
|
|
64
|
+
}
|
|
65
|
+
var [evenpermutation12_to_index, index_to_evenpermutation12] = (() => {
|
|
66
|
+
let index_in_set_bits = new Int8Array(4096 * 12);
|
|
67
|
+
let look_up_set_bits = new Int8Array(4096 * 12);
|
|
68
|
+
for (let i = 0; i < 4096; i++) {
|
|
69
|
+
for (let j = 0, counter = 0; j < 12; j++) {
|
|
70
|
+
if ((i >>> j & 1) === 0) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
index_in_set_bits[j << 12 | i] = counter;
|
|
74
|
+
look_up_set_bits[counter << 12 | i] = j;
|
|
75
|
+
counter++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function evenpermutation12_to_index2(perm) {
|
|
79
|
+
let unused = 4095;
|
|
80
|
+
let f = 19958400;
|
|
81
|
+
let ind = 0;
|
|
82
|
+
for (let i = 0; i < 10; i++) {
|
|
83
|
+
let v = perm[i];
|
|
84
|
+
ind += index_in_set_bits[unused | v << 12] * f;
|
|
85
|
+
unused &= ~(1 << v);
|
|
86
|
+
f /= 11 - i;
|
|
87
|
+
}
|
|
88
|
+
return ind;
|
|
89
|
+
}
|
|
90
|
+
function index_to_evenpermutation122(ind, perm) {
|
|
91
|
+
let unused = 4095;
|
|
92
|
+
let f = 19958400;
|
|
93
|
+
let parity = 0;
|
|
94
|
+
for (let i = 0; i < 10; i++) {
|
|
95
|
+
let a = ind / f | 0;
|
|
96
|
+
ind -= a * f;
|
|
97
|
+
parity ^= a & 1;
|
|
98
|
+
let v = look_up_set_bits[unused | a << 12];
|
|
99
|
+
perm[i] = v;
|
|
100
|
+
unused &= ~(1 << v);
|
|
101
|
+
f /= 11 - i;
|
|
102
|
+
}
|
|
103
|
+
perm[10] = look_up_set_bits[unused | parity << 12];
|
|
104
|
+
perm[11] = look_up_set_bits[unused | (parity ^ 1) << 12];
|
|
105
|
+
return perm;
|
|
106
|
+
}
|
|
107
|
+
return [evenpermutation12_to_index2, index_to_evenpermutation122];
|
|
108
|
+
})();
|
|
109
|
+
function compose(A, B) {
|
|
110
|
+
let C = [];
|
|
111
|
+
for (let i = 0; i < B.length; i++)
|
|
112
|
+
C[i] = A[B[i]];
|
|
113
|
+
return C;
|
|
114
|
+
}
|
|
115
|
+
function invert(perm) {
|
|
116
|
+
let inv = [];
|
|
117
|
+
for (let i = 0; i < perm.length; i++) {
|
|
118
|
+
inv[perm[i]] = i;
|
|
119
|
+
}
|
|
120
|
+
return inv;
|
|
121
|
+
}
|
|
122
|
+
function permutation_from_cycle(cycle, n) {
|
|
123
|
+
let perm = [];
|
|
124
|
+
for (let i = 0; i < n; i++)
|
|
125
|
+
perm[i] = i;
|
|
126
|
+
for (let i = 0; i < cycle.length; i++) {
|
|
127
|
+
perm[cycle[i]] = cycle[(i + 1) % cycle.length];
|
|
128
|
+
}
|
|
129
|
+
return perm;
|
|
130
|
+
}
|
|
131
|
+
function permutation_from_cycles(cycles, n) {
|
|
132
|
+
if (cycles.length === 0) {
|
|
133
|
+
return identity_permutation(n);
|
|
134
|
+
}
|
|
135
|
+
return cycles.map((cycle) => permutation_from_cycle(cycle, n)).reduce(compose);
|
|
136
|
+
}
|
|
137
|
+
function compose_state(state1, state2) {
|
|
138
|
+
let co = Array(4);
|
|
139
|
+
for (let i = 0; i < 4; i++) {
|
|
140
|
+
co[i] = (state1.co[i] + state2.co[i]) % 3;
|
|
141
|
+
}
|
|
142
|
+
let mp = compose(state1.mp, state2.mp);
|
|
143
|
+
let wp = compose(state1.wp, state2.wp);
|
|
144
|
+
let cp = compose(state1.cp, state2.cp);
|
|
145
|
+
return { co, mp, wp, cp };
|
|
146
|
+
}
|
|
147
|
+
var solved = {
|
|
148
|
+
co: [0, 0, 0, 0],
|
|
149
|
+
mp: identity_permutation(12),
|
|
150
|
+
wp: identity_permutation(12),
|
|
151
|
+
cp: [0, 1, 2, 3]
|
|
152
|
+
};
|
|
153
|
+
var move_U = {
|
|
154
|
+
co: [2, 0, 0, 0],
|
|
155
|
+
mp: identity_permutation(12),
|
|
156
|
+
wp: permutation_from_cycle([1, 9, 11], 12),
|
|
157
|
+
cp: [0, 1, 2, 3]
|
|
158
|
+
};
|
|
159
|
+
var move_L = {
|
|
160
|
+
co: [0, 2, 0, 0],
|
|
161
|
+
mp: identity_permutation(12),
|
|
162
|
+
wp: permutation_from_cycle([0, 7, 2], 12),
|
|
163
|
+
cp: [0, 1, 2, 3]
|
|
164
|
+
};
|
|
165
|
+
var move_R = {
|
|
166
|
+
co: [0, 0, 2, 0],
|
|
167
|
+
mp: identity_permutation(12),
|
|
168
|
+
wp: permutation_from_cycle([3, 6, 10], 12),
|
|
169
|
+
cp: [0, 1, 2, 3]
|
|
170
|
+
};
|
|
171
|
+
var move_B = {
|
|
172
|
+
co: [0, 0, 0, 2],
|
|
173
|
+
mp: identity_permutation(12),
|
|
174
|
+
wp: permutation_from_cycle([4, 8, 5], 12),
|
|
175
|
+
cp: [0, 1, 2, 3]
|
|
176
|
+
};
|
|
177
|
+
var move_Uw = {
|
|
178
|
+
co: [2, 0, 0, 0],
|
|
179
|
+
mp: permutation_from_cycles([
|
|
180
|
+
[1, 9, 11],
|
|
181
|
+
[7, 3, 5]
|
|
182
|
+
], 12),
|
|
183
|
+
wp: permutation_from_cycles([
|
|
184
|
+
[1, 9, 11],
|
|
185
|
+
[7, 3, 5]
|
|
186
|
+
], 12),
|
|
187
|
+
cp: [0, 2, 3, 1]
|
|
188
|
+
};
|
|
189
|
+
var move_Lw = {
|
|
190
|
+
co: [0, 2, 0, 0],
|
|
191
|
+
mp: permutation_from_cycles([
|
|
192
|
+
[0, 7, 2],
|
|
193
|
+
[6, 1, 8]
|
|
194
|
+
], 12),
|
|
195
|
+
wp: permutation_from_cycles([
|
|
196
|
+
[0, 7, 2],
|
|
197
|
+
[6, 1, 8]
|
|
198
|
+
], 12),
|
|
199
|
+
cp: [3, 1, 0, 2]
|
|
200
|
+
};
|
|
201
|
+
var move_Rw = {
|
|
202
|
+
co: [0, 0, 2, 0],
|
|
203
|
+
mp: permutation_from_cycles([
|
|
204
|
+
[3, 6, 10],
|
|
205
|
+
[9, 0, 4]
|
|
206
|
+
], 12),
|
|
207
|
+
wp: permutation_from_cycles([
|
|
208
|
+
[3, 6, 10],
|
|
209
|
+
[9, 0, 4]
|
|
210
|
+
], 12),
|
|
211
|
+
cp: [1, 3, 2, 0]
|
|
212
|
+
};
|
|
213
|
+
var move_Bw = {
|
|
214
|
+
co: [0, 0, 0, 2],
|
|
215
|
+
mp: permutation_from_cycles([
|
|
216
|
+
[4, 8, 5],
|
|
217
|
+
[10, 2, 11]
|
|
218
|
+
], 12),
|
|
219
|
+
wp: permutation_from_cycles([
|
|
220
|
+
[4, 8, 5],
|
|
221
|
+
[10, 2, 11]
|
|
222
|
+
], 12),
|
|
223
|
+
cp: [2, 0, 1, 3]
|
|
224
|
+
};
|
|
225
|
+
var moves = [
|
|
226
|
+
move_Uw,
|
|
227
|
+
move_Lw,
|
|
228
|
+
move_Rw,
|
|
229
|
+
move_Bw,
|
|
230
|
+
move_U,
|
|
231
|
+
move_L,
|
|
232
|
+
move_R,
|
|
233
|
+
move_B
|
|
234
|
+
];
|
|
235
|
+
var move_names = ["u", "l", "r", "b", "U", "L", "R", "B"];
|
|
236
|
+
var N_MOVES = 8;
|
|
237
|
+
var N_MOVES_PHASE2 = 4;
|
|
238
|
+
function moves_commute(i, j) {
|
|
239
|
+
if (i >= 4 && j >= 4) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
if (i < 4 && j < 4) {
|
|
243
|
+
return i === j;
|
|
244
|
+
}
|
|
245
|
+
return (i ^ j) === 4;
|
|
246
|
+
}
|
|
247
|
+
function stringify_move_sequence(move_sequence) {
|
|
248
|
+
let suffixes = ["0", "", "'"];
|
|
249
|
+
let s = move_sequence.map(([m, r]) => move_names[m] + suffixes[r]);
|
|
250
|
+
return s.join(" ");
|
|
251
|
+
}
|
|
252
|
+
function generate_random_state(randomUintBelow2) {
|
|
253
|
+
let co = Array(4);
|
|
254
|
+
for (let i = 0; i < 4; i++) {
|
|
255
|
+
co[i] = randomUintBelow2(3);
|
|
256
|
+
}
|
|
257
|
+
let mp = index_to_evenpermutation(randomUintBelow2(factorial(6) / 2), 6);
|
|
258
|
+
for (let i = 0, parity = 0; i < 6; i++) {
|
|
259
|
+
let eo = i === 5 ? parity : randomUintBelow2(2);
|
|
260
|
+
parity ^= eo;
|
|
261
|
+
mp[i] += eo * 6;
|
|
262
|
+
mp[i + 6] = (mp[i] + 6) % 12;
|
|
263
|
+
}
|
|
264
|
+
let wp = index_to_evenpermutation(randomUintBelow2(factorial(12) / 2), 12);
|
|
265
|
+
let cp = index_to_evenpermutation(randomUintBelow2(factorial(4) / 2), 4);
|
|
266
|
+
return { co, mp, wp, cp };
|
|
267
|
+
}
|
|
268
|
+
function generate_random_state_scramble(randomUintBelow2) {
|
|
269
|
+
return solve(generate_random_state(randomUintBelow2));
|
|
270
|
+
}
|
|
271
|
+
function generate_scramble_sequence(randomUintBelow2, tips = true, obfuscate_tips = false) {
|
|
272
|
+
let scramble_string = stringify_move_sequence(generate_random_state_scramble(randomUintBelow2));
|
|
273
|
+
if (!tips) {
|
|
274
|
+
return scramble_string;
|
|
275
|
+
}
|
|
276
|
+
let tip_names = ["u", "l", "r", "b"];
|
|
277
|
+
let suffixes = ["0", "", "'"];
|
|
278
|
+
if (!obfuscate_tips) {
|
|
279
|
+
for (let i = 0; i < 4; i++) {
|
|
280
|
+
let x = randomUintBelow2(3);
|
|
281
|
+
if (x !== 0) {
|
|
282
|
+
scramble_string += " " + tip_names[i] + suffixes[x];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return scramble_string.trim();
|
|
286
|
+
}
|
|
287
|
+
let amount = [], amount_pre = [], amount_post = [];
|
|
288
|
+
for (let i = 0; i < 4; i++) {
|
|
289
|
+
amount[i] = randomUintBelow2(3);
|
|
290
|
+
amount_pre[i] = randomUintBelow2(3);
|
|
291
|
+
amount_post[i] = (amount[i] - amount_pre[i] + 3) % 3;
|
|
292
|
+
}
|
|
293
|
+
let weight = (arr) => arr.filter((x) => x !== 0).length;
|
|
294
|
+
while (!(weight(amount_pre) >= 1 && weight(amount_post) >= 1 && weight(amount_pre) + weight(amount_post) >= 4)) {
|
|
295
|
+
for (let i = 0; i < 4; i++) {
|
|
296
|
+
amount_pre[i] = randomUintBelow2(3);
|
|
297
|
+
amount_post[i] = (amount[i] - amount_pre[i] + 3) % 3;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
let prepend = amount_pre.map((x, i) => x !== 0 ? tip_names[i] + suffixes[x] + " " : "").join("");
|
|
301
|
+
let append = amount_post.map((x, i) => x !== 0 ? " " + tip_names[i] + suffixes[x] : "").join("");
|
|
302
|
+
return prepend + scramble_string + append;
|
|
303
|
+
}
|
|
304
|
+
function solve(state) {
|
|
305
|
+
let phase1_indices = index_phase1(state);
|
|
306
|
+
let phase2_mtables = [
|
|
307
|
+
generate_phase2_permutation_mtable(),
|
|
308
|
+
generate_phase2_orientation_mtable()
|
|
309
|
+
];
|
|
310
|
+
let phase2_ptables = [
|
|
311
|
+
generate_phase2_permutation_ptable(),
|
|
312
|
+
generate_phase2_orientation_ptable()
|
|
313
|
+
];
|
|
314
|
+
let phase1gen = phase1_ida_solve_gen(phase1_indices);
|
|
315
|
+
let best = void 0;
|
|
316
|
+
let intermediate_states = new Set();
|
|
317
|
+
let start_time = performance.now();
|
|
318
|
+
for (let i = 0; i < 22; i++) {
|
|
319
|
+
let { value: sol1, done } = phase1gen.next();
|
|
320
|
+
let new_state = state;
|
|
321
|
+
for (let [m, r] of sol1) {
|
|
322
|
+
for (let i2 = 0; i2 < r; i2++)
|
|
323
|
+
new_state = compose_state(new_state, moves[m]);
|
|
324
|
+
}
|
|
325
|
+
let stringified_state = JSON.stringify(new_state);
|
|
326
|
+
if (intermediate_states.has(stringified_state)) {
|
|
327
|
+
continue;
|
|
328
|
+
} else
|
|
329
|
+
intermediate_states.add(stringified_state);
|
|
330
|
+
let phase2_indices = index_phase2(new_state);
|
|
331
|
+
let moves_left = best ? best.length - sol1.length - 1 : 999999;
|
|
332
|
+
let sol2 = ida_solve_gen(phase2_indices, phase2_mtables, phase2_ptables, moves_left).next().value;
|
|
333
|
+
if (sol2 === void 0) {
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (best === void 0 || best.length > sol1.length + sol2.length) {
|
|
337
|
+
best = sol1.concat(sol2);
|
|
338
|
+
}
|
|
339
|
+
if (performance.now() - start_time > 300)
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
return best;
|
|
343
|
+
}
|
|
344
|
+
function determine_V_coset(p) {
|
|
345
|
+
return p[3 ^ p.indexOf(3)];
|
|
346
|
+
}
|
|
347
|
+
function index_phase1(state) {
|
|
348
|
+
let w = compose(invert(state.mp), state.wp);
|
|
349
|
+
let c = (state.co.reduce((x, y) => x + y) - determine_V_coset(state.cp) + 3) % 3;
|
|
350
|
+
return [0, 1, 2, 3, 4, 5].map((i) => i + 6 * w.indexOf(i) + 72 * w.indexOf(i + 6) + 864 * c);
|
|
351
|
+
}
|
|
352
|
+
var phase1_permtable_m = [];
|
|
353
|
+
var phase1_permtable_minv = [];
|
|
354
|
+
var phase1_permtable_w = [];
|
|
355
|
+
var phase1_permtable_winv = [];
|
|
356
|
+
for (let i = 0; i < N_MOVES; i++) {
|
|
357
|
+
let move = moves[i];
|
|
358
|
+
phase1_permtable_m[i] = move.mp;
|
|
359
|
+
phase1_permtable_minv[i] = invert(move.mp);
|
|
360
|
+
phase1_permtable_w[i] = move.wp;
|
|
361
|
+
phase1_permtable_winv[i] = invert(move.wp);
|
|
362
|
+
}
|
|
363
|
+
var phase1_c_update = [0, 0, 0, 0, 2, 2, 2, 2];
|
|
364
|
+
var phase1_score_ptable = [
|
|
365
|
+
[
|
|
366
|
+
14,
|
|
367
|
+
-1,
|
|
368
|
+
-1,
|
|
369
|
+
11,
|
|
370
|
+
11,
|
|
371
|
+
10,
|
|
372
|
+
9,
|
|
373
|
+
8,
|
|
374
|
+
8,
|
|
375
|
+
7,
|
|
376
|
+
7,
|
|
377
|
+
6,
|
|
378
|
+
4,
|
|
379
|
+
5,
|
|
380
|
+
5,
|
|
381
|
+
3,
|
|
382
|
+
4,
|
|
383
|
+
4,
|
|
384
|
+
2,
|
|
385
|
+
3,
|
|
386
|
+
4,
|
|
387
|
+
3,
|
|
388
|
+
-1,
|
|
389
|
+
-1,
|
|
390
|
+
0
|
|
391
|
+
],
|
|
392
|
+
[
|
|
393
|
+
13,
|
|
394
|
+
-1,
|
|
395
|
+
-1,
|
|
396
|
+
11,
|
|
397
|
+
10,
|
|
398
|
+
10,
|
|
399
|
+
9,
|
|
400
|
+
8,
|
|
401
|
+
8,
|
|
402
|
+
7,
|
|
403
|
+
7,
|
|
404
|
+
6,
|
|
405
|
+
4,
|
|
406
|
+
5,
|
|
407
|
+
5,
|
|
408
|
+
3,
|
|
409
|
+
4,
|
|
410
|
+
4,
|
|
411
|
+
2,
|
|
412
|
+
3,
|
|
413
|
+
3,
|
|
414
|
+
1,
|
|
415
|
+
-1,
|
|
416
|
+
-1,
|
|
417
|
+
6
|
|
418
|
+
]
|
|
419
|
+
];
|
|
420
|
+
var phase1_score_ptable_condensed = new Int8Array(55);
|
|
421
|
+
for (let i = 0; i < 25; i++) {
|
|
422
|
+
phase1_score_ptable_condensed[i] = phase1_score_ptable[0][i];
|
|
423
|
+
phase1_score_ptable_condensed[i + 30] = phase1_score_ptable[1][i];
|
|
424
|
+
}
|
|
425
|
+
var phase1_coord_to_score = new Int8Array(6 * 12 * 12 * 3);
|
|
426
|
+
for (let i = 0; i < 6; i++)
|
|
427
|
+
for (let j = 0; j < 12; j++)
|
|
428
|
+
for (let k = 0; k < 12; k++) {
|
|
429
|
+
let index = i + 6 * j + 72 * k;
|
|
430
|
+
let score = 2;
|
|
431
|
+
if (j === i) {
|
|
432
|
+
score++;
|
|
433
|
+
} else if (j === (i + 6) % 12) {
|
|
434
|
+
score--;
|
|
435
|
+
}
|
|
436
|
+
if (k === (i + 6) % 12) {
|
|
437
|
+
score++;
|
|
438
|
+
} else if (k === i) {
|
|
439
|
+
score--;
|
|
440
|
+
}
|
|
441
|
+
phase1_coord_to_score[index] = score;
|
|
442
|
+
phase1_coord_to_score[index + 6 * 12 * 12] = phase1_coord_to_score[index + 2 * 6 * 12 * 12] = score + 5;
|
|
443
|
+
}
|
|
444
|
+
function* phase1_ida_solve_gen(coords) {
|
|
445
|
+
let bound = 0;
|
|
446
|
+
let mtable = generate_phase1_pairingc_mtable();
|
|
447
|
+
let ptable = generate_phase1_pairing2c_ptable();
|
|
448
|
+
while (true) {
|
|
449
|
+
yield* phase1_ida_search_gen(...coords, mtable, ptable, bound, -1);
|
|
450
|
+
bound++;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function* phase1_ida_search_gen(a, b, c, d, e, f, mtable, ptable, bound, last) {
|
|
454
|
+
let nmoves = N_MOVES;
|
|
455
|
+
let score = phase1_coord_to_score[a] + phase1_coord_to_score[b] + phase1_coord_to_score[c] + phase1_coord_to_score[d] + phase1_coord_to_score[e] + phase1_coord_to_score[f];
|
|
456
|
+
let heuristic = Math.max(ptable[a % 864 + b * 864], ptable[c % 864 + b * 864], ptable[e % 864 + b * 864], ptable[a % 864 + d * 864], ptable[c % 864 + d * 864], ptable[e % 864 + d * 864], ptable[a % 864 + f * 864], ptable[c % 864 + f * 864], ptable[e % 864 + f * 864], ptable[a % 864 + c * 864], ptable[a % 864 + e * 864], ptable[c % 864 + e * 864], ptable[b % 864 + d * 864], ptable[b % 864 + f * 864], ptable[d % 864 + f * 864], phase1_score_ptable_condensed[score]);
|
|
457
|
+
if (heuristic > bound)
|
|
458
|
+
return;
|
|
459
|
+
if (bound === 0) {
|
|
460
|
+
yield [];
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (heuristic === 0 && bound === 1)
|
|
464
|
+
return;
|
|
465
|
+
for (let m = 0; m < nmoves; m++) {
|
|
466
|
+
if (m === last)
|
|
467
|
+
continue;
|
|
468
|
+
if (m < last && moves_commute(m, last))
|
|
469
|
+
continue;
|
|
470
|
+
let A = a, B = b, C = c, D = d, E = e, F = f;
|
|
471
|
+
for (let r = 1; r <= 2; r++) {
|
|
472
|
+
A = mtable[A][m];
|
|
473
|
+
B = mtable[B][m];
|
|
474
|
+
C = mtable[C][m];
|
|
475
|
+
D = mtable[D][m];
|
|
476
|
+
E = mtable[E][m];
|
|
477
|
+
F = mtable[F][m];
|
|
478
|
+
let subpath_gen = phase1_ida_search_gen(A, B, C, D, E, F, mtable, ptable, bound - 1, m);
|
|
479
|
+
while (true) {
|
|
480
|
+
let { value: subpath, done } = subpath_gen.next();
|
|
481
|
+
if (done)
|
|
482
|
+
break;
|
|
483
|
+
yield [[m, r]].concat(subpath);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
function index_phase2(state) {
|
|
489
|
+
let edges = state.mp;
|
|
490
|
+
let ep = evenpermutation_to_index(edges.slice(0, 6).map((x) => x % 6));
|
|
491
|
+
let eo = edges.slice(0, 5).map((x, i) => (x >= 6) * 2 ** i).reduce((x, y) => x + y);
|
|
492
|
+
let co = state.co.map((x, i) => x * 3 ** i).reduce((x, y) => x + y);
|
|
493
|
+
let cloc = state.cp.indexOf(0);
|
|
494
|
+
return [ep + 360 * cloc, eo + 32 * co];
|
|
495
|
+
}
|
|
496
|
+
var tables = {};
|
|
497
|
+
function generate_phase1_pairing_mtable() {
|
|
498
|
+
if (tables.phase1pm) {
|
|
499
|
+
return tables.phase1pm;
|
|
500
|
+
}
|
|
501
|
+
let mtable = Array(6 * 12 * 12).fill().map(() => Array(N_MOVES).fill(-1));
|
|
502
|
+
for (let midge = 0; midge < 6; midge++) {
|
|
503
|
+
for (let wingl = 0; wingl < 12; wingl++) {
|
|
504
|
+
for (let wingh = 0; wingh < 12; wingh++) {
|
|
505
|
+
if (wingl === wingh) {
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
let index = midge + 6 * wingl + 72 * wingh;
|
|
509
|
+
for (let m = 0; m < N_MOVES; m++) {
|
|
510
|
+
let new_midge = phase1_permtable_minv[m][midge];
|
|
511
|
+
let new_wingl = phase1_permtable_winv[m][wingl];
|
|
512
|
+
let new_wingh = phase1_permtable_winv[m][wingh];
|
|
513
|
+
if (new_midge < 6) {
|
|
514
|
+
mtable[index][m] = new_midge + 6 * new_wingl + 72 * new_wingh;
|
|
515
|
+
} else {
|
|
516
|
+
mtable[index][m] = new_midge - 6 + 6 * new_wingh + 72 * new_wingl;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return tables.phase1pm = mtable;
|
|
523
|
+
}
|
|
524
|
+
function generate_phase1_pairingc_mtable() {
|
|
525
|
+
if (tables.phase1pcm) {
|
|
526
|
+
return tables.phase1pcm;
|
|
527
|
+
}
|
|
528
|
+
let mtable_pairing = generate_phase1_pairing_mtable();
|
|
529
|
+
let mtable = Array(mtable_pairing.length * 3).fill().map(() => Array(N_MOVES).fill(-1));
|
|
530
|
+
for (let index = 0; index < mtable_pairing.length; index++) {
|
|
531
|
+
for (let m = 0; m < N_MOVES; m++) {
|
|
532
|
+
let new_index = mtable_pairing[index][m];
|
|
533
|
+
mtable[index][m] = new_index + 6 * 12 * 12 * phase1_c_update[m];
|
|
534
|
+
mtable[index + 6 * 12 * 12][m] = new_index + 6 * 12 * 12 * ((phase1_c_update[m] + 1) % 3);
|
|
535
|
+
mtable[index + 2 * 6 * 12 * 12][m] = new_index + 6 * 12 * 12 * ((phase1_c_update[m] + 2) % 3);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return tables.phase1pcm = mtable;
|
|
539
|
+
}
|
|
540
|
+
function generate_phase1_pairing2c_ptable() {
|
|
541
|
+
if (tables.phase1p2cp) {
|
|
542
|
+
return tables.phase1p2cp;
|
|
543
|
+
}
|
|
544
|
+
let mtable_noc = generate_phase1_pairing_mtable();
|
|
545
|
+
let mtable = generate_phase1_pairingc_mtable();
|
|
546
|
+
let ptable = new Int8Array((6 * 12 * 12) ** 2 * 3);
|
|
547
|
+
ptable.fill(-1);
|
|
548
|
+
let g = [0, 1, 2, 3, 4, 5].map((x) => x + 6 * x + 72 * (x + 6));
|
|
549
|
+
for (let i = 0; i < 6; i++)
|
|
550
|
+
for (let j = 0; j < 6; j++) {
|
|
551
|
+
if (i === j)
|
|
552
|
+
continue;
|
|
553
|
+
ptable[g[i] + 864 * g[j]] = 0;
|
|
554
|
+
}
|
|
555
|
+
let dist = 0;
|
|
556
|
+
while (true) {
|
|
557
|
+
let changed = false;
|
|
558
|
+
for (let index = 0; index < ptable.length; index++) {
|
|
559
|
+
if (ptable[index] !== dist) {
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
562
|
+
let index0 = index % 864, index1 = Math.floor(index / 864);
|
|
563
|
+
for (let m = 0; m < N_MOVES; m++) {
|
|
564
|
+
let new_index0 = index0, new_index1 = index1;
|
|
565
|
+
for (let r = 1; r <= 2; r++) {
|
|
566
|
+
new_index0 = mtable_noc[new_index0][m];
|
|
567
|
+
new_index1 = mtable[new_index1][m];
|
|
568
|
+
let new_index = new_index0 + 864 * new_index1;
|
|
569
|
+
if (ptable[new_index] === -1) {
|
|
570
|
+
changed = true;
|
|
571
|
+
ptable[new_index] = dist + 1;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (!changed) {
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
dist++;
|
|
580
|
+
}
|
|
581
|
+
return tables.phase1p2cp = ptable;
|
|
582
|
+
}
|
|
583
|
+
function generate_phase2_permutation_mtable() {
|
|
584
|
+
if (tables.phase2pm) {
|
|
585
|
+
return tables.phase2pm;
|
|
586
|
+
}
|
|
587
|
+
let mtable = Array(1440).fill().map(() => Array(N_MOVES_PHASE2));
|
|
588
|
+
for (let ep = 0; ep < 360; ep++) {
|
|
589
|
+
let perm = index_to_evenpermutation(ep, 6);
|
|
590
|
+
for (let i = 0; i < 6; i++) {
|
|
591
|
+
perm[i + 6] = perm[i] + 6;
|
|
592
|
+
}
|
|
593
|
+
for (let m = 0; m < N_MOVES_PHASE2; m++) {
|
|
594
|
+
let new_perm = compose(perm, moves[m].mp);
|
|
595
|
+
let new_ep = evenpermutation_to_index(new_perm.slice(0, 6).map((x) => x % 6));
|
|
596
|
+
for (let new_cloc = 0; new_cloc < 4; new_cloc++) {
|
|
597
|
+
let cloc = moves[m].cp[new_cloc];
|
|
598
|
+
mtable[ep + 360 * cloc][m] = new_ep + 360 * new_cloc;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return tables.phase2pm = mtable;
|
|
603
|
+
}
|
|
604
|
+
function generate_phase2_orientation_mtable() {
|
|
605
|
+
if (tables.phase2om) {
|
|
606
|
+
return tables.phase2om;
|
|
607
|
+
}
|
|
608
|
+
let mtable = Array(32 * 81).fill().map(() => Array(N_MOVES_PHASE2));
|
|
609
|
+
for (let eo = 0; eo < 32; eo++) {
|
|
610
|
+
let eo_array = [0, 1, 2, 3, 4].map((i) => eo >> i & 1);
|
|
611
|
+
eo_array[5] = eo_array.reduce((x, y) => x ^ y);
|
|
612
|
+
let perm = [];
|
|
613
|
+
for (let i = 0; i < 6; i++) {
|
|
614
|
+
perm[i] = i + 6 * eo_array[i];
|
|
615
|
+
perm[i + 6] = i + 6 * (eo_array[i] ^ 1);
|
|
616
|
+
}
|
|
617
|
+
for (let co = 0; co < 81; co++) {
|
|
618
|
+
let co_array = [0, 1, 2, 3].map((i) => Math.floor(co / 3 ** i) % 3);
|
|
619
|
+
for (let m = 0; m < N_MOVES_PHASE2; m++) {
|
|
620
|
+
let new_perm = compose(perm, moves[m].mp);
|
|
621
|
+
let new_eo_array = new_perm.slice(0, 5).map((x) => +(x >= 6));
|
|
622
|
+
let new_eo = 0;
|
|
623
|
+
for (let i = 0; i < 5; i++) {
|
|
624
|
+
new_eo += new_eo_array[i] << i;
|
|
625
|
+
}
|
|
626
|
+
let new_co_array = co_array.map((x, i) => (x + moves[m].co[i]) % 3);
|
|
627
|
+
let new_co = 0;
|
|
628
|
+
for (let i = 0; i < 4; i++) {
|
|
629
|
+
new_co += new_co_array[i] * 3 ** i;
|
|
630
|
+
}
|
|
631
|
+
mtable[eo + 32 * co][m] = new_eo + 32 * new_co;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return tables.phase2om = mtable;
|
|
636
|
+
}
|
|
637
|
+
function generate_phase2_permutation_ptable() {
|
|
638
|
+
if (tables.phase2pp) {
|
|
639
|
+
return tables.phase2pp;
|
|
640
|
+
}
|
|
641
|
+
return tables.phase2pp = bfs(generate_phase2_permutation_mtable(), [0]);
|
|
642
|
+
}
|
|
643
|
+
function generate_phase2_orientation_ptable() {
|
|
644
|
+
if (tables.phase2op) {
|
|
645
|
+
return tables.phase2op;
|
|
646
|
+
}
|
|
647
|
+
return tables.phase2op = bfs(generate_phase2_orientation_mtable(), [0]);
|
|
648
|
+
}
|
|
649
|
+
function bfs(mtable, goal_states) {
|
|
650
|
+
let N = mtable.length;
|
|
651
|
+
let nmoves = mtable[0].length;
|
|
652
|
+
let ptable = Array(N).fill(-1);
|
|
653
|
+
let queue = goal_states.slice(), new_queue = [];
|
|
654
|
+
let depth = 0;
|
|
655
|
+
while (queue.length > 0) {
|
|
656
|
+
new_queue.length = 0;
|
|
657
|
+
for (let state of queue) {
|
|
658
|
+
if (ptable[state] !== -1)
|
|
659
|
+
continue;
|
|
660
|
+
ptable[state] = depth;
|
|
661
|
+
for (let move_index = 0; move_index < nmoves; move_index++) {
|
|
662
|
+
let new_state = mtable[state][move_index];
|
|
663
|
+
while (new_state != state) {
|
|
664
|
+
new_queue.push(new_state);
|
|
665
|
+
new_state = mtable[new_state][move_index];
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
[queue, new_queue] = [new_queue, queue];
|
|
670
|
+
depth += 1;
|
|
671
|
+
}
|
|
672
|
+
return ptable;
|
|
673
|
+
}
|
|
674
|
+
function* ida_solve_gen(indices, mtables, ptables, moves_left) {
|
|
675
|
+
let ncoords = indices.length;
|
|
676
|
+
let bound = 0;
|
|
677
|
+
for (let i = 0; i < ncoords; i++)
|
|
678
|
+
bound = Math.max(bound, ptables[i][indices[i]]);
|
|
679
|
+
while (bound <= moves_left) {
|
|
680
|
+
yield* ida_search_gen(indices, mtables, ptables, bound, -1);
|
|
681
|
+
bound++;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
function* ida_search_gen(indices, mtables, ptables, bound, last) {
|
|
685
|
+
let ncoords = indices.length;
|
|
686
|
+
let nmoves = mtables[0][0].length;
|
|
687
|
+
let heuristic = 0;
|
|
688
|
+
for (let i = 0; i < ncoords; i++)
|
|
689
|
+
heuristic = Math.max(heuristic, ptables[i][indices[i]]);
|
|
690
|
+
if (heuristic > bound)
|
|
691
|
+
return;
|
|
692
|
+
if (bound === 0) {
|
|
693
|
+
yield [];
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
if (heuristic === 0 && bound === 1)
|
|
697
|
+
return;
|
|
698
|
+
for (let m = 0; m < nmoves; m++) {
|
|
699
|
+
if (m === last)
|
|
700
|
+
continue;
|
|
701
|
+
if (m < last && moves_commute(m, last))
|
|
702
|
+
continue;
|
|
703
|
+
let new_indices = indices.slice();
|
|
704
|
+
for (let c = 0; c < ncoords; c++)
|
|
705
|
+
new_indices[c] = mtables[c][indices[c]][m];
|
|
706
|
+
let r = 1;
|
|
707
|
+
while (indices.some((_, i) => indices[i] != new_indices[i])) {
|
|
708
|
+
let subpath_gen = ida_search_gen(new_indices, mtables, ptables, bound - 1, m);
|
|
709
|
+
while (true) {
|
|
710
|
+
let { value: subpath, done } = subpath_gen.next();
|
|
711
|
+
if (done)
|
|
712
|
+
break;
|
|
713
|
+
yield [[m, r]].concat(subpath);
|
|
714
|
+
}
|
|
715
|
+
for (let c = 0; c < ncoords; c++) {
|
|
716
|
+
new_indices[c] = mtables[c][new_indices[c]][m];
|
|
717
|
+
}
|
|
718
|
+
r++;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
var randomUintBelow = randomUIntBelowFactory();
|
|
723
|
+
async function randomMasterTetraminxScrambleString() {
|
|
724
|
+
return generate_scramble_sequence(await randomUintBelow, false);
|
|
725
|
+
}
|
|
726
|
+
export {
|
|
727
|
+
randomMasterTetraminxScrambleString
|
|
728
|
+
};
|
|
729
|
+
//# sourceMappingURL=master_tetraminx-solver-KBQJGW4A.js.map
|