cubing 0.24.6 → 0.25.2

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.
Files changed (91) hide show
  1. package/README.md +14 -5
  2. package/dist/esm/{2x2x2.sgs.json-KBCXHIZP.js → 2x2x2.sgs.json-NUOQFJWU.js} +2 -2
  3. package/dist/esm/{2x2x2.sgs.json-KBCXHIZP.js.map → 2x2x2.sgs.json-NUOQFJWU.js.map} +0 -0
  4. package/dist/esm/{3d-dynamic-inside-IIG5EJZP.js → 3d-dynamic-AKACURPM.js} +13 -13
  5. package/dist/esm/3d-dynamic-AKACURPM.js.map +7 -0
  6. package/dist/esm/{gwt-B7CBESZR.js → 3x3x3-min2phase-FPRJ5PCJ.js} +2 -2
  7. package/dist/esm/{gwt-B7CBESZR.js.map → 3x3x3-min2phase-FPRJ5PCJ.js.map} +1 -1
  8. package/dist/esm/{scramble_444-ZFKBLRUE.js → 444-solver-GNQ5BHCL.js} +5 -5
  9. package/dist/esm/{scramble_444-ZFKBLRUE.js.map → 444-solver-GNQ5BHCL.js.map} +1 -1
  10. package/dist/esm/bluetooth/index.js +1 -1
  11. package/dist/esm/chunk-5O24MNND.js +25 -0
  12. package/dist/esm/chunk-5O24MNND.js.map +7 -0
  13. package/dist/esm/{chunk-UOI5KUW4.js → chunk-ASJ2DADD.js} +4 -4
  14. package/dist/esm/{chunk-UOI5KUW4.js.map → chunk-ASJ2DADD.js.map} +2 -2
  15. package/dist/esm/{chunk-V7BTHDW3.js → chunk-CYKV7QC5.js} +2 -2
  16. package/dist/esm/{chunk-V7BTHDW3.js.map → chunk-CYKV7QC5.js.map} +0 -0
  17. package/dist/esm/{chunk-DMCRTYR4.js → chunk-FZJDXPAH.js} +53 -22
  18. package/dist/esm/chunk-FZJDXPAH.js.map +7 -0
  19. package/dist/esm/{chunk-OOIEAACO.js → chunk-L3PZ4XAT.js} +2 -2
  20. package/dist/esm/{chunk-OOIEAACO.js.map → chunk-L3PZ4XAT.js.map} +2 -2
  21. package/dist/esm/{chunk-37EHU3GZ.js → chunk-RENZB7QN.js} +4 -2
  22. package/dist/esm/chunk-RENZB7QN.js.map +7 -0
  23. package/dist/esm/{chunk-MVJPIWT7.js → chunk-SNWS6JXI.js} +7 -5
  24. package/dist/esm/{chunk-MVJPIWT7.js.map → chunk-SNWS6JXI.js.map} +2 -2
  25. package/dist/esm/{entry-FHL2XSAP.js → entry-2KUJYJBJ.js} +39 -60
  26. package/dist/esm/entry-2KUJYJBJ.js.map +7 -0
  27. package/dist/esm/fto-solver-HI6NIV74.js +1537 -0
  28. package/dist/esm/fto-solver-HI6NIV74.js.map +7 -0
  29. package/dist/esm/{fto.sgs.json-USV4WNQJ.js → fto.dynamic-A3AASYQ6.js} +8 -3
  30. package/dist/esm/fto.dynamic-A3AASYQ6.js.map +7 -0
  31. package/dist/esm/master_tetraminx-solver-KBQJGW4A.js +729 -0
  32. package/dist/esm/master_tetraminx-solver-KBQJGW4A.js.map +7 -0
  33. package/dist/esm/puzzles/index.js +1 -1
  34. package/dist/esm/{pyraminx.sgs.json-HMKDN3ZT.js → pyraminx.sgs.json-X37XL7MA.js} +3 -3
  35. package/dist/esm/{pyraminx.sgs.json-HMKDN3ZT.js.map → pyraminx.sgs.json-X37XL7MA.js.map} +0 -0
  36. package/dist/esm/scramble/index.js +4 -4
  37. package/dist/esm/search/index.js +4 -4
  38. package/dist/esm/{module-entry-TKJ6ZAZB.js → search-worker-entry-ZJAXYGSH.js} +7 -7
  39. package/dist/esm/search-worker-entry-ZJAXYGSH.js.map +7 -0
  40. package/dist/esm/{scramble_sq1-PQ2AYBFW.js → sq1-solver-P3IWWET7.js} +3 -3
  41. package/dist/esm/{scramble_sq1-PQ2AYBFW.js.map → sq1-solver-P3IWWET7.js.map} +1 -1
  42. package/dist/esm/twisty/index.js +54 -12
  43. package/dist/esm/twisty/index.js.map +3 -3
  44. package/dist/esm/worker-inside-generated-string-OBSDMXAS.js +3447 -0
  45. package/dist/esm/worker-inside-generated-string-OBSDMXAS.js.map +7 -0
  46. package/dist/types/puzzles/async/async-pg3d.d.ts +2 -0
  47. package/dist/types/search/inside/{module-entry-path-getter.d.ts → search-worker-entry-path-getter.d.ts} +0 -0
  48. package/dist/types/search/inside/{module-entry.d.ts → search-worker-entry.d.ts} +0 -0
  49. package/dist/types/search/inside/solve/puzzles/fto.d.ts +1 -1
  50. package/dist/types/search/inside/solve/puzzles/{fto.sgs.json.d.ts → fto.dynamic.d.ts} +1 -0
  51. package/dist/types/search/inside/solve/puzzles/master_tetraminx.d.ts +2 -0
  52. package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
  53. package/dist/types/twisty/heavy-code-imports/3d.d.ts +1 -1
  54. package/dist/types/twisty/heavy-code-imports/dynamic-entries/{3d-dynamic-inside.d.ts → 3d-dynamic.d.ts} +0 -0
  55. package/dist/types/twisty/model/TwistyPlayerModel.d.ts +4 -0
  56. package/dist/types/twisty/model/props/TwistyPropDebugger.d.ts +1 -2
  57. package/dist/types/twisty/model/props/general/ArbitraryStringProp.d.ts +4 -0
  58. package/dist/types/twisty/views/TwistyPlayer.d.ts +6 -0
  59. package/dist/types/twisty/views/TwistyPlayerSettable.d.ts +6 -0
  60. package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +1 -1
  61. package/dist/types/vendor/comlink-everywhere/inside/index.d.ts +2 -1
  62. package/dist/types/vendor/comlink-everywhere/node-adapter.d.ts +6 -0
  63. package/dist/types/vendor/comlink-everywhere/outside/index.d.ts +4 -2
  64. package/dist/types/vendor/cstimer/src/js/scramble/{scramble_444.d.ts → 444-solver.d.ts} +0 -0
  65. package/dist/types/vendor/min2phase/{gwt.d.ts → 3x3x3-min2phase.d.ts} +0 -0
  66. package/dist/types/vendor/sq12phase/{scramble_sq1.d.ts → sq1-solver.d.ts} +0 -0
  67. package/dist/types/vendor/xyzzy/fto-solver-original.d.ts +203 -0
  68. package/dist/types/vendor/xyzzy/fto-solver.d.ts +1 -0
  69. package/dist/types/vendor/xyzzy/kilosolver.d.ts +140 -0
  70. package/dist/types/vendor/xyzzy/master_tetraminx-solver.d.ts +1 -0
  71. package/dist/types/vendor/xyzzy/rediscrambler.d.ts +94 -0
  72. package/package.json +3 -3
  73. package/dist/esm/3d-dynamic-inside-IIG5EJZP.js.map +0 -7
  74. package/dist/esm/chunk-37EHU3GZ.js.map +0 -7
  75. package/dist/esm/chunk-BJIOROQC.js +0 -18
  76. package/dist/esm/chunk-BJIOROQC.js.map +0 -7
  77. package/dist/esm/chunk-DMCRTYR4.js.map +0 -7
  78. package/dist/esm/entry-FHL2XSAP.js.map +0 -7
  79. package/dist/esm/esm-test-worker.js +0 -15
  80. package/dist/esm/esm-test-worker.js.map +0 -7
  81. package/dist/esm/fto.sgs.json-USV4WNQJ.js.map +0 -7
  82. package/dist/esm/module-entry-TKJ6ZAZB.js.map +0 -7
  83. package/dist/esm/node-SP4L2AKI.js +0 -12
  84. package/dist/esm/node-SP4L2AKI.js.map +0 -7
  85. package/dist/esm/node-W3AD4HBK.js +0 -39
  86. package/dist/esm/node-W3AD4HBK.js.map +0 -7
  87. package/dist/esm/worker-inside-generated-string-XYHIVIPG.js +0 -3447
  88. package/dist/esm/worker-inside-generated-string-XYHIVIPG.js.map +0 -7
  89. package/dist/types/esm-test-worker.d.ts +0 -1
  90. package/dist/types/vendor/comlink-everywhere/inside/node.d.ts +0 -1
  91. package/dist/types/vendor/comlink-everywhere/outside/node.d.ts +0 -2
@@ -0,0 +1,1537 @@
1
+ import {
2
+ randomUIntBelowFactory
3
+ } from "./chunk-RENZB7QN.js";
4
+ import "./chunk-WO2AXYFE.js";
5
+
6
+ // src/cubing/vendor/xyzzy/fto-solver.js
7
+ function factorial(n) {
8
+ if (n < 2)
9
+ return n;
10
+ let f = 1;
11
+ for (let i = 2; i <= n; i++)
12
+ f *= i;
13
+ return f;
14
+ }
15
+ function C(n, k) {
16
+ if (k < 0 || k > n)
17
+ return 0;
18
+ if (k === 0 || k === n)
19
+ return 1;
20
+ let c = 1;
21
+ for (let i = 0; i < k; i++) {
22
+ c = c * (n - i) / (i + 1) | 0;
23
+ }
24
+ return c;
25
+ }
26
+ function C4(n, k0, k1, k2, k3 = n - k0 - k1 - k2) {
27
+ return C(n, k0 + k1) * C(k0 + k1, k0) * C(k2 + k3, k2);
28
+ }
29
+ function permutation_to_index(perm) {
30
+ perm = perm.slice();
31
+ let n = perm.length;
32
+ let f = factorial(n - 1);
33
+ let ind = 0;
34
+ while (n > 1) {
35
+ n--;
36
+ let e = perm[0];
37
+ ind += e * f;
38
+ for (let i = 0; i < n; i++) {
39
+ let x = perm[i + 1];
40
+ perm[i] = x - (x > e);
41
+ }
42
+ f /= n;
43
+ }
44
+ return ind;
45
+ }
46
+ function permutation_parity(A) {
47
+ let n = A.length;
48
+ let parity = 0;
49
+ for (let i = 0; i < n - 1; i++) {
50
+ for (let j = i; j < n; j++) {
51
+ if (A[i] > A[j])
52
+ parity ^= 1;
53
+ }
54
+ }
55
+ return parity;
56
+ }
57
+ function index_to_evenpermutation(ind, n) {
58
+ let perm = [];
59
+ let f = factorial(n - 1) / 2;
60
+ let parity = 0;
61
+ for (let i = 0; i < n - 1; i++) {
62
+ perm[i] = ind / f | 0;
63
+ ind %= f;
64
+ f /= n - 1 - i;
65
+ }
66
+ perm[n - 1] = 0;
67
+ for (let i = n - 2; i >= 0; i--) {
68
+ for (let j = i + 1; j < n; j++) {
69
+ if (perm[j] >= perm[i])
70
+ perm[j]++;
71
+ else
72
+ parity ^= 1;
73
+ }
74
+ }
75
+ if (parity === 1)
76
+ [perm[n - 2], perm[n - 1]] = [perm[n - 1], perm[n - 2]];
77
+ return perm;
78
+ }
79
+ function evenpermutation_to_index(perm) {
80
+ return permutation_to_index(perm) >> 1;
81
+ }
82
+ var [evenpermutation8_to_index, index_to_evenpermutation8] = (() => {
83
+ let index_in_set_bits = new Int8Array(256 * 8);
84
+ let look_up_set_bits = new Int8Array(256 * 8);
85
+ for (let i = 0; i < 256; i++) {
86
+ for (let j = 0, counter = 0; j < 8; j++) {
87
+ if ((i >>> j & 1) === 0) {
88
+ continue;
89
+ }
90
+ index_in_set_bits[j << 8 | i] = counter;
91
+ look_up_set_bits[counter << 8 | i] = j;
92
+ counter++;
93
+ }
94
+ }
95
+ function evenpermutation8_to_index2(perm) {
96
+ let unused = 255;
97
+ let f = 2520;
98
+ let ind = 0;
99
+ for (let i = 0; i < 6; i++) {
100
+ let v = perm[i];
101
+ ind += index_in_set_bits[unused | v << 8] * f;
102
+ unused &= ~(1 << v);
103
+ f /= 7 - i;
104
+ }
105
+ return ind;
106
+ }
107
+ function index_to_evenpermutation82(ind, perm) {
108
+ let unused = 255;
109
+ let f = 2520;
110
+ let parity = 0;
111
+ for (let i = 0; i < 6; i++) {
112
+ let a = ind / f | 0;
113
+ ind -= a * f;
114
+ parity ^= a & 1;
115
+ let v = look_up_set_bits[unused | a << 8];
116
+ perm[i] = v;
117
+ unused &= ~(1 << v);
118
+ f /= 7 - i;
119
+ }
120
+ perm[6] = look_up_set_bits[unused | parity << 8];
121
+ perm[7] = look_up_set_bits[unused | (parity ^ 1) << 8];
122
+ return perm;
123
+ }
124
+ return [evenpermutation8_to_index2, index_to_evenpermutation82];
125
+ })();
126
+ function random_permutation(n, randomUintBelow2) {
127
+ let p = [0];
128
+ for (let i = 1; i < n; i++) {
129
+ let r = randomUintBelow2(i + 1);
130
+ p[i] = p[r];
131
+ p[r] = i;
132
+ }
133
+ return p;
134
+ }
135
+ function random_even_permutation(n, randomUintBelow2) {
136
+ let p = random_permutation(n, randomUintBelow2);
137
+ if (permutation_parity(p) === 1) {
138
+ [p[0], p[1]] = [p[1], p[0]];
139
+ }
140
+ return p;
141
+ }
142
+ function ctz(n) {
143
+ n |= 0;
144
+ return 31 - Math.clz32(n ^ n - 1);
145
+ }
146
+ var comb_lookup_tables = {};
147
+ function generate_comb_lookup_tables(n, k) {
148
+ n |= 0;
149
+ k |= 0;
150
+ let key = n + " " + k;
151
+ if (comb_lookup_tables[key]) {
152
+ return comb_lookup_tables[key];
153
+ }
154
+ let total = C(n, k);
155
+ let index_to_comb_table = new Uint32Array(total);
156
+ let comb_to_index_table = new Uint32Array(1 << n).fill(-1);
157
+ for (let i = 0, c = (1 << k) - 1; i < total; i++) {
158
+ index_to_comb_table[i] = c;
159
+ comb_to_index_table[c] = i;
160
+ let t = c | c - 1;
161
+ c = t + 1 | (~t & -~t) - 1 >> ctz(c) + 1;
162
+ }
163
+ return comb_lookup_tables[key] = [index_to_comb_table, comb_to_index_table];
164
+ }
165
+ function popcount(n) {
166
+ n |= 0;
167
+ let c = 0;
168
+ while (n !== 0) {
169
+ n &= n - 1;
170
+ c++;
171
+ }
172
+ return c;
173
+ }
174
+ function spread_bits(n) {
175
+ n &= 65535;
176
+ n = (n | n << 8) & 16711935;
177
+ n = (n | n << 4) & 252645135;
178
+ n = (n | n << 2) & 858993459;
179
+ n = (n | n << 1) & 1431655765;
180
+ return n;
181
+ }
182
+ function interleave_bits(x, y) {
183
+ return spread_bits(x) | spread_bits(y) << 1;
184
+ }
185
+ var comb4_lookup_tables = {};
186
+ function generate_comb4_lookup_tables(n, k0, k1, k2, k3) {
187
+ n |= 0;
188
+ k0 |= 0;
189
+ k1 |= 0;
190
+ k2 |= 0;
191
+ k3 |= 0;
192
+ if (n !== k0 + k1 + k2 + k3) {
193
+ throw "generate_comb4_lookup_tables: invalid parameters";
194
+ }
195
+ let key = [n, k0, k1, k2, k3].join(" ");
196
+ if (comb4_lookup_tables[key]) {
197
+ return comb4_lookup_tables[key];
198
+ }
199
+ let [itcl, ctil] = generate_comb_lookup_tables(n, k1 + k3);
200
+ let [itch, ctih] = generate_comb_lookup_tables(n, k2 + k3);
201
+ let total = C4(n, k0, k1, k2, k3);
202
+ let index_to_comb4_table = new Uint32Array(total);
203
+ let comb4_to_index_table = new Uint32Array(4 ** n).fill(-1);
204
+ for (let i = 0, index = 0; i < itch.length; i++) {
205
+ let ch = itch[i];
206
+ for (let j = 0; j < itcl.length; j++) {
207
+ let cl = itcl[j];
208
+ if (popcount(cl & ch) === k3) {
209
+ let c = interleave_bits(cl, ch);
210
+ index_to_comb4_table[index] = c;
211
+ comb4_to_index_table[c] = index;
212
+ index++;
213
+ }
214
+ }
215
+ }
216
+ return comb4_lookup_tables[key] = [
217
+ index_to_comb4_table,
218
+ comb4_to_index_table
219
+ ];
220
+ }
221
+ function compose(A, B) {
222
+ let C2 = [];
223
+ for (let i = 0; i < B.length; i++)
224
+ C2[i] = A[B[i]];
225
+ return C2;
226
+ }
227
+ function compose3(A, B, C2) {
228
+ let D = [];
229
+ for (let i = 0; i < C2.length; i++)
230
+ D[i] = A[B[C2[i]]];
231
+ return D;
232
+ }
233
+ function permutation_from_cycles(cycles, n) {
234
+ let perm = [];
235
+ for (let i = 0; i < n; i++) {
236
+ perm[i] = i;
237
+ }
238
+ for (let cycle of cycles) {
239
+ for (let i = 0; i < cycle.length; i++) {
240
+ perm[cycle[i]] = cycle[(i + 1) % cycle.length];
241
+ }
242
+ }
243
+ return perm;
244
+ }
245
+ function reduce_permutation(perm, keep) {
246
+ let n = perm.length;
247
+ let count = Array(n).fill(0);
248
+ for (let i = 1; i < n; i++) {
249
+ count[i] = count[i - 1] + keep[i - 1];
250
+ }
251
+ let nn = count[n - 1] + keep[n - 1];
252
+ let reduced = Array(nn);
253
+ for (let i = 0; i < n; i++) {
254
+ if (keep[i]) {
255
+ reduced[count[i]] = count[perm[i]];
256
+ }
257
+ }
258
+ return reduced;
259
+ }
260
+ function invert_permutation(perm) {
261
+ let n = perm.length;
262
+ let inverse = Array(n);
263
+ for (let i = 0; i < n; i++) {
264
+ inverse[perm[i]] = i;
265
+ }
266
+ return inverse;
267
+ }
268
+ function gcd(a, b) {
269
+ while (a && b) {
270
+ [a, b] = [b % a, a];
271
+ }
272
+ return Math.abs(a + b);
273
+ }
274
+ function lcm(a, b) {
275
+ return a * b / gcd(a, b);
276
+ }
277
+ function permutation_order(perm) {
278
+ let order = 1;
279
+ let n = perm.length;
280
+ let visited = Array(n).fill(false);
281
+ let i = -1;
282
+ while (true) {
283
+ i = visited.indexOf(false, i + 1);
284
+ if (i === -1) {
285
+ break;
286
+ }
287
+ let cycle_length = 0;
288
+ let j = i;
289
+ while (!visited[j]) {
290
+ visited[j] = true;
291
+ j = perm[j];
292
+ cycle_length++;
293
+ }
294
+ order = lcm(order, cycle_length);
295
+ }
296
+ return order;
297
+ }
298
+ var solved_state = Array(72).fill().map((_, i) => i / 9 | 0);
299
+ var move_U = permutation_from_cycles([
300
+ [0, 4, 8],
301
+ [1, 6, 3],
302
+ [2, 5, 7],
303
+ [9, 22, 35],
304
+ [45, 67, 44],
305
+ [47, 68, 43],
306
+ [46, 69, 39],
307
+ [50, 70, 38],
308
+ [49, 71, 36]
309
+ ], 72);
310
+ var move_Ui = compose(move_U, move_U);
311
+ var move_X = Array(72).fill().map((_, i) => (i / 18 | 0) * 18 + (i + 9) % 18);
312
+ var move_Y = Array(72).fill().map((_, i) => (i / 36 | 0) * 36 + (i + 18) % 36);
313
+ var move_Z = Array(72).fill().map((_, i) => (i + 36) % 72);
314
+ var move_L = compose3(move_Z, move_Ui, move_Z);
315
+ var move_F = compose3(move_X, move_U, move_X);
316
+ var move_R = compose3(move_X, move_L, move_X);
317
+ var move_Us = permutation_from_cycles([
318
+ [10, 24, 30],
319
+ [11, 23, 34],
320
+ [12, 19, 33],
321
+ [42, 48, 64],
322
+ [41, 52, 65],
323
+ [37, 51, 66]
324
+ ], 72);
325
+ var move_Uw = compose(move_U, move_Us);
326
+ var move_Uwi = compose(move_Uw, move_Uw);
327
+ var move_Lw = compose3(move_Z, move_Uwi, move_Z);
328
+ var move_Fw = compose3(move_X, move_Uw, move_X);
329
+ var move_Rw = compose3(move_X, move_Lw, move_X);
330
+ var colour_map = Array(72).fill().map((_, i) => i / 9 | 0);
331
+ var corner_piece_facelets = [
332
+ [0, 45, 9, 36],
333
+ [4, 67, 22, 49],
334
+ [8, 44, 35, 71],
335
+ [13, 58, 31, 40],
336
+ [17, 53, 26, 62],
337
+ [18, 63, 27, 54]
338
+ ];
339
+ var edge_piece_facelets = [
340
+ [1, 46],
341
+ [3, 39],
342
+ [6, 69],
343
+ [10, 37],
344
+ [33, 42],
345
+ [12, 48],
346
+ [15, 60],
347
+ [24, 51],
348
+ [19, 64],
349
+ [28, 55],
350
+ [30, 66],
351
+ [21, 57]
352
+ ];
353
+ var centreA_piece_facelets = Array(12).fill().map((_, i) => (i / 3 | 0) * 9 + [2, 5, 7][i % 3]);
354
+ var centreB_piece_facelets = centreA_piece_facelets.map((x) => x + 36);
355
+ function identify_corner_piece(colourA, colourB) {
356
+ for (let i = 0; i < 6; i++) {
357
+ if (colourA === colour_map[corner_piece_facelets[i][0]] && colourB === colour_map[corner_piece_facelets[i][2]]) {
358
+ return [i, 0];
359
+ } else if (colourA === colour_map[corner_piece_facelets[i][2]] && colourB === colour_map[corner_piece_facelets[i][0]]) {
360
+ return [i, 1];
361
+ }
362
+ }
363
+ throw "unknown corner piece";
364
+ }
365
+ function identify_edge_piece(colourA, colourB) {
366
+ for (let i = 0; i < 12; i++) {
367
+ if (colourA === colour_map[edge_piece_facelets[i][0]] && colourB === colour_map[edge_piece_facelets[i][1]]) {
368
+ return i;
369
+ }
370
+ if (colourB === colour_map[edge_piece_facelets[i][0]] && colourA === colour_map[edge_piece_facelets[i][1]]) {
371
+ return i;
372
+ }
373
+ }
374
+ throw "unknown edge piece";
375
+ }
376
+ function get_corner_piece(facelets, location) {
377
+ return identify_corner_piece(facelets[corner_piece_facelets[location][0]], facelets[corner_piece_facelets[location][2]]);
378
+ }
379
+ function get_edge_piece(facelets, location) {
380
+ return identify_edge_piece(facelets[edge_piece_facelets[location][0]], facelets[edge_piece_facelets[location][1]]);
381
+ }
382
+ function set_corner_piece(facelets, location, value, orientation) {
383
+ let indices = corner_piece_facelets[location];
384
+ let colours = corner_piece_facelets[value].map((x) => colour_map[x]);
385
+ if (orientation % 2 !== 0) {
386
+ colours = [colours[2], colours[3], colours[0], colours[1]];
387
+ }
388
+ for (let i = 0; i < 4; i++) {
389
+ facelets[indices[i]] = colours[i];
390
+ }
391
+ }
392
+ function set_edge_piece(facelets, location, value) {
393
+ let indices = edge_piece_facelets[location];
394
+ let colours = edge_piece_facelets[value].map((x) => colour_map[x]);
395
+ for (let i = 0; i < 2; i++) {
396
+ facelets[indices[i]] = colours[i];
397
+ }
398
+ }
399
+ function convert_move_to_permutations(move) {
400
+ let state = move.map((x) => colour_map[x]);
401
+ let cp_raw = Array(6).fill().map((_, i) => get_corner_piece(state, i));
402
+ let cp_half = cp_raw.map(([p, o]) => p + 6 * o);
403
+ let cp = cp_half.concat(cp_half.map((x) => (x + 6) % 12));
404
+ let ep = Array(12).fill().map((_, i) => get_edge_piece(state, i));
405
+ let ap = Array(12).fill().map((_, i) => centreA_piece_facelets.indexOf(move[centreA_piece_facelets[i]]));
406
+ let bp = Array(12).fill().map((_, i) => centreB_piece_facelets.indexOf(move[centreB_piece_facelets[i]]));
407
+ return { cp, ep, ap, bp };
408
+ }
409
+ var moves = [
410
+ move_U,
411
+ move_L,
412
+ move_F,
413
+ move_R,
414
+ move_Uw,
415
+ move_Lw,
416
+ move_Fw,
417
+ move_Rw
418
+ ];
419
+ var move_names = ["U", "L", "F", "R", "u", "l", "f", "r"];
420
+ var move_permutations = moves.map(convert_move_to_permutations);
421
+ function random_state(randomUintBelow2) {
422
+ let facelets = Array(72);
423
+ let cp = random_even_permutation(5, randomUintBelow2);
424
+ cp.push(5);
425
+ let co = Array(4).fill().map((_) => randomUintBelow2(2));
426
+ co.push(co.reduce((x, y) => x ^ y));
427
+ co.push(0);
428
+ for (let i = 0; i < 6; i++) {
429
+ set_corner_piece(facelets, i, cp[i], co[i]);
430
+ }
431
+ let ep = random_even_permutation(12, randomUintBelow2);
432
+ for (let i = 0; i < 12; i++) {
433
+ set_edge_piece(facelets, i, ep[i]);
434
+ }
435
+ let a = random_permutation(12, randomUintBelow2).map((x) => x / 3 | 0);
436
+ let b = random_permutation(12, randomUintBelow2).map((x) => 4 + (x / 3 | 0));
437
+ for (let i = 0; i < 12; i++) {
438
+ facelets[centreA_piece_facelets[i]] = a[i];
439
+ facelets[centreB_piece_facelets[i]] = b[i];
440
+ }
441
+ return facelets;
442
+ }
443
+ function stringify_move_sequence(move_sequence, no_wide = false) {
444
+ if (no_wide) {
445
+ const U = 0, L = 1, F = 2, R = 3, D = 4, BR = 5, B = 6, BL = 7;
446
+ move_sequence = move_sequence.map((x) => x.slice());
447
+ let ordering = [U, L, F, R, D, BR, B, BL];
448
+ let rotations = [
449
+ [U, R, BR, B, D, BL, L, F],
450
+ [BL, L, U, B, R, BR, D, F],
451
+ [BL, D, F, L, R, U, B, BR],
452
+ [F, D, BR, R, B, U, L, BL]
453
+ ];
454
+ rotations = rotations.concat(rotations.map((p) => invert_permutation(p)));
455
+ for (let i = 0; i < move_sequence.length; i++) {
456
+ if (move_sequence[i][0] < 4) {
457
+ move_sequence[i][0] = ordering[move_sequence[i][0]];
458
+ } else {
459
+ let m = ordering[move_sequence[i][0]];
460
+ let r = move_sequence[i][1];
461
+ move_sequence[i][0] = m;
462
+ ordering = compose(r === 1 ? rotations[m ^ 4] : rotations[m], ordering);
463
+ }
464
+ }
465
+ }
466
+ let names = no_wide ? "U L F R D BR B BL".split(" ") : move_names;
467
+ let suffixes = ["0", "", "'"];
468
+ let s = move_sequence.map(([m, r]) => names[m] + suffixes[r]);
469
+ return s.join(" ");
470
+ }
471
+ function apply_move_sequence(state, move_sequence) {
472
+ for (let [m, r] of move_sequence) {
473
+ for (let i = 0; i < r; i++) {
474
+ state = compose(state, moves[m]);
475
+ }
476
+ }
477
+ return state;
478
+ }
479
+ function invert_move_sequence(move_sequence) {
480
+ return move_sequence.map(([m, r]) => [m, (3 - r) % 3]).reverse();
481
+ }
482
+ function simplify_move_sequence(move_sequence, make_noise = false) {
483
+ if (move_sequence.length === 0) {
484
+ return [];
485
+ }
486
+ let simplified = [];
487
+ let last_move = void 0;
488
+ for (let [m, r] of move_sequence) {
489
+ if (last_move && last_move[0] === m) {
490
+ last_move[1] += r;
491
+ last_move[1] %= 3;
492
+ if (last_move[1] === 0) {
493
+ simplified.pop();
494
+ last_move = simplified.length === 0 ? void 0 : simplified[simplified.length - 1];
495
+ }
496
+ } else if (simplified.length >= 2 && (last_move[0] ^ m) === 4 && simplified[simplified.length - 2][0] === m) {
497
+ simplified[simplified.length - 2][1] += r;
498
+ simplified[simplified.length - 2][1] %= 3;
499
+ if (simplified[simplified.length - 2][1] === 0) {
500
+ simplified.splice(simplified.length - 2, 1);
501
+ }
502
+ } else {
503
+ last_move = [m, r];
504
+ simplified.push(last_move);
505
+ }
506
+ }
507
+ if (make_noise && "" + move_sequence !== "" + simplified) {
508
+ console.log(`simplified ${move_sequence} to ${simplified}`);
509
+ }
510
+ return simplified;
511
+ }
512
+ function generate_random_state_scramble(randomUintBelow2) {
513
+ return stringify_move_sequence(invert_move_sequence(solve(random_state(randomUintBelow2), true)), true);
514
+ }
515
+ function generate_mtable_comb4_generic(n, k0, k1, k2, k3, permutations) {
516
+ let N = C4(n, k0, k1, k2, k3);
517
+ let nmoves = permutations.length;
518
+ let [itc, cti] = generate_comb4_lookup_tables(n, k0, k1, k2, k3);
519
+ let mtable = Array(nmoves).fill().map(() => new Uint32Array(N));
520
+ for (let i = 0; i < N; i++) {
521
+ let c = itc[i];
522
+ let arr = Array(n);
523
+ for (let j = 0; j < n; j++) {
524
+ arr[j] = c >> 2 * j & 3;
525
+ }
526
+ for (let m = 0; m < nmoves; m++) {
527
+ let arr2 = compose(arr, permutations[m]);
528
+ let c2 = arr2.reduce((acc, x, j) => acc | x << 2 * j, 0);
529
+ mtable[m][i] = cti[c2];
530
+ }
531
+ }
532
+ return mtable;
533
+ }
534
+ function generate_mtable_single_generic(permutations) {
535
+ let n = permutations[0].length;
536
+ let nmoves = permutations.length;
537
+ let mtable = Array(nmoves).fill().map(() => new Uint32Array(n));
538
+ for (let i = 0; i < n; i++) {
539
+ for (let m = 0; m < nmoves; m++) {
540
+ mtable[m][permutations[m][i]] = i;
541
+ }
542
+ }
543
+ return mtable;
544
+ }
545
+ function combine_mtables(mtable0, mtable1) {
546
+ let n0 = mtable0[0].length;
547
+ let n1 = mtable1[0].length;
548
+ let nmoves = mtable0.length;
549
+ let combined = Array(nmoves).fill().map(() => new Uint32Array(n0 * n1));
550
+ for (let j = 0; j < n1; j++) {
551
+ for (let i = 0; i < n0; i++) {
552
+ let index = i + n0 * j;
553
+ for (let m = 0; m < nmoves; m++) {
554
+ combined[m][index] = mtable0[m][i] + n0 * mtable1[m][j];
555
+ }
556
+ }
557
+ }
558
+ return combined;
559
+ }
560
+ function trim_unreachable(mtable, origin) {
561
+ let nmoves = mtable.length;
562
+ let n = mtable[0].length;
563
+ let reachable = new Uint8Array(n);
564
+ reachable[origin] = 1;
565
+ let done = false;
566
+ while (!done) {
567
+ done = true;
568
+ for (let i = 0; i < n; i++) {
569
+ if (!reachable[i]) {
570
+ continue;
571
+ }
572
+ for (let m = 0; m < nmoves; m++) {
573
+ if (!reachable[mtable[m][i]]) {
574
+ reachable[mtable[m][i]] = 1;
575
+ done = false;
576
+ }
577
+ }
578
+ }
579
+ }
580
+ let map = new Int32Array(n).fill(-1);
581
+ for (let i = 0, counter = 0; i < n; i++) {
582
+ if (!reachable[i]) {
583
+ continue;
584
+ }
585
+ map[i] = counter;
586
+ counter++;
587
+ }
588
+ return [mtable.map((entry) => reduce_permutation(entry, reachable)), map];
589
+ }
590
+ function reduce_to_quotient(mtable, origins) {
591
+ let nmoves = mtable.length;
592
+ let n = mtable[0].length;
593
+ let quotient_map = new Int32Array(n).fill(-1);
594
+ origins.forEach((x) => {
595
+ quotient_map[x] = 0;
596
+ });
597
+ let preimages = [origins];
598
+ for (let image = 0; image < preimages.length; image++) {
599
+ let equiv_class = preimages[image];
600
+ for (let m = 0; m < nmoves; m++) {
601
+ let j = mtable[m][equiv_class[0]];
602
+ if (quotient_map[j] !== -1) {
603
+ continue;
604
+ }
605
+ let new_equiv_class = equiv_class.map((x) => mtable[m][x]);
606
+ let new_image = preimages.length;
607
+ preimages.push(new_equiv_class);
608
+ for (let x of new_equiv_class) {
609
+ if (quotient_map[x] !== -1) {
610
+ throw "quotienting failed";
611
+ }
612
+ quotient_map[x] = new_image;
613
+ }
614
+ }
615
+ }
616
+ let n_quot = preimages.length;
617
+ let mtable_quot = Array(nmoves).fill().map(() => new Int32Array(n_quot));
618
+ for (let m = 0; m < nmoves; m++) {
619
+ for (let i = 0; i < n_quot; i++) {
620
+ mtable_quot[m][i] = quotient_map[mtable[m][preimages[i][0]]];
621
+ }
622
+ }
623
+ return [mtable_quot, quotient_map];
624
+ }
625
+ function generate_mirrored_coordinate_table(mtable, a, b) {
626
+ let n = mtable[0].length;
627
+ let nmoves = mtable.length;
628
+ let mirror_map = new Int32Array(n).fill(-1);
629
+ mirror_map[a] = b;
630
+ mirror_map[b] = a;
631
+ let done = false;
632
+ while (!done) {
633
+ done = true;
634
+ for (let i = 0; i < n; i++) {
635
+ if (mirror_map[i] === -1) {
636
+ continue;
637
+ }
638
+ let I = mirror_map[i];
639
+ for (let m = 0; m < nmoves; m++) {
640
+ let M = m ^ 1;
641
+ let new_i = mtable[m][i];
642
+ let new_I = mtable[M][mtable[M][I]];
643
+ if (mirror_map[new_i] === -1) {
644
+ done = false;
645
+ mirror_map[new_i] = new_I;
646
+ mirror_map[new_I] = new_i;
647
+ } else if (mirror_map[new_i] !== new_I) {
648
+ throw "mirroring failed - is the initial map correct?";
649
+ }
650
+ }
651
+ }
652
+ }
653
+ return mirror_map;
654
+ }
655
+ function bfs(mtable, goal_states) {
656
+ let N = mtable[0].length;
657
+ let nmoves = mtable.length;
658
+ let ptable = new Int8Array(N).fill(-1);
659
+ for (let state of goal_states) {
660
+ ptable[state] = 0;
661
+ }
662
+ let depth = 0;
663
+ let done = false;
664
+ while (!done) {
665
+ done = true;
666
+ for (let state = 0; state < N; state++) {
667
+ if (ptable[state] !== depth) {
668
+ continue;
669
+ }
670
+ for (let move_index = 0; move_index < nmoves; move_index++) {
671
+ let new_state = mtable[move_index][state];
672
+ while (new_state !== state) {
673
+ if (ptable[new_state] === -1) {
674
+ done = false;
675
+ ptable[new_state] = depth + 1;
676
+ }
677
+ new_state = mtable[move_index][new_state];
678
+ }
679
+ }
680
+ }
681
+ depth++;
682
+ }
683
+ return ptable;
684
+ }
685
+ function solve(facelets, readable = false) {
686
+ let phase1sol = solve_phase1_gen(facelets).next().value;
687
+ let facelets2 = apply_move_sequence(facelets, phase1sol);
688
+ let phase2sol = (readable ? solve_phase2_and_phase3_readable : solve_phase2_and_phase3_fast)(facelets2);
689
+ let solution = simplify_move_sequence(phase1sol.concat(phase2sol), false);
690
+ if (apply_move_sequence(facelets, solution).join("") !== solved_state.join("")) {
691
+ console.log("solving failed!");
692
+ console.log(facelets);
693
+ console.log(phase1sol);
694
+ console.log(facelets2);
695
+ console.log(phase2sol);
696
+ console.log(apply_move_sequence(facelets, solution));
697
+ }
698
+ return solution;
699
+ }
700
+ var cached_mtables = {};
701
+ var cached_ptables = {};
702
+ var phase1_centre_colour_map = [0, 0, 2, 3, 0, 0, 2, 3];
703
+ function index_phase1(facelets) {
704
+ let [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);
705
+ let ep = Array(12).fill().map((_, i) => get_edge_piece(facelets, i));
706
+ let edge_coord = ep.indexOf(8) + 12 * ep.indexOf(9) + 12 ** 2 * ep.indexOf(10) + 12 ** 3 * ep.indexOf(11);
707
+ let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map((facelet_indices) => {
708
+ let arr = facelet_indices.map((x) => phase1_centre_colour_map[facelets[x]]);
709
+ return cti[arr.reduce((acc, x, j) => acc | x << 2 * j, 0)];
710
+ });
711
+ return [edge_coord, a_coord, b_coord];
712
+ }
713
+ function generate_phase1_edge_mtable() {
714
+ if (cached_mtables.phase1_edge) {
715
+ return cached_mtables.phase1_edge;
716
+ }
717
+ let m1 = generate_mtable_single_generic(move_permutations.map((x) => x.ep));
718
+ let m2 = combine_mtables(m1, m1);
719
+ let m4 = combine_mtables(m2, m2);
720
+ return cached_mtables.phase1_edge = m4;
721
+ }
722
+ function generate_phase1_edge_ptable() {
723
+ if (cached_ptables.phase1_edge) {
724
+ return cached_ptables.phase1_edge;
725
+ }
726
+ return cached_ptables.phase1_edge = bfs(generate_phase1_edge_mtable(), [
727
+ 8 + 12 * 9 + 12 ** 2 * 10 + 12 ** 3 * 11
728
+ ]);
729
+ }
730
+ function generate_phase1_centreA_mtable() {
731
+ if (cached_mtables.phase1_centreA) {
732
+ return cached_mtables.phase1_centreA;
733
+ }
734
+ return cached_mtables.phase1_centreA = generate_mtable_comb4_generic(12, 6, 0, 3, 3, move_permutations.map((x) => x.ap));
735
+ }
736
+ function generate_phase1_centreB_mtable() {
737
+ if (cached_mtables.phase1_centreB) {
738
+ return cached_mtables.phase1_centreB;
739
+ }
740
+ return cached_mtables.phase1_centreB = generate_mtable_comb4_generic(12, 6, 0, 3, 3, move_permutations.map((x) => x.bp));
741
+ }
742
+ function generate_phase1_centre_ptable() {
743
+ if (cached_ptables.phase1_centre) {
744
+ return cached_ptables.phase1_centre;
745
+ }
746
+ let [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);
747
+ let goal_states = itc.filter((x) => {
748
+ let x6 = x >> 12 & 3;
749
+ let x9 = x >> 18 & 3;
750
+ return x6 === 2 && x9 === 3;
751
+ }).map((x) => cti[x]);
752
+ return cached_ptables.phase1_centre = bfs(generate_phase1_centreB_mtable(), goal_states);
753
+ }
754
+ function* solve_phase1_gen(facelets) {
755
+ let mtables = [
756
+ generate_phase1_edge_mtable(),
757
+ generate_phase1_centreA_mtable(),
758
+ generate_phase1_centreB_mtable()
759
+ ];
760
+ let ptables = [
761
+ generate_phase1_edge_ptable(),
762
+ generate_phase1_centre_ptable(),
763
+ generate_phase1_centre_ptable()
764
+ ];
765
+ yield* phase1_ida_solve_gen(index_phase1(facelets), mtables, ptables, 15);
766
+ }
767
+ function* phase1_ida_solve_gen(indices, mtables, ptables, moves_left) {
768
+ let ncoords = indices.length;
769
+ let bound = 0;
770
+ for (let i = 0; i < ncoords; i++)
771
+ bound = Math.max(bound, ptables[i][indices[i]]);
772
+ while (bound <= moves_left) {
773
+ yield* phase1_ida_search_gen(indices, mtables, ptables, bound, -1);
774
+ bound++;
775
+ }
776
+ }
777
+ function* phase1_ida_search_gen(indices, mtables, ptables, bound, last) {
778
+ let ncoords = 3;
779
+ let nmoves = 8;
780
+ let heuristic = Math.max(ptables[0][indices[0]], ptables[1][indices[1]], ptables[2][indices[2]]);
781
+ if (heuristic > bound)
782
+ return;
783
+ if (bound === 0) {
784
+ yield [];
785
+ return;
786
+ }
787
+ if (heuristic === 0 && bound === 1)
788
+ return;
789
+ for (let m = 0; m < nmoves; m++) {
790
+ if (m === last)
791
+ continue;
792
+ if (m === last - 4)
793
+ continue;
794
+ let new_indices = [];
795
+ new_indices[0] = mtables[0][m][indices[0]];
796
+ new_indices[1] = mtables[1][m][indices[1]];
797
+ new_indices[2] = mtables[2][m][indices[2]];
798
+ let r = 1;
799
+ while (indices.some((_, i) => indices[i] != new_indices[i])) {
800
+ let subpath_gen = phase1_ida_search_gen(new_indices, mtables, ptables, bound - 1, m);
801
+ while (true) {
802
+ let { value: subpath, done } = subpath_gen.next();
803
+ if (done)
804
+ break;
805
+ yield [[m, r]].concat(subpath);
806
+ }
807
+ new_indices[0] = mtables[0][m][new_indices[0]];
808
+ new_indices[1] = mtables[1][m][new_indices[1]];
809
+ new_indices[2] = mtables[2][m][new_indices[2]];
810
+ r++;
811
+ }
812
+ }
813
+ }
814
+ var phase2_centre_colour_map = [0, 1, 2, 0, 0, 1, 2, 0];
815
+ var phase2_centre_indices = [0, 1, 2, 3, 4, 5, 7, 8, 10, 11];
816
+ var phase2_keep = [
817
+ true,
818
+ true,
819
+ true,
820
+ true,
821
+ true,
822
+ true,
823
+ false,
824
+ true,
825
+ true,
826
+ false,
827
+ true,
828
+ true
829
+ ];
830
+ function index_phase2(facelets) {
831
+ let [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);
832
+ let ep = Array(8).fill().map((_, i) => get_edge_piece(facelets, i));
833
+ let edge_coord = ep.indexOf(5) + 8 * ep.indexOf(6) + 8 ** 2 * ep.indexOf(7);
834
+ let corners = Array(5).fill().map((_, i) => get_corner_piece(facelets, i));
835
+ let cp_inverse_full = invert_permutation(corners.map(([p, o]) => p + 5 * o).concat(corners.map(([p, o]) => p + 5 * (o ^ 1))));
836
+ let cp_inverse = cp_inverse_full.slice(0, 5).map((x) => x % 5);
837
+ let co_inverse = cp_inverse_full.slice(0, 5).map((x) => x / 5 | 0);
838
+ let corner_coord = evenpermutation_to_index(cp_inverse) * 8 + (co_inverse[0] ^ co_inverse[2]) + 2 * (co_inverse[0] ^ co_inverse[3]) + 4 * co_inverse[4];
839
+ let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map((facelet_indices) => {
840
+ let arr = compose(facelet_indices, phase2_centre_indices).map((x) => phase2_centre_colour_map[facelets[x]]);
841
+ return cti[arr.reduce((acc, x, j) => acc | x << 2 * j, 0)];
842
+ });
843
+ generate_phase2_edge_mtable();
844
+ generate_phase2_corner_mtable_compact();
845
+ return [
846
+ a_coord,
847
+ b_coord,
848
+ phase2_corner_reduction_map[corner_coord] + 40 * phase2_edge_reduction_map[edge_coord]
849
+ ];
850
+ }
851
+ function* solve_phase2_gen(facelets) {
852
+ yield* phase2_ida_solve_gen(index_phase2(facelets), 30);
853
+ }
854
+ function generate_phase2_centre_mtables() {
855
+ if (cached_mtables.phase2_centre) {
856
+ return cached_mtables.phase2_centre;
857
+ }
858
+ let a = generate_mtable_comb4_generic(10, 5, 3, 2, 0, move_permutations.slice(0, 4).map((x) => reduce_permutation(x.ap, phase2_keep)));
859
+ let b = generate_mtable_comb4_generic(10, 5, 3, 2, 0, move_permutations.slice(0, 4).map((x) => reduce_permutation(x.bp, phase2_keep)));
860
+ return cached_mtables.phase2_centre = [a, b];
861
+ }
862
+ var phase2_edge_reduction_map;
863
+ function generate_phase2_edge_mtable() {
864
+ if (cached_mtables.phase2_edge) {
865
+ return cached_mtables.phase2_edge;
866
+ }
867
+ let e = generate_mtable_single_generic(move_permutations.slice(0, 4).map((x) => x.ep.slice(0, 8)));
868
+ let eee = combine_mtables(e, combine_mtables(e, e));
869
+ let eee_trimmed;
870
+ [eee_trimmed, phase2_edge_reduction_map] = trim_unreachable(eee, 501);
871
+ return cached_mtables.phase2_edge = eee_trimmed;
872
+ }
873
+ function generate_phase2_corner_mtable() {
874
+ if (cached_mtables.phase2_corner) {
875
+ return cached_mtables.phase2_corner;
876
+ }
877
+ const HALFFACT5 = factorial(5) / 2;
878
+ const N = HALFFACT5 * 8;
879
+ const keep = [
880
+ true,
881
+ true,
882
+ true,
883
+ true,
884
+ true,
885
+ false,
886
+ true,
887
+ true,
888
+ true,
889
+ true,
890
+ true,
891
+ false
892
+ ];
893
+ let mtable = Array(4).fill().map(() => new Uint32Array(N));
894
+ let permutations = move_permutations.slice(0, 4).map((x) => invert_permutation(reduce_permutation(x.cp, keep)));
895
+ for (let i = 0; i < N; i++) {
896
+ let p = index_to_evenpermutation(i >> 3, 5);
897
+ let o = [0, 0, i & 1, i >> 1 & 1, i >> 2 & 1];
898
+ o[1] = o[2] ^ o[3] ^ o[4];
899
+ let cp = Array(10);
900
+ for (let j = 0; j < 5; j++) {
901
+ cp[j] = p[j] + 5 * o[j];
902
+ cp[j + 5] = p[j] + 5 * (o[j] ^ 1);
903
+ }
904
+ for (let m = 0; m < 4; m++) {
905
+ let cp2 = compose(permutations[m], cp);
906
+ let p2 = cp2.slice(0, 5).map((x) => x % 5);
907
+ let o2 = cp2.slice(0, 5).map((x) => x / 5 | 0);
908
+ let orientation_index = (o2[0] ^ o2[2]) + 2 * (o2[0] ^ o2[3]) + 4 * o2[4];
909
+ mtable[m][i] = evenpermutation_to_index(p2) * 8 + orientation_index;
910
+ }
911
+ }
912
+ return cached_mtables.phase2_corner = mtable;
913
+ }
914
+ var phase2_corner_reduction_map;
915
+ function generate_phase2_corner_mtable_compact() {
916
+ if (cached_mtables.phase2_corner_compact) {
917
+ return cached_mtables.phase2_corner_compact;
918
+ }
919
+ [cached_mtables.phase2_corner_compact, phase2_corner_reduction_map] = reduce_to_quotient(generate_phase2_corner_mtable(), phase2_corner_goal_states());
920
+ return cached_mtables.phase2_corner_compact;
921
+ }
922
+ function generate_phase2_ce_mtable() {
923
+ if (cached_mtables.phase2_ce) {
924
+ return cached_mtables.phase2_ce;
925
+ }
926
+ let c = generate_phase2_corner_mtable_compact();
927
+ let e = generate_phase2_edge_mtable();
928
+ return cached_mtables.phase2_ce = combine_mtables(c, e);
929
+ }
930
+ var phase2_ce_mirror_map;
931
+ function generate_phase2_ce_mirror_map() {
932
+ if (phase2_ce_mirror_map) {
933
+ return phase2_ce_mirror_map;
934
+ }
935
+ const ce_solved = index_phase2(solved_state)[2];
936
+ return phase2_ce_mirror_map = generate_mirrored_coordinate_table(generate_phase2_ce_mtable(), ce_solved, ce_solved);
937
+ }
938
+ function phase2_centre_goal_states() {
939
+ let [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);
940
+ return itc.filter((x) => (x >> 10 & 63) === 41).map((x) => cti[x]);
941
+ }
942
+ function phase2_corner_goal_states() {
943
+ let mtable = generate_phase2_corner_mtable();
944
+ let N = mtable[0].length;
945
+ let flags = Array(N).fill(false);
946
+ flags[0] = true;
947
+ let done = false;
948
+ while (!done) {
949
+ done = true;
950
+ for (let i = 0; i < N; i++) {
951
+ if (flags[i]) {
952
+ if (!flags[mtable[0][i]]) {
953
+ done = false;
954
+ flags[mtable[0][i]] = true;
955
+ }
956
+ if (!flags[mtable[1][i]]) {
957
+ done = false;
958
+ flags[mtable[1][i]] = true;
959
+ }
960
+ }
961
+ }
962
+ }
963
+ return flags.map((_, i) => i).filter((i) => flags[i]);
964
+ }
965
+ function generate_phase2_ace_ptable() {
966
+ if (cached_ptables.phase2_ace) {
967
+ return cached_ptables.phase2_ace;
968
+ }
969
+ const [mtable_a, mtable_b] = generate_phase2_centre_mtables();
970
+ const mtable_ce = generate_phase2_ce_mtable();
971
+ const Na = 2520;
972
+ const Nce = 40 * 336;
973
+ const N = Na * Nce;
974
+ const ce_solved = index_phase2(solved_state)[2];
975
+ const max_depth = 9;
976
+ let ptable = new Int8Array(N).fill(max_depth);
977
+ for (let a_solved of phase2_centre_goal_states()) {
978
+ ptable[a_solved + Na * ce_solved] = 0;
979
+ }
980
+ for (let depth = 0; depth < max_depth - 1; depth++) {
981
+ for (let state = ptable.indexOf(depth); state !== -1; state = ptable.indexOf(depth, state + 1)) {
982
+ let a = state % Na, ce = state / Na | 0;
983
+ for (let move_index = 0; move_index < 4; move_index++) {
984
+ let new_a = mtable_a[move_index][a];
985
+ let new_ce = mtable_ce[move_index][ce];
986
+ let new_state = new_a + Na * new_ce;
987
+ if (ptable[new_state] === max_depth) {
988
+ ptable[new_state] = depth + 1;
989
+ }
990
+ new_a = mtable_a[move_index][new_a];
991
+ new_ce = mtable_ce[move_index][new_ce];
992
+ new_state = new_a + Na * new_ce;
993
+ if (ptable[new_state] === max_depth) {
994
+ ptable[new_state] = depth + 1;
995
+ }
996
+ }
997
+ }
998
+ }
999
+ return cached_ptables.phase2_ace = ptable;
1000
+ }
1001
+ function* phase2_ida_solve_gen(indices, moves_left) {
1002
+ let [mtable_a, mtable_b] = generate_phase2_centre_mtables();
1003
+ let mtable_ce = generate_phase2_ce_mtable();
1004
+ let ptable_ace = generate_phase2_ace_ptable();
1005
+ let mirror_map = generate_phase2_ce_mirror_map();
1006
+ let [a, b, ce] = indices;
1007
+ let ce_mirror = mirror_map[ce];
1008
+ let bound = Math.max(ptable_ace[a + 2520 * ce], ptable_ace[b + 2520 * ce_mirror]);
1009
+ while (bound <= moves_left) {
1010
+ yield* phase2_ida_search_gen(a, b, ce, mtable_a, mtable_b, mtable_ce, ptable_ace, mirror_map, bound, -1);
1011
+ bound++;
1012
+ }
1013
+ }
1014
+ function* phase2_ida_search_gen(a, b, ce, mtable_a, mtable_b, mtable_ce, ptable_ace, mirror_map, bound, last) {
1015
+ let h = Math.max(ptable_ace[a + 2520 * ce], ptable_ace[b + 2520 * mirror_map[ce]]);
1016
+ if (h > bound) {
1017
+ return;
1018
+ }
1019
+ if (bound === 0) {
1020
+ yield [];
1021
+ return;
1022
+ } else if (h === 0) {
1023
+ return;
1024
+ }
1025
+ for (let m = 0; m < 4; m++) {
1026
+ if (m === last)
1027
+ continue;
1028
+ let new_a = a, new_b = b, new_ce = ce;
1029
+ for (let r = 1; r <= 2; r++) {
1030
+ new_a = mtable_a[m][new_a];
1031
+ new_b = mtable_b[m][new_b];
1032
+ new_ce = mtable_ce[m][new_ce];
1033
+ let subpath_gen = phase2_ida_search_gen(new_a, new_b, new_ce, mtable_a, mtable_b, mtable_ce, ptable_ace, mirror_map, bound - 1, m);
1034
+ while (true) {
1035
+ let { value: subpath, done } = subpath_gen.next();
1036
+ if (done)
1037
+ break;
1038
+ yield [[m, r]].concat(subpath);
1039
+ }
1040
+ }
1041
+ }
1042
+ }
1043
+ var phase3_2gen_centre_indices = [0, 1, 2, 3, 4, 10, 11];
1044
+ var phase3_2gen_keep = [
1045
+ true,
1046
+ true,
1047
+ true,
1048
+ true,
1049
+ true,
1050
+ false,
1051
+ false,
1052
+ false,
1053
+ false,
1054
+ false,
1055
+ true,
1056
+ true
1057
+ ];
1058
+ var phase3_2gen_move_seqs = [
1059
+ [[0, 1]],
1060
+ [[1, 1]],
1061
+ [
1062
+ [2, 1],
1063
+ [0, 1],
1064
+ [3, 1],
1065
+ [0, 2],
1066
+ [3, 2],
1067
+ [2, 2]
1068
+ ],
1069
+ [
1070
+ [3, 2],
1071
+ [1, 2],
1072
+ [2, 2],
1073
+ [1, 1],
1074
+ [2, 1],
1075
+ [3, 1]
1076
+ ],
1077
+ [
1078
+ [6, 1],
1079
+ [0, 1],
1080
+ [3, 1],
1081
+ [0, 2],
1082
+ [3, 2],
1083
+ [6, 2]
1084
+ ],
1085
+ [
1086
+ [7, 2],
1087
+ [1, 2],
1088
+ [2, 2],
1089
+ [1, 1],
1090
+ [2, 1],
1091
+ [7, 1]
1092
+ ],
1093
+ [
1094
+ [2, 1],
1095
+ [0, 1],
1096
+ [2, 2],
1097
+ [0, 1],
1098
+ [2, 1],
1099
+ [0, 1],
1100
+ [2, 2]
1101
+ ],
1102
+ [
1103
+ [3, 2],
1104
+ [1, 1],
1105
+ [3, 1],
1106
+ [1, 1],
1107
+ [3, 2],
1108
+ [1, 1],
1109
+ [3, 1]
1110
+ ],
1111
+ [
1112
+ [2, 1],
1113
+ [3, 1],
1114
+ [2, 2],
1115
+ [1, 2],
1116
+ [0, 2],
1117
+ [2, 1],
1118
+ [3, 1],
1119
+ [2, 2]
1120
+ ],
1121
+ [
1122
+ [3, 2],
1123
+ [2, 2],
1124
+ [3, 1],
1125
+ [0, 1],
1126
+ [1, 1],
1127
+ [3, 2],
1128
+ [2, 2],
1129
+ [3, 1]
1130
+ ],
1131
+ [
1132
+ [6, 1],
1133
+ [0, 1],
1134
+ [6, 2],
1135
+ [0, 2],
1136
+ [1, 2],
1137
+ [6, 1],
1138
+ [0, 1],
1139
+ [6, 2]
1140
+ ],
1141
+ [
1142
+ [7, 2],
1143
+ [1, 2],
1144
+ [7, 1],
1145
+ [1, 1],
1146
+ [0, 1],
1147
+ [7, 2],
1148
+ [1, 2],
1149
+ [7, 1]
1150
+ ],
1151
+ [
1152
+ [2, 1],
1153
+ [3, 2],
1154
+ [2, 2],
1155
+ [3, 1],
1156
+ [0, 1],
1157
+ [2, 2],
1158
+ [1, 1],
1159
+ [2, 1]
1160
+ ],
1161
+ [
1162
+ [3, 2],
1163
+ [2, 1],
1164
+ [3, 1],
1165
+ [2, 2],
1166
+ [1, 2],
1167
+ [3, 1],
1168
+ [0, 2],
1169
+ [3, 2]
1170
+ ],
1171
+ [
1172
+ [6, 1],
1173
+ [0, 2],
1174
+ [6, 2],
1175
+ [7, 1],
1176
+ [6, 1],
1177
+ [1, 2],
1178
+ [7, 1],
1179
+ [6, 1]
1180
+ ],
1181
+ [
1182
+ [7, 2],
1183
+ [1, 1],
1184
+ [7, 1],
1185
+ [6, 2],
1186
+ [7, 2],
1187
+ [0, 1],
1188
+ [6, 2],
1189
+ [7, 2]
1190
+ ],
1191
+ [
1192
+ [2, 2],
1193
+ [1, 2],
1194
+ [2, 2],
1195
+ [3, 2],
1196
+ [2, 2],
1197
+ [3, 2],
1198
+ [0, 2],
1199
+ [3, 2]
1200
+ ],
1201
+ [
1202
+ [6, 2],
1203
+ [7, 2],
1204
+ [1, 2],
1205
+ [0, 2],
1206
+ [1, 2],
1207
+ [0, 2],
1208
+ [6, 2],
1209
+ [7, 2]
1210
+ ]
1211
+ ];
1212
+ phase3_2gen_move_seqs = phase3_2gen_move_seqs.concat(phase3_2gen_move_seqs.map((seq) => invert_move_sequence(seq)));
1213
+ var phase3_2gen_nmoves = phase3_2gen_move_seqs.length;
1214
+ var phase3_2gen_facelet_permutations = phase3_2gen_move_seqs.map((seq) => apply_move_sequence(permutation_from_cycles([], 72), seq));
1215
+ var phase3_2gen_piece_permutations = phase3_2gen_facelet_permutations.map(convert_move_to_permutations);
1216
+ var phase3_2gen_move_orders = phase3_2gen_facelet_permutations.map(permutation_order);
1217
+ function index_phase3_2gen(facelets) {
1218
+ let [itc, cti] = generate_comb4_lookup_tables(7, 3, 2, 0, 2);
1219
+ let ep = Array(5).fill().map((_, i) => get_edge_piece(facelets, i));
1220
+ let edge_coord = evenpermutation_to_index(ep);
1221
+ let corners = Array(4).fill().map((_, i) => get_corner_piece(facelets, i));
1222
+ let corner_coord = evenpermutation_to_index(corners.map((x) => x[0])) * 2 + corners.find((x) => x[0] === 0)[1];
1223
+ let [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map((facelet_indices) => {
1224
+ let arr = compose(facelet_indices, phase3_2gen_centre_indices).map((x) => facelets[x] % 4);
1225
+ return cti[arr.reduce((acc, x, j) => acc | x << 2 * j, 0)];
1226
+ });
1227
+ return [a_coord + 210 * b_coord, corner_coord + 24 * edge_coord];
1228
+ }
1229
+ function generate_phase3_2gen_edge_mtable() {
1230
+ if (cached_mtables.phase3_2gen_edge) {
1231
+ return cached_mtables.phase3_2gen_edge;
1232
+ }
1233
+ const HALFFACT5 = factorial(5) / 2;
1234
+ let mtable = Array(phase3_2gen_nmoves).fill().map(() => new Uint32Array(HALFFACT5));
1235
+ let permutations = phase3_2gen_piece_permutations.map((x) => x.ep.slice(0, 5));
1236
+ for (let i = 0; i < HALFFACT5; i++) {
1237
+ let p = index_to_evenpermutation(i, 5);
1238
+ for (let m = 0; m < phase3_2gen_nmoves; m++) {
1239
+ mtable[m][i] = evenpermutation_to_index(compose(p, permutations[m]));
1240
+ }
1241
+ }
1242
+ return cached_mtables.phase3_2gen_edge = mtable;
1243
+ }
1244
+ function generate_phase3_2gen_corner_mtable() {
1245
+ if (cached_mtables.phase3_2gen_corner) {
1246
+ return cached_mtables.phase3_2gen_corner;
1247
+ }
1248
+ const HALFFACT4 = factorial(4) / 2;
1249
+ const N = HALFFACT4 * 2;
1250
+ const keep = [
1251
+ true,
1252
+ true,
1253
+ true,
1254
+ true,
1255
+ false,
1256
+ false,
1257
+ true,
1258
+ true,
1259
+ true,
1260
+ true,
1261
+ false,
1262
+ false
1263
+ ];
1264
+ let mtable = Array(phase3_2gen_nmoves).fill().map(() => new Uint32Array(N));
1265
+ let permutations = phase3_2gen_piece_permutations.map((x) => reduce_permutation(x.cp, keep).slice(0, 4));
1266
+ for (let i = 0; i < N; i += 2) {
1267
+ let p = index_to_evenpermutation(i >> 1, 4);
1268
+ let cp = p.concat(p.map((x) => x + 4));
1269
+ for (let m = 0; m < phase3_2gen_nmoves; m++) {
1270
+ let cp2 = compose(cp, permutations[m]);
1271
+ let p2 = cp2.map((x) => x % 4);
1272
+ let o2 = cp2.find((x) => x % 4 === 0) >> 2;
1273
+ mtable[m][i] = evenpermutation_to_index(p2) * 2 + o2;
1274
+ mtable[m][i + 1] = evenpermutation_to_index(p2) * 2 + (o2 ^ 1);
1275
+ }
1276
+ }
1277
+ return cached_mtables.phase3_2gen_corner = mtable;
1278
+ }
1279
+ function generate_phase3_2gen_corneredge_mtable() {
1280
+ if (cached_mtables.phase3_2gen_corneredge) {
1281
+ return cached_mtables.phase3_2gen_corneredge;
1282
+ }
1283
+ return cached_mtables.phase3_2gen_corneredge = combine_mtables(generate_phase3_2gen_corner_mtable(), generate_phase3_2gen_edge_mtable());
1284
+ }
1285
+ function generate_phase3_2gen_centre_mtable() {
1286
+ if (cached_mtables.phase3_2gen_centre) {
1287
+ return cached_mtables.phase3_2gen_centre;
1288
+ }
1289
+ let mtable_a = generate_mtable_comb4_generic(7, 3, 2, 0, 2, phase3_2gen_piece_permutations.map((x) => reduce_permutation(x.ap, phase3_2gen_keep)));
1290
+ let mtable_b = generate_mtable_comb4_generic(7, 3, 2, 0, 2, phase3_2gen_piece_permutations.map((x) => reduce_permutation(x.bp, phase3_2gen_keep)));
1291
+ cached_mtables.phase3_2gen_centreA = mtable_a;
1292
+ cached_mtables.phase3_2gen_centreB = mtable_b;
1293
+ return cached_mtables.phase3_2gen_centre = combine_mtables(mtable_a, mtable_b);
1294
+ }
1295
+ var phase3_2gen_ace_table;
1296
+ function generate_phase3_2gen_ace_table() {
1297
+ if (phase3_2gen_ace_table) {
1298
+ return phase3_2gen_ace_table;
1299
+ }
1300
+ const mtable_ab = generate_phase3_2gen_centre_mtable();
1301
+ const mtable_a = cached_mtables.phase3_2gen_centreA;
1302
+ const mtable_ce = generate_phase3_2gen_corneredge_mtable();
1303
+ const Na = mtable_a[0].length;
1304
+ const Nce = mtable_ce[0].length;
1305
+ const N = Na * Nce;
1306
+ const max_depth = 25;
1307
+ const all_weights = phase3_2gen_move_seqs.map((seq) => seq.length);
1308
+ const table = new Int8Array(N).fill(max_depth);
1309
+ const solved_indices = index_phase3_2gen(solved_state);
1310
+ table[solved_indices[0] % Na + Na * solved_indices[1]] = 0;
1311
+ let depth = 0;
1312
+ let done = false;
1313
+ while (!done && depth < max_depth - 1) {
1314
+ done = true;
1315
+ let move_indices = Array(phase3_2gen_nmoves).fill().map((x, i) => i).filter((m) => all_weights[m] + depth < max_depth);
1316
+ move_indices.sort((m, mm) => all_weights[m] - all_weights[mm]);
1317
+ let weights = compose(all_weights, move_indices);
1318
+ let mtable_a_pruned = compose(mtable_a, move_indices);
1319
+ let mtable_ce_pruned = compose(mtable_ce, move_indices);
1320
+ let nmoves = move_indices.length;
1321
+ for (let state = table.indexOf(depth); state !== -1; state = table.indexOf(depth, state + 1)) {
1322
+ let a = state % Na, ce = state / Na | 0;
1323
+ for (let mi = 0; mi < nmoves; mi++) {
1324
+ let weight = weights[mi];
1325
+ let new_a = mtable_a_pruned[mi][a];
1326
+ let new_ce = mtable_ce_pruned[mi][ce];
1327
+ let new_state = new_a + Na * new_ce;
1328
+ if (table[new_state] > depth + weight) {
1329
+ done = false;
1330
+ table[new_state] = depth + weight;
1331
+ }
1332
+ }
1333
+ }
1334
+ depth++;
1335
+ }
1336
+ return phase3_2gen_ace_table = table;
1337
+ }
1338
+ var phase3_2gen_ce_mirror_map;
1339
+ function generate_phase3_2gen_ce_mirror_map() {
1340
+ if (phase3_2gen_ce_mirror_map) {
1341
+ return phase3_2gen_ce_mirror_map;
1342
+ }
1343
+ const mtable_ce = generate_phase3_2gen_corneredge_mtable().slice(0, 2);
1344
+ const solved_indices = index_phase3_2gen(solved_state);
1345
+ return phase3_2gen_ce_mirror_map = generate_mirrored_coordinate_table(mtable_ce, solved_indices[1], solved_indices[1]);
1346
+ }
1347
+ function solve_phase3_2gen(facelets, indices = index_phase3_2gen(facelets)) {
1348
+ let [ab, ce] = indices;
1349
+ let a = ab % 210, b = Math.floor(ab / 210);
1350
+ let mtable_ab = generate_phase3_2gen_centre_mtable();
1351
+ let mtable_a = cached_mtables.phase3_2gen_centreA;
1352
+ let mtable_b = cached_mtables.phase3_2gen_centreB;
1353
+ let mtable_ce = generate_phase3_2gen_corneredge_mtable();
1354
+ let ace_table = generate_phase3_2gen_ace_table();
1355
+ let mirror_map_ce = generate_phase3_2gen_ce_mirror_map();
1356
+ let bound = 0;
1357
+ while (true) {
1358
+ let gen = solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound);
1359
+ for (let solution of gen) {
1360
+ return solution.map((m) => phase3_2gen_move_seqs[m]).flat();
1361
+ }
1362
+ bound++;
1363
+ }
1364
+ }
1365
+ function solve_phase3_2gen_readable(facelets, indices = index_phase3_2gen(facelets)) {
1366
+ let [ab, ce] = indices;
1367
+ let a = ab % 210, b = Math.floor(ab / 210);
1368
+ let mtable_ab = generate_phase3_2gen_centre_mtable();
1369
+ let mtable_a = cached_mtables.phase3_2gen_centreA;
1370
+ let mtable_b = cached_mtables.phase3_2gen_centreB;
1371
+ let mtable_ce = generate_phase3_2gen_corneredge_mtable();
1372
+ let ace_table = generate_phase3_2gen_ace_table();
1373
+ let mirror_map_ce = generate_phase3_2gen_ce_mirror_map();
1374
+ let initial = solve_phase3_2gen(facelets).length;
1375
+ let best_score = Infinity;
1376
+ let best_solution;
1377
+ for (let bound = initial; bound <= initial + 0; bound++) {
1378
+ let gen = solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound);
1379
+ for (let solution of gen) {
1380
+ let expanded = solution.map((m) => phase3_2gen_move_seqs[m]).flat();
1381
+ let simplified = simplify_move_sequence(expanded);
1382
+ let score = grade_readability(simplified);
1383
+ if (score < best_score) {
1384
+ best_score = score;
1385
+ best_solution = simplified;
1386
+ }
1387
+ }
1388
+ }
1389
+ return best_solution;
1390
+ }
1391
+ function alternation_penalty(x) {
1392
+ return (x - 1) * (x - 2) / 2;
1393
+ }
1394
+ function grade_readability(seq) {
1395
+ let nowide = stringify_move_sequence(seq, true).replace(/'/g, "").split(" ");
1396
+ return seq.length + alternations(nowide).map(alternation_penalty).reduce((x, y) => x + y, 0);
1397
+ }
1398
+ function alternations(seq) {
1399
+ if (seq.length < 3) {
1400
+ return [];
1401
+ }
1402
+ let n = seq.length;
1403
+ let a = [];
1404
+ for (let i2 = 0; i2 < n - 2; i2++) {
1405
+ a[i2] = seq[i2] === seq[i2 + 2];
1406
+ }
1407
+ a.push(false);
1408
+ let i = -1;
1409
+ let runs = [];
1410
+ while (i < n - 2) {
1411
+ i = a.indexOf(true, i + 1);
1412
+ if (i === -1) {
1413
+ break;
1414
+ }
1415
+ let j = a.indexOf(false, i + 1);
1416
+ runs.push(j - i);
1417
+ i = j;
1418
+ }
1419
+ return runs;
1420
+ }
1421
+ function* solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound, last = -1) {
1422
+ let h_ace = ace_table[a + 210 * ce];
1423
+ let h_bce = ace_table[b + 210 * mirror_map_ce[ce]];
1424
+ let h = Math.max(h_ace, h_bce);
1425
+ if (h > bound) {
1426
+ return;
1427
+ }
1428
+ if (bound === 0) {
1429
+ yield [];
1430
+ return;
1431
+ }
1432
+ if (h === 0) {
1433
+ return;
1434
+ }
1435
+ for (let m = 0; m < phase3_2gen_nmoves; m++) {
1436
+ if (m === last && phase3_2gen_move_orders[m] <= 3) {
1437
+ continue;
1438
+ }
1439
+ let new_a = mtable_a[m][a];
1440
+ let new_b = mtable_b[m][b];
1441
+ let new_ce = mtable_ce[m][ce];
1442
+ let new_bound = bound - phase3_2gen_move_seqs[m].length;
1443
+ if (new_bound < 0) {
1444
+ continue;
1445
+ }
1446
+ let subpath_gen = solve_phase3_2gen_ida(new_a, new_b, new_ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, new_bound, m);
1447
+ while (true) {
1448
+ let { value: subpath, done } = subpath_gen.next();
1449
+ if (done) {
1450
+ break;
1451
+ }
1452
+ yield [m].concat(subpath);
1453
+ }
1454
+ }
1455
+ }
1456
+ function solve_phase2_and_phase3_fast(facelets, phase2_attempts = 200, cap = 24) {
1457
+ let pool = [];
1458
+ let gen = solve_phase2_gen(facelets);
1459
+ let facelets_t2 = compose(facelets, move_X).map((x) => x ^ 1);
1460
+ let gen_t2 = solve_phase2_gen(facelets_t2);
1461
+ let best = Array(1e3);
1462
+ for (let i = 0; i < phase2_attempts; i++) {
1463
+ {
1464
+ let { value, done } = gen.next();
1465
+ if (!done) {
1466
+ let intermediate_facelets = apply_move_sequence(facelets, value);
1467
+ let solution = value.concat(solve_phase3_2gen(intermediate_facelets));
1468
+ if (solution.length <= cap) {
1469
+ return solution;
1470
+ } else if (solution.length < best.length) {
1471
+ best = solution;
1472
+ }
1473
+ }
1474
+ }
1475
+ {
1476
+ let { value, done } = gen_t2.next();
1477
+ if (!done) {
1478
+ let intermediate_facelets = apply_move_sequence(facelets_t2, value);
1479
+ let solution = value.concat(solve_phase3_2gen(intermediate_facelets)).map(([m, r]) => [m ^ 2, r]);
1480
+ if (solution.length <= cap) {
1481
+ return solution;
1482
+ } else if (solution.length < best.length) {
1483
+ best = solution;
1484
+ }
1485
+ }
1486
+ }
1487
+ }
1488
+ return best;
1489
+ }
1490
+ function solve_phase2_and_phase3_readable(facelets, phase2_attempts = 20, cap = 30) {
1491
+ let pool = [];
1492
+ let gen = solve_phase2_gen(facelets);
1493
+ let facelets_t2 = compose(facelets, move_X).map((x) => x ^ 1);
1494
+ let gen_t2 = solve_phase2_gen(facelets_t2);
1495
+ let best;
1496
+ let best_score = Infinity;
1497
+ for (let i = 0; i < phase2_attempts; i++) {
1498
+ {
1499
+ let { value, done } = gen.next();
1500
+ if (!done) {
1501
+ let intermediate_facelets = apply_move_sequence(facelets, value);
1502
+ let solution = simplify_move_sequence(value.concat(solve_phase3_2gen_readable(intermediate_facelets)));
1503
+ let score = grade_readability(solution);
1504
+ if (score <= cap) {
1505
+ return solution;
1506
+ } else if (score < best_score) {
1507
+ best = solution;
1508
+ best_score = score;
1509
+ }
1510
+ }
1511
+ }
1512
+ {
1513
+ let { value, done } = gen_t2.next();
1514
+ if (!done) {
1515
+ let intermediate_facelets = apply_move_sequence(facelets_t2, value);
1516
+ let solution = simplify_move_sequence(value.concat(solve_phase3_2gen_readable(intermediate_facelets)));
1517
+ solution = solution.map(([m, r]) => [m ^ 2, r]);
1518
+ let score = grade_readability(solution);
1519
+ if (score <= cap) {
1520
+ return solution;
1521
+ } else if (score < best_score) {
1522
+ best = solution;
1523
+ best_score = score;
1524
+ }
1525
+ }
1526
+ }
1527
+ }
1528
+ return best;
1529
+ }
1530
+ var randomUintBelow = randomUIntBelowFactory();
1531
+ async function randomFTOScrambleString() {
1532
+ return generate_random_state_scramble(await randomUintBelow);
1533
+ }
1534
+ export {
1535
+ randomFTOScrambleString
1536
+ };
1537
+ //# sourceMappingURL=fto-solver-HI6NIV74.js.map