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,798 @@
1
+ import { Cnk, move2std, swap } from "./tables.mjs";
2
+ //#region .build/vendor/scramble-core/src/solvers/threephase/center.ts
3
+ var Center1 = class Center1 {
4
+ static ctsmv = [];
5
+ static sym2raw = [];
6
+ static csprun = [];
7
+ static symmult = [];
8
+ static symmove = [];
9
+ static syminv = [];
10
+ static finish = [];
11
+ static rot2str = [
12
+ "",
13
+ "y2",
14
+ "x",
15
+ "x y2",
16
+ "x2",
17
+ "z2",
18
+ "x'",
19
+ "x' y2",
20
+ "",
21
+ "",
22
+ "",
23
+ "",
24
+ "",
25
+ "",
26
+ "",
27
+ "",
28
+ "y z",
29
+ "y' z'",
30
+ "y2 z",
31
+ "z'",
32
+ "y' z",
33
+ "y z'",
34
+ "z",
35
+ "z y2",
36
+ "",
37
+ "",
38
+ "",
39
+ "",
40
+ "",
41
+ "",
42
+ "",
43
+ "",
44
+ "y' x'",
45
+ "y x",
46
+ "y'",
47
+ "y",
48
+ "y' x",
49
+ "y x'",
50
+ "y z2",
51
+ "y' z2",
52
+ "",
53
+ "",
54
+ "",
55
+ "",
56
+ "",
57
+ "",
58
+ "",
59
+ ""
60
+ ];
61
+ static raw2sym = null;
62
+ ct = Array.from({ length: 24 }, (_, index) => index < 8 ? 1 : 0);
63
+ constructor(center, urf) {
64
+ if (center === void 0) return;
65
+ const source = "ct" in center ? center.ct : center;
66
+ for (let i = 0; i < 24; i += 1) this.ct[i] = urf === void 0 ? source[i] : source[i] % 3 === urf ? 1 : 0;
67
+ }
68
+ static ensureTables() {
69
+ if (Center1.ctsmv.length !== 0) return;
70
+ Center1.ctsmv = Array.from({ length: 15582 }, () => Array.from({ length: 36 }, () => 0));
71
+ Center1.sym2raw = Array.from({ length: 15582 }, () => 0);
72
+ Center1.csprun = Array.from({ length: 15582 }, () => -1);
73
+ Center1.symmult = Array.from({ length: 48 }, () => Array.from({ length: 48 }, () => 0));
74
+ Center1.symmove = Array.from({ length: 48 }, () => Array.from({ length: 36 }, () => 0));
75
+ Center1.syminv = Array.from({ length: 48 }, () => 0);
76
+ Center1.finish = Array.from({ length: 48 }, () => 0);
77
+ }
78
+ static initSym2Raw() {
79
+ Center1.ensureTables();
80
+ const center = new Center1();
81
+ const occ = Array.from({ length: Math.floor(735471 / 32) + 1 }, () => 0);
82
+ let count = 0;
83
+ for (let i = 0; i < 735471; i += 1) {
84
+ if ((occ[i >>> 5] & 1 << (i & 31)) !== 0) continue;
85
+ center.set(i);
86
+ for (let j = 0; j < 48; j += 1) {
87
+ const idx = center.get();
88
+ occ[idx >>> 5] = occ[idx >>> 5] | 1 << (idx & 31);
89
+ if (Center1.raw2sym !== null) Center1.raw2sym[idx] = count << 6 | Center1.syminv[j];
90
+ center.rot(0);
91
+ if (j % 2 === 1) center.rot(1);
92
+ if (j % 8 === 7) center.rot(2);
93
+ if (j % 16 === 15) center.rot(3);
94
+ }
95
+ Center1.sym2raw[count] = i;
96
+ count += 1;
97
+ }
98
+ }
99
+ static createMoveTable() {
100
+ Center1.ensureTables();
101
+ const center = new Center1();
102
+ const base = new Center1();
103
+ for (let i = 0; i < 15582; i += 1) {
104
+ base.set(Center1.sym2raw[i]);
105
+ for (let move = 0; move < 36; move += 1) {
106
+ center.copyFrom(base);
107
+ center.move(move);
108
+ Center1.ctsmv[i][move] = center.getsym();
109
+ }
110
+ }
111
+ }
112
+ static createPrun() {
113
+ Center1.ensureTables();
114
+ Center1.csprun.fill(-1);
115
+ Center1.csprun[0] = 0;
116
+ let depth = 0;
117
+ let done = 1;
118
+ while (done !== 15582) {
119
+ const inv = depth > 4;
120
+ const select = inv ? -1 : depth;
121
+ const check = inv ? depth : -1;
122
+ depth += 1;
123
+ for (let i = 0; i < 15582; i += 1) {
124
+ if (Center1.csprun[i] !== select) continue;
125
+ for (let move = 0; move < 27; move += 1) {
126
+ const idx = Center1.ctsmv[i][move] >>> 6;
127
+ if (Center1.csprun[idx] !== check) continue;
128
+ done += 1;
129
+ if (inv) {
130
+ Center1.csprun[i] = depth;
131
+ break;
132
+ }
133
+ Center1.csprun[idx] = depth;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ static raw2symIndex(raw) {
139
+ Center1.ensureTables();
140
+ let low = 0;
141
+ let high = Center1.sym2raw.length - 1;
142
+ while (low <= high) {
143
+ const mid = low + high >>> 1;
144
+ const value = Center1.sym2raw[mid];
145
+ if (value === raw) return mid;
146
+ if (value < raw) low = mid + 1;
147
+ else high = mid - 1;
148
+ }
149
+ return -1;
150
+ }
151
+ static getSolvedSym(cube) {
152
+ const center = new Center1(cube.ct);
153
+ for (let j = 0; j < 48; j += 1) {
154
+ let isSolved = true;
155
+ for (let i = 0; i < 24; i += 1) if (center.ct[i] !== Math.floor(CENTER_FACELET[i] / 16)) {
156
+ isSolved = false;
157
+ break;
158
+ }
159
+ if (isSolved) return j;
160
+ center.rot(0);
161
+ if (j % 2 === 1) center.rot(1);
162
+ if (j % 8 === 7) center.rot(2);
163
+ if (j % 16 === 15) center.rot(3);
164
+ }
165
+ return -1;
166
+ }
167
+ static initSym() {
168
+ Center1.ensureTables();
169
+ const center = new Center1();
170
+ for (let i = 0; i < 24; i += 1) center.ct[i] = i;
171
+ const base = new Center1(center.ct);
172
+ const moveBase = new Center1(center.ct);
173
+ const moved = new Center1(center.ct);
174
+ for (let i = 0; i < 48; i += 1) {
175
+ for (let j = 0; j < 48; j += 1) {
176
+ for (let k = 0; k < 48; k += 1) {
177
+ if (center.equals(base)) {
178
+ Center1.symmult[i][j] = k;
179
+ if (k === 0) Center1.syminv[i] = j;
180
+ }
181
+ base.rot(0);
182
+ if (k % 2 === 1) base.rot(1);
183
+ if (k % 8 === 7) base.rot(2);
184
+ if (k % 16 === 15) base.rot(3);
185
+ }
186
+ center.rot(0);
187
+ if (j % 2 === 1) center.rot(1);
188
+ if (j % 8 === 7) center.rot(2);
189
+ if (j % 16 === 15) center.rot(3);
190
+ }
191
+ center.rot(0);
192
+ if (i % 2 === 1) center.rot(1);
193
+ if (i % 8 === 7) center.rot(2);
194
+ if (i % 16 === 15) center.rot(3);
195
+ }
196
+ for (let i = 0; i < 48; i += 1) {
197
+ center.copyFrom(moveBase);
198
+ center.rotate(Center1.syminv[i]);
199
+ for (let j = 0; j < 36; j += 1) {
200
+ base.copyFrom(center);
201
+ base.move(j);
202
+ base.rotate(i);
203
+ for (let k = 0; k < 36; k += 1) {
204
+ moved.copyFrom(moveBase);
205
+ moved.move(k);
206
+ if (moved.equals(base)) {
207
+ Center1.symmove[i][j] = k;
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ }
213
+ center.set(0);
214
+ for (let i = 0; i < 48; i += 1) {
215
+ Center1.finish[Center1.syminv[i]] = center.get();
216
+ center.rot(0);
217
+ if (i % 2 === 1) center.rot(1);
218
+ if (i % 8 === 7) center.rot(2);
219
+ if (i % 16 === 15) center.rot(3);
220
+ }
221
+ }
222
+ move(move) {
223
+ const key = move % 3;
224
+ switch (Math.floor(move / 3)) {
225
+ case 0:
226
+ swap(this.ct, 0, 1, 2, 3, key);
227
+ break;
228
+ case 1:
229
+ swap(this.ct, 16, 17, 18, 19, key);
230
+ break;
231
+ case 2:
232
+ swap(this.ct, 8, 9, 10, 11, key);
233
+ break;
234
+ case 3:
235
+ swap(this.ct, 4, 5, 6, 7, key);
236
+ break;
237
+ case 4:
238
+ swap(this.ct, 20, 21, 22, 23, key);
239
+ break;
240
+ case 5:
241
+ swap(this.ct, 12, 13, 14, 15, key);
242
+ break;
243
+ case 6:
244
+ swap(this.ct, 0, 1, 2, 3, key);
245
+ swap(this.ct, 8, 20, 12, 16, key);
246
+ swap(this.ct, 9, 21, 13, 17, key);
247
+ break;
248
+ case 7:
249
+ swap(this.ct, 16, 17, 18, 19, key);
250
+ swap(this.ct, 1, 15, 5, 9, key);
251
+ swap(this.ct, 2, 12, 6, 10, key);
252
+ break;
253
+ case 8:
254
+ swap(this.ct, 8, 9, 10, 11, key);
255
+ swap(this.ct, 2, 19, 4, 21, key);
256
+ swap(this.ct, 3, 16, 5, 22, key);
257
+ break;
258
+ case 9:
259
+ swap(this.ct, 4, 5, 6, 7, key);
260
+ swap(this.ct, 10, 18, 14, 22, key);
261
+ swap(this.ct, 11, 19, 15, 23, key);
262
+ break;
263
+ case 10:
264
+ swap(this.ct, 20, 21, 22, 23, key);
265
+ swap(this.ct, 0, 8, 4, 14, key);
266
+ swap(this.ct, 3, 11, 7, 13, key);
267
+ break;
268
+ case 11:
269
+ swap(this.ct, 12, 13, 14, 15, key);
270
+ swap(this.ct, 1, 20, 7, 18, key);
271
+ swap(this.ct, 0, 23, 6, 17, key);
272
+ break;
273
+ }
274
+ }
275
+ set(index) {
276
+ let remaining = 8;
277
+ for (let i = 23; i >= 0; i -= 1) {
278
+ this.ct[i] = 0;
279
+ if (index >= Cnk[i][remaining]) {
280
+ index -= Cnk[i][remaining];
281
+ remaining -= 1;
282
+ this.ct[i] = 1;
283
+ }
284
+ }
285
+ }
286
+ get() {
287
+ let index = 0;
288
+ let remaining = 8;
289
+ for (let i = 23; i >= 0; i -= 1) if (this.ct[i] === 1) {
290
+ index += Cnk[i][remaining];
291
+ remaining -= 1;
292
+ }
293
+ return index;
294
+ }
295
+ getsym() {
296
+ if (Center1.raw2sym !== null) return Center1.raw2sym[this.get()];
297
+ for (let j = 0; j < 48; j += 1) {
298
+ const coord = Center1.raw2symIndex(this.get());
299
+ if (coord !== -1) return coord * 64 + j;
300
+ this.rot(0);
301
+ if (j % 2 === 1) this.rot(1);
302
+ if (j % 8 === 7) this.rot(2);
303
+ if (j % 16 === 15) this.rot(3);
304
+ }
305
+ throw new Error("@cubegin/scramble-core: invalid center symmetry coordinate");
306
+ }
307
+ copyFrom(center) {
308
+ for (let i = 0; i < 24; i += 1) this.ct[i] = center.ct[i];
309
+ }
310
+ rot(rotation) {
311
+ switch (rotation) {
312
+ case 0:
313
+ this.move(19);
314
+ this.move(28);
315
+ break;
316
+ case 1:
317
+ this.move(21);
318
+ this.move(32);
319
+ break;
320
+ case 2:
321
+ swap(this.ct, 0, 3, 1, 2, 1);
322
+ swap(this.ct, 8, 11, 9, 10, 1);
323
+ swap(this.ct, 4, 7, 5, 6, 1);
324
+ swap(this.ct, 12, 15, 13, 14, 1);
325
+ swap(this.ct, 16, 19, 21, 22, 1);
326
+ swap(this.ct, 17, 18, 20, 23, 1);
327
+ break;
328
+ case 3:
329
+ this.move(18);
330
+ this.move(29);
331
+ this.move(24);
332
+ this.move(35);
333
+ break;
334
+ }
335
+ }
336
+ rotate(rotation) {
337
+ for (let j = 0; j < rotation; j += 1) {
338
+ this.rot(0);
339
+ if (j % 2 === 1) this.rot(1);
340
+ if (j % 8 === 7) this.rot(2);
341
+ if (j % 16 === 15) this.rot(3);
342
+ }
343
+ }
344
+ equals(other) {
345
+ for (let i = 0; i < 24; i += 1) if (this.ct[i] !== other.ct[i]) return false;
346
+ return true;
347
+ }
348
+ };
349
+ var Center2 = class Center2 {
350
+ static rlmv = [];
351
+ static ctmv = [];
352
+ static rlrot = [];
353
+ static ctprun = [];
354
+ static pmv = [
355
+ 0,
356
+ 0,
357
+ 0,
358
+ 0,
359
+ 0,
360
+ 0,
361
+ 0,
362
+ 0,
363
+ 0,
364
+ 0,
365
+ 0,
366
+ 0,
367
+ 0,
368
+ 0,
369
+ 0,
370
+ 0,
371
+ 0,
372
+ 0,
373
+ 0,
374
+ 0,
375
+ 0,
376
+ 1,
377
+ 0,
378
+ 1,
379
+ 0,
380
+ 0,
381
+ 0,
382
+ 0,
383
+ 0,
384
+ 0,
385
+ 1,
386
+ 0,
387
+ 1,
388
+ 0,
389
+ 0,
390
+ 0
391
+ ];
392
+ rl = Array.from({ length: 8 }, () => 0);
393
+ ct = Array.from({ length: 16 }, () => 0);
394
+ parity = 0;
395
+ static ensureTables() {
396
+ if (Center2.rlmv.length !== 0) return;
397
+ Center2.rlmv = Array.from({ length: 70 }, () => Array.from({ length: 28 }, () => 0));
398
+ Center2.ctmv = Array.from({ length: 6435 }, () => Array.from({ length: 28 }, () => 0));
399
+ Center2.rlrot = Array.from({ length: 70 }, () => Array.from({ length: 16 }, () => 0));
400
+ Center2.ctprun = Array.from({ length: 6435 * 35 * 2 }, () => -1);
401
+ }
402
+ static init() {
403
+ Center2.ensureTables();
404
+ const center = new Center2();
405
+ for (let i = 0; i < 70; i += 1) for (let move = 0; move < 28; move += 1) {
406
+ center.setrl(i);
407
+ center.move(move2std[move]);
408
+ Center2.rlmv[i][move] = center.getrl();
409
+ }
410
+ for (let i = 0; i < 70; i += 1) {
411
+ center.setrl(i);
412
+ for (let j = 0; j < 16; j += 1) {
413
+ Center2.rlrot[i][j] = center.getrl();
414
+ center.rot(0);
415
+ if (j % 2 === 1) center.rot(1);
416
+ if (j % 8 === 7) center.rot(2);
417
+ }
418
+ }
419
+ for (let i = 0; i < 6435; i += 1) for (let move = 0; move < 28; move += 1) {
420
+ center.setct(i);
421
+ center.move(move2std[move]);
422
+ Center2.ctmv[i][move] = center.getct();
423
+ }
424
+ Center2.ctprun.fill(-1);
425
+ Center2.ctprun[0] = 0;
426
+ Center2.ctprun[18] = 0;
427
+ Center2.ctprun[28] = 0;
428
+ Center2.ctprun[46] = 0;
429
+ Center2.ctprun[54] = 0;
430
+ Center2.ctprun[56] = 0;
431
+ let depth = 0;
432
+ let done = 6;
433
+ while (done !== 6435 * 35 * 2) {
434
+ for (let i = 0; i < 6435 * 35 * 2; i += 1) {
435
+ if (Center2.ctprun[i] !== depth) continue;
436
+ const ct = Math.floor(i / 70);
437
+ const rl = i % 70;
438
+ for (let move = 0; move < 23; move += 1) {
439
+ const nextCt = Center2.ctmv[ct][move];
440
+ const nextRl = Center2.rlmv[rl][move];
441
+ const idx = nextCt * 70 + nextRl;
442
+ if (Center2.ctprun[idx] === -1) {
443
+ Center2.ctprun[idx] = depth + 1;
444
+ done += 1;
445
+ }
446
+ }
447
+ }
448
+ depth += 1;
449
+ }
450
+ }
451
+ set(center, edgeParity) {
452
+ for (let i = 0; i < 16; i += 1) this.ct[i] = center.ct[i] % 3;
453
+ for (let i = 0; i < 8; i += 1) this.rl[i] = center.ct[i + 16];
454
+ this.parity = edgeParity;
455
+ }
456
+ getrl() {
457
+ let idx = 0;
458
+ let remaining = 4;
459
+ for (let i = 6; i >= 0; i -= 1) if (this.rl[i] !== this.rl[7]) {
460
+ idx += Cnk[i][remaining];
461
+ remaining -= 1;
462
+ }
463
+ return idx * 2 + this.parity;
464
+ }
465
+ setrl(index) {
466
+ this.parity = index & 1;
467
+ index >>>= 1;
468
+ let remaining = 4;
469
+ this.rl[7] = 0;
470
+ for (let i = 6; i >= 0; i -= 1) if (index >= Cnk[i][remaining]) {
471
+ index -= Cnk[i][remaining];
472
+ remaining -= 1;
473
+ this.rl[i] = 1;
474
+ } else this.rl[i] = 0;
475
+ }
476
+ getct() {
477
+ let idx = 0;
478
+ let remaining = 8;
479
+ for (let i = 14; i >= 0; i -= 1) if (this.ct[i] !== this.ct[15]) {
480
+ idx += Cnk[i][remaining];
481
+ remaining -= 1;
482
+ }
483
+ return idx;
484
+ }
485
+ setct(index) {
486
+ let remaining = 8;
487
+ this.ct[15] = 0;
488
+ for (let i = 14; i >= 0; i -= 1) if (index >= Cnk[i][remaining]) {
489
+ index -= Cnk[i][remaining];
490
+ remaining -= 1;
491
+ this.ct[i] = 1;
492
+ } else this.ct[i] = 0;
493
+ }
494
+ rot(rotation) {
495
+ switch (rotation) {
496
+ case 0:
497
+ this.move(19);
498
+ this.move(28);
499
+ break;
500
+ case 1:
501
+ this.move(21);
502
+ this.move(32);
503
+ break;
504
+ case 2:
505
+ swap(this.ct, 0, 3, 1, 2, 1);
506
+ swap(this.ct, 8, 11, 9, 10, 1);
507
+ swap(this.ct, 4, 7, 5, 6, 1);
508
+ swap(this.ct, 12, 15, 13, 14, 1);
509
+ swap(this.rl, 0, 3, 5, 6, 1);
510
+ swap(this.rl, 1, 2, 4, 7, 1);
511
+ break;
512
+ }
513
+ }
514
+ move(move) {
515
+ this.parity ^= Center2.pmv[move];
516
+ const key = move % 3;
517
+ switch (Math.floor(move / 3)) {
518
+ case 0:
519
+ swap(this.ct, 0, 1, 2, 3, key);
520
+ break;
521
+ case 1:
522
+ swap(this.rl, 0, 1, 2, 3, key);
523
+ break;
524
+ case 2:
525
+ swap(this.ct, 8, 9, 10, 11, key);
526
+ break;
527
+ case 3:
528
+ swap(this.ct, 4, 5, 6, 7, key);
529
+ break;
530
+ case 4:
531
+ swap(this.rl, 4, 5, 6, 7, key);
532
+ break;
533
+ case 5:
534
+ swap(this.ct, 12, 13, 14, 15, key);
535
+ break;
536
+ case 6:
537
+ swap(this.ct, 0, 1, 2, 3, key);
538
+ swap(this.rl, 0, 5, 4, 1, key);
539
+ swap(this.ct, 8, 9, 12, 13, key);
540
+ break;
541
+ case 7:
542
+ swap(this.rl, 0, 1, 2, 3, key);
543
+ swap(this.ct, 1, 15, 5, 9, key);
544
+ swap(this.ct, 2, 12, 6, 10, key);
545
+ break;
546
+ case 8:
547
+ swap(this.ct, 8, 9, 10, 11, key);
548
+ swap(this.rl, 0, 3, 6, 5, key);
549
+ swap(this.ct, 3, 2, 5, 4, key);
550
+ break;
551
+ case 9:
552
+ swap(this.ct, 4, 5, 6, 7, key);
553
+ swap(this.rl, 3, 2, 7, 6, key);
554
+ swap(this.ct, 11, 10, 15, 14, key);
555
+ break;
556
+ case 10:
557
+ swap(this.rl, 4, 5, 6, 7, key);
558
+ swap(this.ct, 0, 8, 4, 14, key);
559
+ swap(this.ct, 3, 11, 7, 13, key);
560
+ break;
561
+ case 11:
562
+ swap(this.ct, 12, 13, 14, 15, key);
563
+ swap(this.rl, 1, 4, 7, 2, key);
564
+ swap(this.ct, 1, 0, 7, 6, key);
565
+ break;
566
+ }
567
+ }
568
+ };
569
+ var Center3 = class Center3 {
570
+ static ctmove = [];
571
+ static prun = [];
572
+ static pmove = [
573
+ 0,
574
+ 0,
575
+ 0,
576
+ 0,
577
+ 0,
578
+ 0,
579
+ 0,
580
+ 0,
581
+ 0,
582
+ 0,
583
+ 0,
584
+ 0,
585
+ 0,
586
+ 0,
587
+ 1,
588
+ 1,
589
+ 1,
590
+ 1,
591
+ 1,
592
+ 1
593
+ ];
594
+ static rl2std = [
595
+ 0,
596
+ 9,
597
+ 14,
598
+ 23,
599
+ 27,
600
+ 28,
601
+ 41,
602
+ 42,
603
+ 46,
604
+ 55,
605
+ 60,
606
+ 69
607
+ ];
608
+ static std2rl = Array.from({ length: 70 }, () => 0);
609
+ ud = Array.from({ length: 8 }, () => 0);
610
+ rl = Array.from({ length: 8 }, () => 0);
611
+ fb = Array.from({ length: 8 }, () => 0);
612
+ parity = 0;
613
+ static ensureTables() {
614
+ if (Center3.ctmove.length !== 0) return;
615
+ Center3.ctmove = Array.from({ length: 1225 * 12 * 2 }, () => Array.from({ length: 20 }, () => 0));
616
+ Center3.prun = Array.from({ length: 1225 * 12 * 2 }, () => -1);
617
+ }
618
+ static init() {
619
+ Center3.ensureTables();
620
+ Center3.std2rl.fill(0);
621
+ for (let i = 0; i < 12; i += 1) Center3.std2rl[Center3.rl2std[i]] = i;
622
+ const center = new Center3();
623
+ for (let i = 0; i < 1225 * 12 * 2; i += 1) for (let move = 0; move < 20; move += 1) {
624
+ center.setct(i);
625
+ center.move(move);
626
+ Center3.ctmove[i][move] = center.getct();
627
+ }
628
+ Center3.prun.fill(-1);
629
+ Center3.prun[0] = 0;
630
+ let depth = 0;
631
+ let done = 1;
632
+ while (done !== 29400) {
633
+ for (let i = 0; i < 29400; i += 1) {
634
+ if (Center3.prun[i] !== depth) continue;
635
+ for (let move = 0; move < 17; move += 1) {
636
+ const next = Center3.ctmove[i][move];
637
+ if (Center3.prun[next] === -1) {
638
+ Center3.prun[next] = depth + 1;
639
+ done += 1;
640
+ }
641
+ }
642
+ }
643
+ depth += 1;
644
+ }
645
+ }
646
+ set(center, edgeCornerParity) {
647
+ const parity = center.ct[0] % 3 > center.ct[8] % 3 !== center.ct[8] % 3 > center.ct[16] % 3 !== center.ct[0] % 3 > center.ct[16] % 3 ? 0 : 1;
648
+ for (let i = 0; i < 8; i += 1) {
649
+ this.ud[i] = (Math.floor(center.ct[i] / 3) ^ 1) & 1;
650
+ this.fb[i] = (Math.floor(center.ct[i + 8] / 3) ^ 1) & 1;
651
+ this.rl[i] = (Math.floor(center.ct[i + 16] / 3) ^ 1 ^ parity) & 1;
652
+ }
653
+ this.parity = parity ^ edgeCornerParity;
654
+ }
655
+ getct() {
656
+ let idx = 0;
657
+ let remaining = 4;
658
+ for (let i = 6; i >= 0; i -= 1) if (this.ud[i] !== this.ud[7]) {
659
+ idx += Cnk[i][remaining];
660
+ remaining -= 1;
661
+ }
662
+ idx *= 35;
663
+ remaining = 4;
664
+ for (let i = 6; i >= 0; i -= 1) if (this.fb[i] !== this.fb[7]) {
665
+ idx += Cnk[i][remaining];
666
+ remaining -= 1;
667
+ }
668
+ idx *= 12;
669
+ const check = this.fb[7] ^ this.ud[7];
670
+ let idxrl = 0;
671
+ remaining = 4;
672
+ for (let i = 7; i >= 0; i -= 1) if (this.rl[i] !== check) {
673
+ idxrl += Cnk[i][remaining];
674
+ remaining -= 1;
675
+ }
676
+ return this.parity + 2 * (idx + Center3.std2rl[idxrl]);
677
+ }
678
+ setct(index) {
679
+ this.parity = index & 1;
680
+ index >>>= 1;
681
+ let idxrl = Center3.rl2std[index % 12];
682
+ index = Math.floor(index / 12);
683
+ let remaining = 4;
684
+ for (let i = 7; i >= 0; i -= 1) {
685
+ this.rl[i] = 0;
686
+ if (idxrl >= Cnk[i][remaining]) {
687
+ idxrl -= Cnk[i][remaining];
688
+ remaining -= 1;
689
+ this.rl[i] = 1;
690
+ }
691
+ }
692
+ let idxfb = index % 35;
693
+ index = Math.floor(index / 35);
694
+ remaining = 4;
695
+ this.fb[7] = 0;
696
+ for (let i = 6; i >= 0; i -= 1) if (idxfb >= Cnk[i][remaining]) {
697
+ idxfb -= Cnk[i][remaining];
698
+ remaining -= 1;
699
+ this.fb[i] = 1;
700
+ } else this.fb[i] = 0;
701
+ remaining = 4;
702
+ this.ud[7] = 0;
703
+ for (let i = 6; i >= 0; i -= 1) if (index >= Cnk[i][remaining]) {
704
+ index -= Cnk[i][remaining];
705
+ remaining -= 1;
706
+ this.ud[i] = 1;
707
+ } else this.ud[i] = 0;
708
+ }
709
+ move(move) {
710
+ this.parity ^= Center3.pmove[move];
711
+ switch (move) {
712
+ case 0:
713
+ case 1:
714
+ case 2:
715
+ swap(this.ud, 0, 1, 2, 3, move % 3);
716
+ break;
717
+ case 3:
718
+ swap(this.rl, 0, 1, 2, 3, 1);
719
+ break;
720
+ case 4:
721
+ case 5:
722
+ case 6:
723
+ swap(this.fb, 0, 1, 2, 3, (move - 1) % 3);
724
+ break;
725
+ case 7:
726
+ case 8:
727
+ case 9:
728
+ swap(this.ud, 4, 5, 6, 7, (move - 1) % 3);
729
+ break;
730
+ case 10:
731
+ swap(this.rl, 4, 5, 6, 7, 1);
732
+ break;
733
+ case 11:
734
+ case 12:
735
+ case 13:
736
+ swap(this.fb, 4, 5, 6, 7, (move + 1) % 3);
737
+ break;
738
+ case 14:
739
+ swap(this.ud, 0, 1, 2, 3, 1);
740
+ swap(this.rl, 0, 5, 4, 1, 1);
741
+ swap(this.fb, 0, 5, 4, 1, 1);
742
+ break;
743
+ case 15:
744
+ swap(this.rl, 0, 1, 2, 3, 1);
745
+ swap(this.fb, 1, 4, 7, 2, 1);
746
+ swap(this.ud, 1, 6, 5, 2, 1);
747
+ break;
748
+ case 16:
749
+ swap(this.fb, 0, 1, 2, 3, 1);
750
+ swap(this.ud, 3, 2, 5, 4, 1);
751
+ swap(this.rl, 0, 3, 6, 5, 1);
752
+ break;
753
+ case 17:
754
+ swap(this.ud, 4, 5, 6, 7, 1);
755
+ swap(this.rl, 3, 2, 7, 6, 1);
756
+ swap(this.fb, 3, 2, 7, 6, 1);
757
+ break;
758
+ case 18:
759
+ swap(this.rl, 4, 5, 6, 7, 1);
760
+ swap(this.fb, 0, 3, 6, 5, 1);
761
+ swap(this.ud, 0, 3, 4, 7, 1);
762
+ break;
763
+ case 19:
764
+ swap(this.fb, 4, 5, 6, 7, 1);
765
+ swap(this.ud, 0, 7, 6, 1, 1);
766
+ swap(this.rl, 1, 4, 7, 2, 1);
767
+ break;
768
+ }
769
+ }
770
+ };
771
+ const CENTER_FACELET = [
772
+ 5,
773
+ 6,
774
+ 10,
775
+ 9,
776
+ 53,
777
+ 54,
778
+ 58,
779
+ 57,
780
+ 37,
781
+ 38,
782
+ 42,
783
+ 41,
784
+ 85,
785
+ 86,
786
+ 90,
787
+ 89,
788
+ 21,
789
+ 22,
790
+ 26,
791
+ 25,
792
+ 69,
793
+ 70,
794
+ 74,
795
+ 73
796
+ ];
797
+ //#endregion
798
+ export { Center1, Center2, Center3 };