cubegin 0.0.1

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 (164) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +674 -0
  3. package/NOTICE +11 -0
  4. package/README.md +49 -0
  5. package/dist/scramble-core/src/batch.mjs +18 -0
  6. package/dist/scramble-core/src/generator.d.mts +35 -0
  7. package/dist/scramble-core/src/generator.mjs +136 -0
  8. package/dist/scramble-core/src/generators/clock.d.mts +11 -0
  9. package/dist/scramble-core/src/generators/clock.mjs +32 -0
  10. package/dist/scramble-core/src/generators/cube-random-turns.d.mts +11 -0
  11. package/dist/scramble-core/src/generators/cube-random-turns.mjs +54 -0
  12. package/dist/scramble-core/src/generators/four-by-four.d.mts +14 -0
  13. package/dist/scramble-core/src/generators/four-by-four.mjs +43 -0
  14. package/dist/scramble-core/src/generators/megaminx.d.mts +11 -0
  15. package/dist/scramble-core/src/generators/megaminx.mjs +18 -0
  16. package/dist/scramble-core/src/generators/pyraminx.d.mts +11 -0
  17. package/dist/scramble-core/src/generators/pyraminx.mjs +17 -0
  18. package/dist/scramble-core/src/generators/skewb.d.mts +11 -0
  19. package/dist/scramble-core/src/generators/skewb.mjs +17 -0
  20. package/dist/scramble-core/src/generators/square1.d.mts +11 -0
  21. package/dist/scramble-core/src/generators/square1.mjs +28 -0
  22. package/dist/scramble-core/src/generators/three-by-three.d.mts +25 -0
  23. package/dist/scramble-core/src/generators/three-by-three.mjs +85 -0
  24. package/dist/scramble-core/src/generators/two-by-two.d.mts +11 -0
  25. package/dist/scramble-core/src/generators/two-by-two.mjs +17 -0
  26. package/dist/scramble-core/src/random-source.d.mts +7 -0
  27. package/dist/scramble-core/src/random-source.mjs +8 -0
  28. package/dist/scramble-core/src/solvers/min2phase/coord-cube.mjs +10 -0
  29. package/dist/scramble-core/src/solvers/min2phase/cubie-cube.mjs +246 -0
  30. package/dist/scramble-core/src/solvers/min2phase/engine.mjs +1281 -0
  31. package/dist/scramble-core/src/solvers/min2phase/search-wca.mjs +21 -0
  32. package/dist/scramble-core/src/solvers/min2phase/search.mjs +25 -0
  33. package/dist/scramble-core/src/solvers/min2phase/tools.mjs +169 -0
  34. package/dist/scramble-core/src/solvers/min2phase/util.mjs +30 -0
  35. package/dist/scramble-core/src/solvers/pyraminx-solver.d.mts +17 -0
  36. package/dist/scramble-core/src/solvers/pyraminx-solver.mjs +350 -0
  37. package/dist/scramble-core/src/solvers/skewb-solver.d.mts +15 -0
  38. package/dist/scramble-core/src/solvers/skewb-solver.mjs +399 -0
  39. package/dist/scramble-core/src/solvers/sq12phase/full-cube.mjs +212 -0
  40. package/dist/scramble-core/src/solvers/sq12phase/search.mjs +520 -0
  41. package/dist/scramble-core/src/solvers/sq12phase/shape.mjs +214 -0
  42. package/dist/scramble-core/src/solvers/sq12phase/square.mjs +135 -0
  43. package/dist/scramble-core/src/solvers/threephase/center.mjs +798 -0
  44. package/dist/scramble-core/src/solvers/threephase/edge.mjs +632 -0
  45. package/dist/scramble-core/src/solvers/threephase/full-cube.mjs +554 -0
  46. package/dist/scramble-core/src/solvers/threephase/search.mjs +262 -0
  47. package/dist/scramble-core/src/solvers/threephase/tables.mjs +201 -0
  48. package/dist/scramble-core/src/solvers/two-by-two-solver.d.mts +15 -0
  49. package/dist/scramble-core/src/solvers/two-by-two-solver.mjs +298 -0
  50. package/dist/scramble-core.d.mts +15 -0
  51. package/dist/scramble-core.mjs +15 -0
  52. package/dist/scramble-image/src/color.d.mts +12 -0
  53. package/dist/scramble-image/src/color.mjs +11 -0
  54. package/dist/scramble-image/src/render.d.mts +10 -0
  55. package/dist/scramble-image/src/render.mjs +71 -0
  56. package/dist/scramble-image/src/renderers/clock.d.mts +6 -0
  57. package/dist/scramble-image/src/renderers/clock.mjs +145 -0
  58. package/dist/scramble-image/src/renderers/cube-isometric.d.mts +8 -0
  59. package/dist/scramble-image/src/renderers/cube-isometric.mjs +204 -0
  60. package/dist/scramble-image/src/renderers/cube-net.d.mts +8 -0
  61. package/dist/scramble-image/src/renderers/cube-net.mjs +52 -0
  62. package/dist/scramble-image/src/renderers/megaminx-isometric.d.mts +9 -0
  63. package/dist/scramble-image/src/renderers/megaminx-isometric.mjs +320 -0
  64. package/dist/scramble-image/src/renderers/megaminx.d.mts +9 -0
  65. package/dist/scramble-image/src/renderers/megaminx.mjs +173 -0
  66. package/dist/scramble-image/src/renderers/pyraminx-isometric.d.mts +9 -0
  67. package/dist/scramble-image/src/renderers/pyraminx-isometric.mjs +185 -0
  68. package/dist/scramble-image/src/renderers/pyraminx.d.mts +9 -0
  69. package/dist/scramble-image/src/renderers/pyraminx.mjs +111 -0
  70. package/dist/scramble-image/src/renderers/skewb-isometric.d.mts +9 -0
  71. package/dist/scramble-image/src/renderers/skewb-isometric.mjs +233 -0
  72. package/dist/scramble-image/src/renderers/skewb.d.mts +9 -0
  73. package/dist/scramble-image/src/renderers/skewb.mjs +187 -0
  74. package/dist/scramble-image/src/renderers/square1.d.mts +10 -0
  75. package/dist/scramble-image/src/renderers/square1.mjs +253 -0
  76. package/dist/scramble-image/src/svg/svg-document.d.mts +6 -0
  77. package/dist/scramble-image/src/svg/svg-document.mjs +7 -0
  78. package/dist/scramble-image/src/svg/svg-elements.d.mts +15 -0
  79. package/dist/scramble-image/src/svg/svg-elements.mjs +25 -0
  80. package/dist/scramble-image/src/svg/svg-serialize.mjs +29 -0
  81. package/dist/scramble-image.d.mts +15 -0
  82. package/dist/scramble-image.mjs +15 -0
  83. package/dist/scramble-puzzle/src/algorithm.d.mts +8 -0
  84. package/dist/scramble-puzzle/src/algorithm.mjs +16 -0
  85. package/dist/scramble-puzzle/src/algorithm2.mjs +16 -0
  86. package/dist/scramble-puzzle/src/clock/clock-definition.d.mts +8 -0
  87. package/dist/scramble-puzzle/src/clock/clock-definition.mjs +18 -0
  88. package/dist/scramble-puzzle/src/clock/clock-definition2.mjs +18 -0
  89. package/dist/scramble-puzzle/src/clock/clock-parser.d.mts +18 -0
  90. package/dist/scramble-puzzle/src/clock/clock-parser.mjs +35 -0
  91. package/dist/scramble-puzzle/src/clock/clock-parser2.mjs +35 -0
  92. package/dist/scramble-puzzle/src/clock/clock-state.d.mts +8 -0
  93. package/dist/scramble-puzzle/src/clock/clock-state.mjs +212 -0
  94. package/dist/scramble-puzzle/src/clock/clock-state2.d.mts +13 -0
  95. package/dist/scramble-puzzle/src/clock/clock-state2.mjs +212 -0
  96. package/dist/scramble-puzzle/src/cube/cube-definition.d.mts +9 -0
  97. package/dist/scramble-puzzle/src/cube/cube-definition.mjs +18 -0
  98. package/dist/scramble-puzzle/src/cube/cube-definition2.mjs +18 -0
  99. package/dist/scramble-puzzle/src/cube/cube-move.d.mts +4 -0
  100. package/dist/scramble-puzzle/src/cube/cube-move2.d.mts +17 -0
  101. package/dist/scramble-puzzle/src/cube/cube-parser.d.mts +7 -0
  102. package/dist/scramble-puzzle/src/cube/cube-parser.mjs +60 -0
  103. package/dist/scramble-puzzle/src/cube/cube-parser2.mjs +60 -0
  104. package/dist/scramble-puzzle/src/cube/cube-state.d.mts +12 -0
  105. package/dist/scramble-puzzle/src/cube/cube-state.mjs +187 -0
  106. package/dist/scramble-puzzle/src/cube/cube-state2.d.mts +15 -0
  107. package/dist/scramble-puzzle/src/cube/cube-state2.mjs +187 -0
  108. package/dist/scramble-puzzle/src/errors.d.mts +15 -0
  109. package/dist/scramble-puzzle/src/errors.mjs +24 -0
  110. package/dist/scramble-puzzle/src/errors2.mjs +30 -0
  111. package/dist/scramble-puzzle/src/events.d.mts +5 -0
  112. package/dist/scramble-puzzle/src/events.mjs +90 -0
  113. package/dist/scramble-puzzle/src/events2.d.mts +98 -0
  114. package/dist/scramble-puzzle/src/events2.mjs +109 -0
  115. package/dist/scramble-puzzle/src/index.mjs +22 -0
  116. package/dist/scramble-puzzle/src/megaminx/megaminx-definition.d.mts +8 -0
  117. package/dist/scramble-puzzle/src/megaminx/megaminx-definition.mjs +18 -0
  118. package/dist/scramble-puzzle/src/megaminx/megaminx-definition2.mjs +18 -0
  119. package/dist/scramble-puzzle/src/megaminx/megaminx-parser.d.mts +5 -0
  120. package/dist/scramble-puzzle/src/megaminx/megaminx-parser.mjs +57 -0
  121. package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.d.mts +20 -0
  122. package/dist/scramble-puzzle/src/megaminx/megaminx-parser2.mjs +57 -0
  123. package/dist/scramble-puzzle/src/megaminx/megaminx-state.d.mts +9 -0
  124. package/dist/scramble-puzzle/src/megaminx/megaminx-state.mjs +112 -0
  125. package/dist/scramble-puzzle/src/megaminx/megaminx-state2.d.mts +14 -0
  126. package/dist/scramble-puzzle/src/megaminx/megaminx-state2.mjs +112 -0
  127. package/dist/scramble-puzzle/src/puzzle-definition.d.mts +19 -0
  128. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.d.mts +8 -0
  129. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition.mjs +18 -0
  130. package/dist/scramble-puzzle/src/pyraminx/pyraminx-definition2.mjs +18 -0
  131. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.d.mts +5 -0
  132. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser.mjs +34 -0
  133. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.d.mts +21 -0
  134. package/dist/scramble-puzzle/src/pyraminx/pyraminx-parser2.mjs +34 -0
  135. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.d.mts +11 -0
  136. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state.mjs +90 -0
  137. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.d.mts +14 -0
  138. package/dist/scramble-puzzle/src/pyraminx/pyraminx-state2.mjs +90 -0
  139. package/dist/scramble-puzzle/src/registry.d.mts +11 -0
  140. package/dist/scramble-puzzle/src/registry.mjs +13 -0
  141. package/dist/scramble-puzzle/src/skewb/skewb-definition.d.mts +8 -0
  142. package/dist/scramble-puzzle/src/skewb/skewb-definition.mjs +18 -0
  143. package/dist/scramble-puzzle/src/skewb/skewb-definition2.mjs +18 -0
  144. package/dist/scramble-puzzle/src/skewb/skewb-parser.d.mts +5 -0
  145. package/dist/scramble-puzzle/src/skewb/skewb-parser.mjs +33 -0
  146. package/dist/scramble-puzzle/src/skewb/skewb-parser2.d.mts +14 -0
  147. package/dist/scramble-puzzle/src/skewb/skewb-parser2.mjs +33 -0
  148. package/dist/scramble-puzzle/src/skewb/skewb-state.d.mts +11 -0
  149. package/dist/scramble-puzzle/src/skewb/skewb-state.mjs +75 -0
  150. package/dist/scramble-puzzle/src/skewb/skewb-state2.d.mts +14 -0
  151. package/dist/scramble-puzzle/src/skewb/skewb-state2.mjs +75 -0
  152. package/dist/scramble-puzzle/src/square1/square1-definition.d.mts +8 -0
  153. package/dist/scramble-puzzle/src/square1/square1-definition.mjs +18 -0
  154. package/dist/scramble-puzzle/src/square1/square1-definition2.mjs +18 -0
  155. package/dist/scramble-puzzle/src/square1/square1-parser.d.mts +17 -0
  156. package/dist/scramble-puzzle/src/square1/square1-parser.mjs +43 -0
  157. package/dist/scramble-puzzle/src/square1/square1-parser2.mjs +47 -0
  158. package/dist/scramble-puzzle/src/square1/square1-state.d.mts +9 -0
  159. package/dist/scramble-puzzle/src/square1/square1-state.mjs +115 -0
  160. package/dist/scramble-puzzle/src/square1/square1-state2.d.mts +21 -0
  161. package/dist/scramble-puzzle/src/square1/square1-state2.mjs +115 -0
  162. package/dist/scramble-puzzle.d.mts +25 -0
  163. package/dist/scramble-puzzle.mjs +23 -0
  164. package/package.json +37 -0
@@ -0,0 +1,1281 @@
1
+ //#region .build/vendor/scramble-core/src/solvers/min2phase/engine.ts
2
+ function createArray(length) {
3
+ const arr = Array(length);
4
+ for (var i = 0; i < length; i++) arr[i] = 0;
5
+ return arr;
6
+ }
7
+ function createArrays(length1, length2) {
8
+ const arr = Array(length1);
9
+ for (var i = 0; i < length1; i++) {
10
+ arr[i] = Array(length2);
11
+ for (var j = 0; j < length2; j++) arr[i][j] = 0;
12
+ }
13
+ return arr;
14
+ }
15
+ function bitOdd(i) {
16
+ i ^= i >>> 1;
17
+ i ^= i >>> 2;
18
+ i ^= i >>> 4;
19
+ i ^= i >>> 8;
20
+ return i & 1;
21
+ }
22
+ function bitCount(i) {
23
+ i = i - (i >>> 1 & 1431655765);
24
+ i = (i & 858993459) + (i >>> 2 & 858993459);
25
+ return i + (i >>> 8) + (i >>> 4) & 15;
26
+ }
27
+ function get4Parity(idx) {
28
+ var p = 0;
29
+ for (var i = 2; i >= 0; i--) {
30
+ p += idx % (4 - i);
31
+ idx = ~~(idx / (4 - i));
32
+ }
33
+ p &= 1;
34
+ return p;
35
+ }
36
+ function get8Parity(idx) {
37
+ var p = 0;
38
+ for (var i = 6; i >= 0; i--) {
39
+ p += idx % (8 - i);
40
+ idx = ~~(idx / (8 - i));
41
+ }
42
+ p &= 1;
43
+ return p;
44
+ }
45
+ function binarySearch(arr, key) {
46
+ var length = arr.length;
47
+ if (key <= arr[length - 1]) {
48
+ var l = 0;
49
+ var r = length - 1;
50
+ while (l <= r) {
51
+ var mid = l + r >>> 1;
52
+ var val = arr[mid];
53
+ if (key > val) l = mid + 1;
54
+ else if (key < val) r = mid - 1;
55
+ else return mid;
56
+ }
57
+ }
58
+ return 65535;
59
+ }
60
+ var fact = [
61
+ 1,
62
+ 1,
63
+ 2,
64
+ 6,
65
+ 24,
66
+ 120,
67
+ 720,
68
+ 5040,
69
+ 40320,
70
+ 362880,
71
+ 3628800,
72
+ 39916800,
73
+ 479001600
74
+ ];
75
+ var perm3 = [
76
+ [
77
+ 11,
78
+ 10,
79
+ 9
80
+ ],
81
+ [
82
+ 10,
83
+ 11,
84
+ 9
85
+ ],
86
+ [
87
+ 11,
88
+ 9,
89
+ 10
90
+ ],
91
+ [
92
+ 9,
93
+ 11,
94
+ 10
95
+ ],
96
+ [
97
+ 10,
98
+ 9,
99
+ 11
100
+ ],
101
+ [
102
+ 9,
103
+ 10,
104
+ 11
105
+ ]
106
+ ];
107
+ var ud2std = [
108
+ 0,
109
+ 1,
110
+ 2,
111
+ 4,
112
+ 7,
113
+ 9,
114
+ 10,
115
+ 11,
116
+ 13,
117
+ 16
118
+ ];
119
+ var std2ud = createArray(18);
120
+ var Cnk = createArrays(12, 13);
121
+ var move2str = [
122
+ "U ",
123
+ "U2",
124
+ "U'",
125
+ "R ",
126
+ "R2",
127
+ "R'",
128
+ "F ",
129
+ "F2",
130
+ "F'",
131
+ "D ",
132
+ "D2",
133
+ "D'",
134
+ "L ",
135
+ "L2",
136
+ "L'",
137
+ "B ",
138
+ "B2",
139
+ "B'"
140
+ ];
141
+ var urfMove = [
142
+ [
143
+ 0,
144
+ 1,
145
+ 2,
146
+ 3,
147
+ 4,
148
+ 5,
149
+ 6,
150
+ 7,
151
+ 8,
152
+ 9,
153
+ 10,
154
+ 11,
155
+ 12,
156
+ 13,
157
+ 14,
158
+ 15,
159
+ 16,
160
+ 17
161
+ ],
162
+ [
163
+ 6,
164
+ 7,
165
+ 8,
166
+ 0,
167
+ 1,
168
+ 2,
169
+ 3,
170
+ 4,
171
+ 5,
172
+ 15,
173
+ 16,
174
+ 17,
175
+ 9,
176
+ 10,
177
+ 11,
178
+ 12,
179
+ 13,
180
+ 14
181
+ ],
182
+ [
183
+ 3,
184
+ 4,
185
+ 5,
186
+ 6,
187
+ 7,
188
+ 8,
189
+ 0,
190
+ 1,
191
+ 2,
192
+ 12,
193
+ 13,
194
+ 14,
195
+ 15,
196
+ 16,
197
+ 17,
198
+ 9,
199
+ 10,
200
+ 11
201
+ ],
202
+ [
203
+ 2,
204
+ 1,
205
+ 0,
206
+ 5,
207
+ 4,
208
+ 3,
209
+ 8,
210
+ 7,
211
+ 6,
212
+ 11,
213
+ 10,
214
+ 9,
215
+ 14,
216
+ 13,
217
+ 12,
218
+ 17,
219
+ 16,
220
+ 15
221
+ ],
222
+ [
223
+ 8,
224
+ 7,
225
+ 6,
226
+ 2,
227
+ 1,
228
+ 0,
229
+ 5,
230
+ 4,
231
+ 3,
232
+ 17,
233
+ 16,
234
+ 15,
235
+ 11,
236
+ 10,
237
+ 9,
238
+ 14,
239
+ 13,
240
+ 12
241
+ ],
242
+ [
243
+ 5,
244
+ 4,
245
+ 3,
246
+ 8,
247
+ 7,
248
+ 6,
249
+ 2,
250
+ 1,
251
+ 0,
252
+ 14,
253
+ 13,
254
+ 12,
255
+ 17,
256
+ 16,
257
+ 15,
258
+ 11,
259
+ 10,
260
+ 9
261
+ ]
262
+ ];
263
+ for (var i = 0; i < 12; i++) {
264
+ Cnk[i][0] = 1;
265
+ Cnk[i][i] = 1;
266
+ Cnk[i][i + 1] = 0;
267
+ for (var j = 1; j < i; j++) Cnk[i][j] = Cnk[i - 1][j - 1] + Cnk[i - 1][j];
268
+ }
269
+ for (var i = 0; i < 10; i++) std2ud[ud2std[i]] = i;
270
+ var ckmv = Array(19);
271
+ var ckmv2 = Array(11);
272
+ ckmv[18] = Array(18);
273
+ ckmv2[10] = Array(10);
274
+ for (var i = 0; i < 18; i++) {
275
+ ckmv[i] = Array(18);
276
+ for (var j = 0; j < 18; j++) ckmv[i][j] = ~~(i / 3) == ~~(j / 3) || ~~(i / 3) % 3 == ~~(j / 3) % 3 && i >= j;
277
+ ckmv[18][i] = false;
278
+ }
279
+ for (var i = 0; i < 10; i++) {
280
+ ckmv2[i] = Array(10);
281
+ for (var j = 0; j < 10; j++) ckmv2[i][j] = ckmv[ud2std[i]][ud2std[j]];
282
+ ckmv2[10][i] = false;
283
+ }
284
+ function CubieCube() {
285
+ this.cp = [
286
+ 0,
287
+ 1,
288
+ 2,
289
+ 3,
290
+ 4,
291
+ 5,
292
+ 6,
293
+ 7
294
+ ];
295
+ this.co = [
296
+ 0,
297
+ 0,
298
+ 0,
299
+ 0,
300
+ 0,
301
+ 0,
302
+ 0,
303
+ 0
304
+ ];
305
+ this.ep = [
306
+ 0,
307
+ 1,
308
+ 2,
309
+ 3,
310
+ 4,
311
+ 5,
312
+ 6,
313
+ 7,
314
+ 8,
315
+ 9,
316
+ 10,
317
+ 11
318
+ ];
319
+ this.eo = [
320
+ 0,
321
+ 0,
322
+ 0,
323
+ 0,
324
+ 0,
325
+ 0,
326
+ 0,
327
+ 0,
328
+ 0,
329
+ 0,
330
+ 0,
331
+ 0
332
+ ];
333
+ this.getFlip = function getFlip() {
334
+ var idx = 0;
335
+ for (var i = 0; i < 11; i++) idx |= this.eo[i] << i;
336
+ return idx;
337
+ };
338
+ this.getFlipSym = function getFlipSym() {
339
+ if (FlipR2S != 0) return FlipR2S[this.getFlip()];
340
+ for (var k = 0; k < 16; k += 2) {
341
+ EdgeConjugate(this, SymInv[k], temps);
342
+ var idx = binarySearch(FlipS2R, temps.getFlip());
343
+ if (idx != 65535) return idx << 3 | k >>> 1;
344
+ }
345
+ return 0;
346
+ };
347
+ this.setFlip = function setFlip(idx) {
348
+ this.eo[11] = bitOdd(idx);
349
+ for (var i = 0; i < 11; i++) {
350
+ this.eo[i] = idx & 1;
351
+ idx >>>= 1;
352
+ }
353
+ };
354
+ this.getTwist = function getTwist() {
355
+ var idx = 0;
356
+ for (var i = 0; i < 7; i++) {
357
+ idx *= 3;
358
+ idx += this.co[i];
359
+ }
360
+ return idx;
361
+ };
362
+ this.getTwistSym = function getTwistSym() {
363
+ if (TwistR2S != null) return TwistR2S[this.getTwist()];
364
+ for (var k = 0; k < 16; k += 2) {
365
+ CornConjugate(this, SymInv[k], temps);
366
+ idx = binarySearch(TwistS2R, temps.getTwist());
367
+ if (idx != 65535) return idx << 3 | k >>> 1;
368
+ }
369
+ return 0;
370
+ };
371
+ this.setTwist = function setTwist(idx) {
372
+ var twst = 0;
373
+ for (var i = 6; i >= 0; i--) {
374
+ twst += this.co[i] = idx % 3;
375
+ idx = ~~(idx / 3);
376
+ }
377
+ this.co[7] = (15 - twst) % 3;
378
+ };
379
+ this.getUDSlice = function getUDSlice() {
380
+ var idx = 0;
381
+ var r = 4;
382
+ for (var i = 0; i < 12; i++) if (this.ep[i] >= 8) {
383
+ idx += Cnk[11 - i][r];
384
+ r--;
385
+ }
386
+ return idx;
387
+ };
388
+ this.setUDSlice = function setUDSlice(idx) {
389
+ var r = 4;
390
+ for (var i = 0; i < 12; i++) if (idx >= Cnk[11 - i][r]) {
391
+ idx -= Cnk[11 - i][r];
392
+ r--;
393
+ this.ep[i] = 11 - r;
394
+ } else this.ep[i] = i + r - 4;
395
+ };
396
+ this.getMPerm = function getMPerm() {
397
+ var m = 1 << this.ep[11];
398
+ var idx = 0;
399
+ for (var i = 10; i >= 8; --i) {
400
+ var t = 1 << this.ep[i];
401
+ idx += bitCount(m & t - 1) * fact[11 - i];
402
+ m |= t;
403
+ }
404
+ return idx;
405
+ };
406
+ this.setMPerm = function setMPerm(idx) {
407
+ this.ep[11] = 8;
408
+ for (var i = 10; i >= 8; i--) {
409
+ this.ep[i] = idx % (12 - i) + 8;
410
+ idx = ~~(idx / (12 - i));
411
+ for (var j = i + 1; j < 12; j++) if (this.ep[j] >= this.ep[i]) this.ep[j]++;
412
+ }
413
+ };
414
+ this.getMid3 = function getMid3() {
415
+ var idxA = 0;
416
+ var idxB = 0;
417
+ var mask = 0;
418
+ var r = 3;
419
+ for (var i = 11; i >= 0; i--) if (this.ep[i] >= 9) {
420
+ idxA += Cnk[i][r--];
421
+ var t = 1 << this.ep[i];
422
+ idxB += bitCount(mask & t - 1) * fact[2 - r];
423
+ mask |= t;
424
+ }
425
+ return idxA * 6 + idxB;
426
+ };
427
+ this.setMid3 = function setMid3(idxA) {
428
+ var edge = perm3[idxA % 6];
429
+ idxA = ~~(idxA / 6);
430
+ var r = 3;
431
+ for (var i = 11; i >= 0; i--) if (idxA >= Cnk[i][r]) {
432
+ idxA -= Cnk[i][r--];
433
+ this.ep[i] = edge[2 - r];
434
+ } else this.ep[i] = 8 - i + r;
435
+ };
436
+ this.getURtoUL = function getURtoUL() {
437
+ var idxA = 0;
438
+ var idxB = 0;
439
+ var mask = 0;
440
+ var r = 3;
441
+ for (var i = 11; i >= 0; i--) if (this.ep[i] <= 2) {
442
+ idxA += Cnk[i][r--];
443
+ var t = 1 << this.ep[i];
444
+ idxB += bitCount(mask & t - 1) * fact[2 - r];
445
+ mask |= t;
446
+ }
447
+ return idxA * 6 + idxB;
448
+ };
449
+ this.getDRtoDL = function getDRtoDL() {
450
+ var idxA = 0;
451
+ var idxB = 0;
452
+ var mask = 0;
453
+ var r = 3;
454
+ for (var i = 11; i >= 0; i--) if (4 <= this.ep[i] && this.ep[i] <= 6) {
455
+ idxA += Cnk[i][r--];
456
+ var t = 1 << this.ep[i];
457
+ idxB += bitCount(mask & t - 1) * fact[2 - r];
458
+ mask |= t;
459
+ }
460
+ return idxA * 6 + idxB;
461
+ };
462
+ this.setEdgePerm = function setEdgePerm(idx) {
463
+ this.ep[11] = 0;
464
+ for (var i = 10; i >= 0; i--) {
465
+ this.ep[i] = idx % (12 - i);
466
+ idx = ~~(idx / (12 - i));
467
+ for (var j = i + 1; j < 12; j++) if (this.ep[j] >= this.ep[i]) this.ep[j]++;
468
+ }
469
+ };
470
+ this.getEdgePerm = function getEdgePerm() {
471
+ var m = 1 << ep[11];
472
+ var idx = 0;
473
+ for (var i = 10; i >= 0; --i) {
474
+ var t = 1 << this.ep[i];
475
+ idx += bitCount(m & t - 1) * fact[11 - i];
476
+ m |= t;
477
+ }
478
+ return idx;
479
+ };
480
+ this.getCPermSym = function getCPermSym() {
481
+ if (EPermR2S != null) {
482
+ var idx = EPermR2S[get8Perm(this.cp)];
483
+ idx ^= e2c[idx & 15];
484
+ return idx;
485
+ }
486
+ for (var k = 0; k < 16; k++) {
487
+ CornConjugate(this, SymInv[k], temps);
488
+ var idx = binarySearch(CPermS2R, get8Perm(temps.cp));
489
+ if (idx != 65535) return idx << 4 | k;
490
+ }
491
+ return 0;
492
+ };
493
+ this.getEPermSym = function getEPermSym() {
494
+ if (EPermR2S != null) return EPermR2S[get8Perm(this.ep)];
495
+ for (var k = 0; k < 16; k++) {
496
+ EdgeConjugate(this, SymInv[k], temps);
497
+ var idx = binarySearch(EPermS2R, get8Perm(temps.ep));
498
+ if (idx != 65535) return char(idx << 4 | k);
499
+ }
500
+ return 0;
501
+ };
502
+ this.URFConjugate = function URFConjugate() {
503
+ CornMult(urf2, this, temps);
504
+ CornMult(temps, urf1, this);
505
+ EdgeMult(urf2, this, temps);
506
+ EdgeMult(temps, urf1, this);
507
+ };
508
+ this.invCubieCube = function invCubieCube() {
509
+ for (var edge = 0; edge < 12; edge++) temps.ep[this.ep[edge]] = edge;
510
+ for (var edge = 0; edge < 12; edge++) temps.eo[edge] = this.eo[temps.ep[edge]];
511
+ for (var corn = 0; corn < 8; corn++) temps.cp[this.cp[corn]] = corn;
512
+ for (var corn = 0; corn < 8; corn++) {
513
+ var ori = this.co[temps.cp[corn]];
514
+ temps.co[corn] = -ori;
515
+ if (temps.co[corn] < 0) temps.co[corn] += 3;
516
+ }
517
+ this.copy(temps);
518
+ };
519
+ this.init = function init(cperm, twist, eperm, flip) {
520
+ set8Perm(this.cp, cperm);
521
+ this.setTwist(twist);
522
+ this.setEdgePerm(eperm);
523
+ this.setFlip(flip);
524
+ };
525
+ this.copy = function copy(c) {
526
+ for (var i = 0; i < 8; i++) {
527
+ this.cp[i] = c.cp[i];
528
+ this.co[i] = c.co[i];
529
+ }
530
+ for (var i = 0; i < 12; i++) {
531
+ this.ep[i] = c.ep[i];
532
+ this.eo[i] = c.eo[i];
533
+ }
534
+ };
535
+ }
536
+ const cctemp = new CubieCube();
537
+ const temps = new CubieCube();
538
+ function set8Perm(arr, idx) {
539
+ var val = 1985229328;
540
+ for (var i = 0; i < 7; i++) {
541
+ var p = fact[7 - i];
542
+ var v = ~~(idx / p);
543
+ idx %= p;
544
+ v <<= 2;
545
+ arr[i] = val >> v & 7;
546
+ var m = (1 << v) - 1;
547
+ val = (val & m) + (val >> 4 & ~m);
548
+ }
549
+ arr[7] = val;
550
+ }
551
+ function get8Perm(arr) {
552
+ var idx = 0;
553
+ var val = 1985229328;
554
+ for (var i = 0; i < 7; i++) {
555
+ var v = arr[i] << 2;
556
+ idx = (8 - i) * idx + (val >> v & 7);
557
+ val -= 286331152 << v;
558
+ }
559
+ return idx;
560
+ }
561
+ function CornMult(a, b, prod) {
562
+ for (var corn = 0; corn < 8; corn++) {
563
+ prod.cp[corn] = a.cp[b.cp[corn]];
564
+ var oriA = a.co[b.cp[corn]];
565
+ var oriB = b.co[corn];
566
+ var ori = oriA;
567
+ ori += oriA < 3 ? oriB : 3 - oriB;
568
+ ori %= 3;
569
+ if (oriA < 3 ^ oriB < 3) ori += 3;
570
+ prod.co[corn] = ori;
571
+ }
572
+ }
573
+ function EdgeMult(a, b, prod) {
574
+ for (var ed = 0; ed < 12; ed++) {
575
+ prod.ep[ed] = a.ep[b.ep[ed]];
576
+ prod.eo[ed] = b.eo[ed] ^ a.eo[b.ep[ed]];
577
+ }
578
+ }
579
+ function CornConjugate(a, idx, b) {
580
+ CornMult(CubeSym[SymInv[idx]], a, cctemp);
581
+ CornMult(cctemp, CubeSym[idx], b);
582
+ }
583
+ function EdgeConjugate(a, idx, b) {
584
+ EdgeMult(CubeSym[SymInv[idx]], a, cctemp);
585
+ EdgeMult(cctemp, CubeSym[idx], b);
586
+ }
587
+ var CubeSym = Array(16);
588
+ var moveCube = Array(18);
589
+ var SymInv = Array(16);
590
+ var SymMult = Array(16);
591
+ var SymMove = Array(16);
592
+ var Sym8Mult = Array(8);
593
+ var Sym8Move = Array(8);
594
+ var Sym8MultInv = Array(8);
595
+ var SymMoveUD = Array(16);
596
+ var FlipS2R = Array(336);
597
+ var TwistS2R = Array(324);
598
+ var CPermS2R = Array(2768);
599
+ var EPermS2R = CPermS2R;
600
+ var FlipR2S = Array(2048);
601
+ var TwistR2S = Array(2187);
602
+ var EPermR2S = createArray(40320);
603
+ for (var i = 0; i < 40320; i++) EPermR2S[i] = 0;
604
+ var MtoEPerm = Array(40320);
605
+ var merge = Array(56);
606
+ var e2c = [
607
+ 0,
608
+ 0,
609
+ 0,
610
+ 0,
611
+ 1,
612
+ 3,
613
+ 1,
614
+ 3,
615
+ 1,
616
+ 3,
617
+ 1,
618
+ 3,
619
+ 0,
620
+ 0,
621
+ 0,
622
+ 0
623
+ ];
624
+ const urf1 = new CubieCube();
625
+ urf1.init(2531, 1373, 67026819, 1877);
626
+ const urf2 = new CubieCube();
627
+ urf2.init(2089, 1906, 322752913, 255);
628
+ function CubieInit() {
629
+ var mc = Array(6);
630
+ mc[0] = new CubieCube();
631
+ mc[0].init(15120, 0, 119750400, 0);
632
+ mc[1] = new CubieCube();
633
+ mc[1].init(21021, 1494, 323403417, 0);
634
+ mc[2] = new CubieCube();
635
+ mc[2].init(8064, 1236, 29441808, 802);
636
+ mc[3] = new CubieCube();
637
+ mc[3].init(9, 0, 5880, 0);
638
+ mc[4] = new CubieCube();
639
+ mc[4].init(1230, 412, 2949660, 0);
640
+ mc[5] = new CubieCube();
641
+ mc[5].init(224, 137, 328552, 1160);
642
+ for (var m = 0; m < 6; m++) {
643
+ moveCube[m * 3] = mc[m];
644
+ for (var p = 0; p < 2; p++) {
645
+ moveCube[m * 3 + p + 1] = new CubieCube();
646
+ EdgeMult(moveCube[m * 3 + p], mc[m], moveCube[m * 3 + p + 1]);
647
+ CornMult(moveCube[m * 3 + p], mc[m], moveCube[m * 3 + p + 1]);
648
+ }
649
+ }
650
+ var c = new CubieCube();
651
+ var d = new CubieCube();
652
+ var temp;
653
+ var f2 = new CubieCube();
654
+ f2.init(28783, 0, 259268407, 0);
655
+ var u4 = new CubieCube();
656
+ u4.init(15138, 0, 119765538, 1792);
657
+ var lr2 = new CubieCube();
658
+ lr2.init(5167, 0, 83473207, 0);
659
+ lr2.co = [
660
+ 3,
661
+ 3,
662
+ 3,
663
+ 3,
664
+ 3,
665
+ 3,
666
+ 3,
667
+ 3
668
+ ];
669
+ for (var i = 0; i < 16; i++) {
670
+ SymMult[i] = Array(16);
671
+ SymMove[i] = Array(18);
672
+ SymMoveUD[i] = Array(10);
673
+ CubeSym[i] = new CubieCube();
674
+ CubeSym[i].copy(c);
675
+ CornMult(c, u4, d);
676
+ EdgeMult(c, u4, d);
677
+ temp = d;
678
+ d = c;
679
+ c = temp;
680
+ if (i % 4 == 3) {
681
+ CornMult(c, lr2, d);
682
+ EdgeMult(c, lr2, d);
683
+ temp = d;
684
+ d = c;
685
+ c = temp;
686
+ }
687
+ if (i % 8 == 7) {
688
+ CornMult(c, f2, d);
689
+ EdgeMult(c, f2, d);
690
+ temp = d;
691
+ d = c;
692
+ c = temp;
693
+ }
694
+ }
695
+ for (var j = 0; j < 16; j++) for (var k = 0; k < 16; k++) {
696
+ CornMult(CubeSym[j], CubeSym[k], c);
697
+ if (c.cp[0] == 0 && c.cp[1] == 1 && c.cp[2] == 2) {
698
+ SymInv[j] = k;
699
+ break;
700
+ }
701
+ }
702
+ for (var i = 0; i < 16; i++) for (var j = 0; j < 16; j++) {
703
+ CornMult(CubeSym[i], CubeSym[j], c);
704
+ for (var k = 0; k < 16; k++) if (CubeSym[k].cp[0] == c.cp[0] && CubeSym[k].cp[1] == c.cp[1] && CubeSym[k].cp[2] == c.cp[2]) {
705
+ SymMult[i][j] = k;
706
+ break;
707
+ }
708
+ }
709
+ for (var j = 0; j < 18; j++) for (var s = 0; s < 16; s++) {
710
+ CornConjugate(moveCube[j], SymInv[s], c);
711
+ for (var m = 0; m < 18; m++) {
712
+ var found = 1;
713
+ for (var i = 0; i < 8; i++) if (c.cp[i] != moveCube[m].cp[i] || c.co[i] != moveCube[m].co[i]) {
714
+ found = 0;
715
+ break;
716
+ }
717
+ if (found) SymMove[s][j] = m;
718
+ }
719
+ }
720
+ for (var j = 0; j < 10; j++) for (var s = 0; s < 16; s++) SymMoveUD[s][j] = std2ud[SymMove[s][ud2std[j]]];
721
+ for (var j = 0; j < 8; j++) {
722
+ Sym8Mult[j] = Array(8);
723
+ Sym8Move[j] = Array(18);
724
+ Sym8MultInv[j] = Array(8);
725
+ for (var s = 0; s < 8; s++) Sym8Mult[j][s] = SymMult[j << 1][s << 1] >>> 1;
726
+ }
727
+ for (var j = 0; j < 18; j++) for (var s = 0; s < 8; s++) Sym8Move[s][j] = SymMove[s << 1][j];
728
+ for (var j = 0; j < 8; j++) for (var s = 0; s < 8; s++) Sym8MultInv[j][s] = Sym8Mult[j][SymInv[s << 1] >> 1];
729
+ const occ = new Array(1260);
730
+ var count = 0;
731
+ for (var i = 0; i < 64; occ[i++] = 0);
732
+ for (var i = 0; i < 2048; i++) if ((occ[i >>> 5] & 1 << (i & 31)) == 0) {
733
+ c.setFlip(i);
734
+ for (var s = 0; s < 16; s += 2) {
735
+ EdgeConjugate(c, s, d);
736
+ var idx = d.getFlip();
737
+ occ[idx >>> 5] |= 1 << (idx & 31);
738
+ FlipR2S[idx] = count << 3 | s >>> 1;
739
+ }
740
+ FlipS2R[count++] = i;
741
+ }
742
+ count = 0;
743
+ for (var i = 0; i < 69; occ[i++] = 0);
744
+ for (var i = 0; i < 2187; i++) if ((occ[i >>> 5] & 1 << (i & 31)) == 0) {
745
+ c.setTwist(i);
746
+ for (var s = 0; s < 16; s += 2) {
747
+ CornConjugate(c, s, d);
748
+ var idx = d.getTwist();
749
+ occ[idx >>> 5] |= 1 << (idx & 31);
750
+ TwistR2S[idx] = count << 3 | s >>> 1;
751
+ }
752
+ TwistS2R[count++] = i;
753
+ }
754
+ var mask = Array(56);
755
+ for (var i = 0; i < 56; i++) {
756
+ mask[i] = Array(2);
757
+ merge[i] = Array(56);
758
+ }
759
+ for (var i = 0; i < 40320; i++) {
760
+ set8Perm(c.ep, i);
761
+ var a = ~~(c.getURtoUL() / 6);
762
+ var b = ~~(c.getDRtoDL() / 6);
763
+ mask[a][b >>> 5] |= 1 << (b & 31);
764
+ }
765
+ for (var i = 0; i < 56; i++) {
766
+ count = 0;
767
+ for (var j = 0; j < 56; j++) if ((mask[i][j >>> 5] & 1 << (j & 31)) != 0) merge[i][j] = count++;
768
+ }
769
+ count = 0;
770
+ for (var i = 0; i < 1260; occ[i++] = 0);
771
+ for (var i = 0; i < 40320; i++) if ((occ[i >>> 5] & 1 << (i & 31)) == 0) {
772
+ set8Perm(c.ep, i);
773
+ for (var s = 0; s < 16; s++) {
774
+ EdgeConjugate(c, s, d);
775
+ var idx = get8Perm(d.ep);
776
+ occ[idx >>> 5] |= 1 << (idx & 31);
777
+ var a = d.getURtoUL();
778
+ var b = d.getDRtoDL();
779
+ var m = merge[~~(a / 6)][~~(b / 6)] * 4032 + a * 12 + b % 6 * 2 + get8Parity(idx);
780
+ MtoEPerm[m] = count << 4 | s;
781
+ EPermR2S[idx] = count << 4 | s;
782
+ }
783
+ EPermS2R[count++] = i;
784
+ }
785
+ }
786
+ var UDSliceMove = Array(495);
787
+ var TwistMove = Array(324);
788
+ var FlipMove = Array(336);
789
+ var UDSliceConj = Array(495);
790
+ var UDSliceTwistPrun = Array(495 * 324);
791
+ var UDSliceFlipPrun = Array(495 * 336);
792
+ var TwistFlipPrun = Array(336 * 324 * 8);
793
+ var Mid3Move = Array(1320);
794
+ var Mid32MPerm = Array(24);
795
+ var CParity = Array(87);
796
+ var CPermMove = Array(2768);
797
+ var EPermMove = Array(2768);
798
+ var MPermMove = Array(24);
799
+ var MPermConj = Array(24);
800
+ var MCPermPrun = Array(24 * 2768);
801
+ var MEPermPrun = Array(24 * 2768);
802
+ function CoordInit() {
803
+ var c = new CubieCube();
804
+ var d = new CubieCube();
805
+ var i, j;
806
+ for (i = 0; i < 2768; i++) {
807
+ CPermMove[i] = Array(18);
808
+ set8Perm(c.cp, CPermS2R[i]);
809
+ for (j = 0; j < 18; j++) {
810
+ CornMult(c, moveCube[j], d);
811
+ CPermMove[i][j] = d.getCPermSym();
812
+ }
813
+ }
814
+ for (i = 0; i < 2768; i++) {
815
+ EPermMove[i] = Array(10);
816
+ set8Perm(c.ep, EPermS2R[i]);
817
+ for (j = 0; j < 10; j++) {
818
+ EdgeMult(c, moveCube[ud2std[j]], d);
819
+ EPermMove[i][j] = d.getEPermSym();
820
+ }
821
+ }
822
+ for (i = 0; i < 336; i++) {
823
+ FlipMove[i] = Array(18);
824
+ c.setFlip(FlipS2R[i]);
825
+ for (j = 0; j < 18; j++) {
826
+ EdgeMult(c, moveCube[j], d);
827
+ FlipMove[i][j] = d.getFlipSym();
828
+ }
829
+ }
830
+ for (i = 0; i < 324; i++) {
831
+ TwistMove[i] = Array(18);
832
+ c.setTwist(TwistS2R[i]);
833
+ for (j = 0; j < 18; j++) {
834
+ CornMult(c, moveCube[j], d);
835
+ TwistMove[i][j] = d.getTwistSym();
836
+ }
837
+ }
838
+ for (i = 0; i < 495; i++) {
839
+ UDSliceMove[i] = Array(18);
840
+ c.setUDSlice(i);
841
+ for (j = 0; j < 18; j++) {
842
+ EdgeMult(c, moveCube[j], d);
843
+ UDSliceMove[i][j] = d.getUDSlice();
844
+ }
845
+ }
846
+ for (i = 0; i < 495; i++) {
847
+ UDSliceConj[i] = Array(8);
848
+ c.setUDSlice(i);
849
+ for (j = 0; j < 16; j += 2) {
850
+ EdgeConjugate(c, SymInv[j], d);
851
+ UDSliceConj[i][j >>> 1] = d.getUDSlice();
852
+ }
853
+ }
854
+ for (i = 0; i < 1320; i++) {
855
+ Mid3Move[i] = Array(18);
856
+ c.setMid3(i);
857
+ for (j = 0; j < 18; j++) {
858
+ EdgeMult(c, moveCube[j], d);
859
+ Mid3Move[i][j] = d.getMid3();
860
+ }
861
+ }
862
+ for (i = 0; i < 24; i++) {
863
+ c.setMPerm(i);
864
+ Mid32MPerm[c.getMid3() % 24] = i;
865
+ }
866
+ for (i = 0; i < 2768; i++) CParity[i >>> 3] |= get8Parity(CPermS2R[i]) << (i & 7);
867
+ for (i = 0; i < 24; i++) {
868
+ MPermMove[i] = Array(10);
869
+ c.setMPerm(i);
870
+ for (j = 0; j < 10; j++) {
871
+ EdgeMult(c, moveCube[ud2std[j]], d);
872
+ MPermMove[i][j] = d.getMPerm();
873
+ }
874
+ }
875
+ for (i = 0; i < 24; i++) {
876
+ MPermConj[i] = Array(16);
877
+ c.setMPerm(i);
878
+ for (j = 0; j < 16; j++) {
879
+ EdgeConjugate(c, SymInv[j], d);
880
+ MPermConj[i][j] = d.getMPerm();
881
+ }
882
+ }
883
+ var SymState = Array(324);
884
+ for (i = 0; i < 324; i++) {
885
+ c.setTwist(TwistS2R[i]);
886
+ for (var j = 0; j < 8; j++) {
887
+ CornConjugate(c, j << 1, d);
888
+ if (binarySearch(TwistS2R, d.getTwist()) != 65535) SymState[i] |= 1 << j;
889
+ }
890
+ }
891
+ var SymStateF = Array(324);
892
+ for (i = 0; i < 336; i++) {
893
+ c.setFlip(FlipS2R[i]);
894
+ for (var j = 0; j < 8; j++) {
895
+ EdgeConjugate(c, j << 1, d);
896
+ if (binarySearch(FlipS2R, d.getFlip()) != 65535) SymStateF[i] |= 1 << j;
897
+ }
898
+ }
899
+ for (i = 0; i < 336 * 324 * 8; i++) TwistFlipPrun[i] = -1;
900
+ for (i = 0; i < 8; i++) TwistFlipPrun[i] = 0;
901
+ var depth = 0;
902
+ var done = 8;
903
+ var inv;
904
+ var select;
905
+ var check;
906
+ while (done < 336 * 324 * 8) {
907
+ inv = depth > 6;
908
+ select = inv ? -1 : depth;
909
+ check = inv ? depth : -1;
910
+ depth++;
911
+ for (i = 0; i < 336 * 324 * 8; i++) {
912
+ if (TwistFlipPrun[i] != select) continue;
913
+ var twist = ~~(i / 2688);
914
+ var flip = i % 2688;
915
+ var fsym = i & 7;
916
+ flip >>>= 3;
917
+ for (var m = 0; m < 18; m++) {
918
+ var twistx = TwistMove[twist][m];
919
+ var tsymx = twistx & 7;
920
+ twistx >>>= 3;
921
+ var flipx = FlipMove[flip][Sym8Move[fsym][m]];
922
+ var fsymx = Sym8MultInv[Sym8Mult[flipx & 7][fsym]][tsymx];
923
+ flipx >>>= 3;
924
+ var idx = twistx * 2688 + (flipx << 3 | fsymx);
925
+ if (TwistFlipPrun[idx] == check) {
926
+ done++;
927
+ if (inv) {
928
+ TwistFlipPrun[i] = depth;
929
+ break;
930
+ } else {
931
+ TwistFlipPrun[idx] = depth;
932
+ var sym = SymState[twistx];
933
+ var symF = SymStateF[flipx];
934
+ if (sym != 1 || symF != 1) {
935
+ for (var j = 0; j < 8; j++, symF >>= 1) if ((symF & 1) == 1) {
936
+ var fsymxx = Sym8MultInv[fsymx][j];
937
+ for (var k = 0; k < 8; k++) if ((sym & 1 << k) != 0) {
938
+ var idxx = twistx * 2688 + (flipx << 3 | Sym8MultInv[fsymxx][k]);
939
+ if (TwistFlipPrun[idxx] == -1) {
940
+ TwistFlipPrun[idxx] = depth;
941
+ done++;
942
+ }
943
+ }
944
+ }
945
+ }
946
+ }
947
+ }
948
+ }
949
+ }
950
+ }
951
+ for (i = 0; i < 495 * 324; i++) UDSliceTwistPrun[i] = -1;
952
+ UDSliceTwistPrun[0] = 0;
953
+ depth = 0;
954
+ done = 1;
955
+ while (done < 495 * 324) {
956
+ inv = depth > 6;
957
+ select = inv ? -1 : depth;
958
+ check = inv ? depth : -1;
959
+ depth++;
960
+ for (i = 0; i < 495 * 324; i++) if (UDSliceTwistPrun[i] == select) {
961
+ var slice = i % 495;
962
+ var twist = ~~(i / 495);
963
+ for (var m = 0; m < 18; m++) {
964
+ var twistx = TwistMove[twist][m];
965
+ var symx = twistx & 7;
966
+ var slicex = UDSliceConj[UDSliceMove[slice][m]][symx];
967
+ twistx >>>= 3;
968
+ var idx = twistx * 495 + slicex;
969
+ if (UDSliceTwistPrun[idx] == check) {
970
+ done++;
971
+ if (inv) {
972
+ UDSliceTwistPrun[i] = depth;
973
+ break;
974
+ } else {
975
+ UDSliceTwistPrun[idx] = depth;
976
+ var sym = SymState[twistx];
977
+ if (sym != 1) for (var j = 1; j < 8; j++) {
978
+ sym >>= 1;
979
+ if ((sym & 1) == 1) {
980
+ var idxx = twistx * 495 + UDSliceConj[slicex][j];
981
+ if (UDSliceTwistPrun[idxx] == -1) {
982
+ UDSliceTwistPrun[idxx] = depth;
983
+ done++;
984
+ }
985
+ }
986
+ }
987
+ }
988
+ }
989
+ }
990
+ }
991
+ }
992
+ for (i = 0; i < 495 * 336; i++) UDSliceFlipPrun[i] = -1;
993
+ UDSliceFlipPrun[0] = 0;
994
+ depth = 0;
995
+ done = 1;
996
+ while (done < 495 * 336) {
997
+ inv = depth > 6;
998
+ select = inv ? -1 : depth;
999
+ check = inv ? depth : -1;
1000
+ depth++;
1001
+ for (i = 0; i < 495 * 336; i++) if (UDSliceFlipPrun[i] == select) {
1002
+ var slice = i % 495;
1003
+ var flip = ~~(i / 495);
1004
+ for (var m = 0; m < 18; m++) {
1005
+ var flipx = FlipMove[flip][m];
1006
+ var symx = flipx & 7;
1007
+ var slicex = UDSliceConj[UDSliceMove[slice][m]][symx];
1008
+ flipx >>>= 3;
1009
+ var idx = flipx * 495 + slicex;
1010
+ if (UDSliceFlipPrun[idx] == check) {
1011
+ done++;
1012
+ if (inv) {
1013
+ UDSliceFlipPrun[i] = depth;
1014
+ break;
1015
+ } else {
1016
+ UDSliceFlipPrun[idx] = depth;
1017
+ var sym = SymStateF[flipx];
1018
+ if (sym != 1) for (var j = 1; j < 8; j++) {
1019
+ sym >>= 1;
1020
+ if ((sym & 1) == 1) {
1021
+ var idxx = flipx * 495 + UDSliceConj[slicex][j];
1022
+ if (UDSliceFlipPrun[idxx] == -1) {
1023
+ UDSliceFlipPrun[idxx] = depth;
1024
+ done++;
1025
+ }
1026
+ }
1027
+ }
1028
+ }
1029
+ }
1030
+ }
1031
+ }
1032
+ }
1033
+ SymState = Array(2768);
1034
+ for (i = 0; i < 2768; i++) {
1035
+ set8Perm(c.ep, EPermS2R[i]);
1036
+ for (j = 1; j < 16; j++) {
1037
+ EdgeConjugate(c, j, d);
1038
+ if (binarySearch(EPermS2R, get8Perm(d.ep)) != 65535) SymState[i] |= 1 << j;
1039
+ }
1040
+ }
1041
+ for (i = 0; i < 24 * 2768; i++) MEPermPrun[i] = -1;
1042
+ MEPermPrun[0] = 0;
1043
+ while (done < 24 * 2768) {
1044
+ inv = depth > 7;
1045
+ select = inv ? -1 : depth;
1046
+ check = inv ? depth : -1;
1047
+ depth++;
1048
+ for (i = 0; i < 24 * 2768; i++) if (MEPermPrun[i] == select) {
1049
+ var mid = i % 24;
1050
+ var edge = ~~(i / 24);
1051
+ for (var m = 0; m < 10; m++) {
1052
+ var edgex = EPermMove[edge][m];
1053
+ var symx = edgex & 15;
1054
+ var midx = MPermConj[MPermMove[mid][m]][symx];
1055
+ edgex >>>= 4;
1056
+ var idx = edgex * 24 + midx;
1057
+ if (MEPermPrun[idx] == check) {
1058
+ done++;
1059
+ if (inv) {
1060
+ MEPermPrun[i] = depth;
1061
+ break;
1062
+ } else {
1063
+ MEPermPrun[idx] = depth;
1064
+ var sym = SymState[edgex];
1065
+ if (sym != 0) for (j = 1; j < 16; j++) {
1066
+ sym >>= 1;
1067
+ if ((sym & 1) == 1) {
1068
+ var idxx = edgex * 24 + MPermConj[midx][j];
1069
+ if (MEPermPrun[idxx] == -1) {
1070
+ MEPermPrun[idxx] = depth;
1071
+ done++;
1072
+ }
1073
+ }
1074
+ }
1075
+ }
1076
+ }
1077
+ }
1078
+ }
1079
+ }
1080
+ for (i = 0; i < 24 * 2768; i++) MCPermPrun[i] = -1;
1081
+ MCPermPrun[0] = 0;
1082
+ depth = 0;
1083
+ done = 1;
1084
+ while (done < 24 * 2768) {
1085
+ inv = depth > 7;
1086
+ select = inv ? -1 : depth;
1087
+ check = inv ? depth : -1;
1088
+ depth++;
1089
+ for (i = 0; i < 24 * 2768; i++) if (MCPermPrun[i] == select) {
1090
+ var mid = i % 24;
1091
+ var corn = ~~(i / 24);
1092
+ for (var m = 0; m < 10; m++) {
1093
+ var cornx = CPermMove[corn][ud2std[m]];
1094
+ var symx = cornx & 15;
1095
+ var midx = MPermConj[MPermMove[mid][m]][symx];
1096
+ cornx >>>= 4;
1097
+ var idx = cornx * 24 + midx;
1098
+ if (MCPermPrun[idx] == check) {
1099
+ done++;
1100
+ if (inv) {
1101
+ MCPermPrun[i] = depth;
1102
+ break;
1103
+ } else {
1104
+ MCPermPrun[idx] = depth;
1105
+ var sym = SymState[cornx];
1106
+ if (sym != 0) for (j = 1; j < 16; j++) {
1107
+ sym >>= 1;
1108
+ if ((sym & 1) == 1) {
1109
+ var idxx = cornx * 24 + MPermConj[midx][j ^ e2c[j]];
1110
+ if (MCPermPrun[idxx] == -1) {
1111
+ MCPermPrun[idxx] = depth;
1112
+ done++;
1113
+ }
1114
+ }
1115
+ }
1116
+ }
1117
+ }
1118
+ }
1119
+ }
1120
+ }
1121
+ }
1122
+ var move = Array(31);
1123
+ var corn = Array(20);
1124
+ var csym = Array(20);
1125
+ var mid3 = Array(20);
1126
+ var e1 = Array(20);
1127
+ var e2 = Array(20);
1128
+ var urfidx;
1129
+ var twist = Array(6);
1130
+ var tsym = Array(6);
1131
+ var flip = Array(6);
1132
+ var fsym = Array(6);
1133
+ var slice = Array(6);
1134
+ var corn0 = Array(6);
1135
+ var csym0 = Array(6);
1136
+ var mid30 = Array(6);
1137
+ var e10 = Array(6);
1138
+ var e20 = Array(6);
1139
+ var prun = Array(6);
1140
+ var length1 = 0;
1141
+ var maxlength2 = 0;
1142
+ var sol = 999;
1143
+ var valid1 = 0;
1144
+ var valid2 = 0;
1145
+ var solution = "";
1146
+ function Solve(c) {
1147
+ c.temps = new CubieCube();
1148
+ for (var i = 0; i < 6; i++) {
1149
+ twist[i] = c.getTwistSym();
1150
+ tsym[i] = twist[i] & 7;
1151
+ twist[i] >>>= 3;
1152
+ flip[i] = c.getFlipSym();
1153
+ fsym[i] = flip[i] & 7;
1154
+ flip[i] >>>= 3;
1155
+ slice[i] = c.getUDSlice();
1156
+ corn0[i] = c.getCPermSym();
1157
+ csym0[i] = corn0[i] & 15;
1158
+ corn0[i] >>>= 4;
1159
+ mid30[i] = c.getMid3();
1160
+ e10[i] = c.getURtoUL();
1161
+ e20[i] = c.getDRtoDL();
1162
+ prun[i] = Math.max(Math.max(UDSliceTwistPrun[twist[i] * 495 + UDSliceConj[slice[i]][tsym[i]]], UDSliceFlipPrun[flip[i] * 495 + UDSliceConj[slice[i]][fsym[i]]]), TwistFlipPrun[twist[i] * 2688 + (flip[i] << 3 | Sym8MultInv[fsym[i]][tsym[i]])]);
1163
+ c.URFConjugate();
1164
+ if (i == 2) c.invCubieCube();
1165
+ }
1166
+ solution = null;
1167
+ sol = 22;
1168
+ for (length1 = 0; length1 < sol; length1++) {
1169
+ maxlength2 = Math.min(sol / 2 + 1, sol - length1);
1170
+ for (urfidx = 0; urfidx < 6; urfidx++) {
1171
+ corn[0] = corn0[urfidx];
1172
+ csym[0] = csym0[urfidx];
1173
+ mid3[0] = mid30[urfidx];
1174
+ e1[0] = e10[urfidx];
1175
+ e2[0] = e20[urfidx];
1176
+ if (prun[urfidx] <= length1 && phase1(twist[urfidx], tsym[urfidx], flip[urfidx], fsym[urfidx], slice[urfidx], length1, 18)) if (solution == null) return "Error 8";
1177
+ else return solution;
1178
+ }
1179
+ }
1180
+ return "Error 7";
1181
+ }
1182
+ function phase1(twist, tsym, flip, fsym, slice, maxl, lm) {
1183
+ if (twist == 0 && flip == 0 && slice == 0 && maxl < 5) return maxl == 0 && init2();
1184
+ for (var m = 0; m < 18; m++) {
1185
+ if (ckmv[lm][m]) {
1186
+ m += 2;
1187
+ continue;
1188
+ }
1189
+ var slicex = UDSliceMove[slice][m];
1190
+ var twistx = TwistMove[twist][Sym8Move[tsym][m]];
1191
+ var tsymx = Sym8Mult[twistx & 7][tsym];
1192
+ twistx >>>= 3;
1193
+ if (UDSliceTwistPrun[twistx * 495 + UDSliceConj[slicex][tsymx]] >= maxl) continue;
1194
+ var flipx = FlipMove[flip][Sym8Move[fsym][m]];
1195
+ var fsymx = Sym8Mult[flipx & 7][fsym];
1196
+ flipx >>>= 3;
1197
+ if (TwistFlipPrun[twistx * 2688 + (flipx << 3 | Sym8MultInv[fsymx][tsymx])] >= maxl || UDSliceFlipPrun[flipx * 495 + UDSliceConj[slicex][fsymx]] >= maxl) continue;
1198
+ move[length1 - maxl] = m;
1199
+ valid1 = Math.min(valid1, length1 - maxl);
1200
+ if (phase1(twistx, tsymx, flipx, fsymx, slicex, maxl - 1, m)) return true;
1201
+ }
1202
+ return false;
1203
+ }
1204
+ function init2() {
1205
+ valid2 = Math.min(valid2, valid1);
1206
+ for (var i = valid1; i < length1; i++) {
1207
+ var m = move[i];
1208
+ corn[i + 1] = CPermMove[corn[i]][SymMove[csym[i]][m]];
1209
+ csym[i + 1] = SymMult[corn[i + 1] & 15][csym[i]];
1210
+ corn[i + 1] >>>= 4;
1211
+ mid3[i + 1] = Mid3Move[mid3[i]][m];
1212
+ }
1213
+ valid1 = length1;
1214
+ var mid = Mid32MPerm[mid3[length1] % 24];
1215
+ var prun = MCPermPrun[corn[length1] * 24 + MPermConj[mid][csym[length1]]];
1216
+ if (prun >= maxlength2) return false;
1217
+ for (var i = valid2; i < length1; i++) {
1218
+ e1[i + 1] = Mid3Move[e1[i]][move[i]];
1219
+ e2[i + 1] = Mid3Move[e2[i]][move[i]];
1220
+ }
1221
+ valid2 = length1;
1222
+ var cornx = corn[length1];
1223
+ var edge = MtoEPerm[merge[~~(e1[length1] / 6)][~~(e2[length1] / 6)] * 4032 + e1[length1] * 12 + e2[length1] % 6 * 2 + (CParity[cornx >>> 3] >>> (cornx & 7) & 1 ^ get4Parity(mid))];
1224
+ var esym = edge & 15;
1225
+ edge >>>= 4;
1226
+ prun = Math.max(MEPermPrun[edge * 24 + MPermConj[mid][esym]], prun);
1227
+ if (prun >= maxlength2) return false;
1228
+ var lm = length1 == 0 ? 10 : std2ud[~~(move[length1 - 1] / 3) * 3 + 1];
1229
+ for (var i = prun; i < maxlength2; i++) if (phase2(edge, esym, corn[length1], csym[length1], mid, i, length1, lm)) {
1230
+ sol = length1 + i;
1231
+ var sb = "";
1232
+ var urf = urfidx;
1233
+ urf = (urf + 3) % 6;
1234
+ if (urf < 3) {
1235
+ for (var s = 0; s < length1; s++) sb += move2str[urfMove[urf][move[s]]] + " ";
1236
+ for (var s = length1; s < sol; s++) sb += move2str[urfMove[urf][move[s]]] + " ";
1237
+ } else {
1238
+ for (var s = sol - 1; s >= length1; s--) sb += move2str[urfMove[urf][move[s]]] + " ";
1239
+ for (var s = length1 - 1; s >= 0; s--) sb += move2str[urfMove[urf][move[s]]] + " ";
1240
+ }
1241
+ solution = sb;
1242
+ return true;
1243
+ }
1244
+ return false;
1245
+ }
1246
+ function phase2(edge, esym, corn, csym, mid, maxl, depth, lm) {
1247
+ if (edge == 0 && corn == 0 && mid == 0) return true;
1248
+ for (var m = 0; m < 10; m++) {
1249
+ if (ckmv2[lm][m]) continue;
1250
+ var midx = MPermMove[mid][m];
1251
+ var edgex = EPermMove[edge][SymMoveUD[esym][m]];
1252
+ var esymx = SymMult[edgex & 15][esym];
1253
+ edgex >>>= 4;
1254
+ if (MEPermPrun[edgex * 24 + MPermConj[midx][esymx]] >= maxl) continue;
1255
+ var cornx = CPermMove[corn][SymMove[csym][ud2std[m]]];
1256
+ var csymx = SymMult[cornx & 15][csym];
1257
+ cornx >>>= 4;
1258
+ if (MCPermPrun[cornx * 24 + MPermConj[midx][csymx]] >= maxl) continue;
1259
+ move[depth] = ud2std[m];
1260
+ if (phase2(edgex, esymx, cornx, csymx, midx, maxl - 1, depth + 1, m)) return true;
1261
+ }
1262
+ return false;
1263
+ }
1264
+ var initialized = false;
1265
+ function initialize() {
1266
+ if (initialized) return;
1267
+ CubieInit();
1268
+ CoordInit();
1269
+ initialized = true;
1270
+ }
1271
+ function solve(c) {
1272
+ initialize();
1273
+ const cc = new CubieCube();
1274
+ cc.cp = c.cp;
1275
+ cc.co = c.co;
1276
+ cc.ep = c.ep;
1277
+ cc.eo = c.eo;
1278
+ return Solve(cc);
1279
+ }
1280
+ //#endregion
1281
+ export { initialize, solve };