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,632 @@
1
+ import { parity, swap } from "./tables.mjs";
2
+ //#region .build/vendor/scramble-core/src/solvers/threephase/edge.ts
3
+ var EdgeCube = class EdgeCube {
4
+ static edgeColor = [
5
+ [2, 0],
6
+ [4, 0],
7
+ [5, 0],
8
+ [1, 0],
9
+ [5, 3],
10
+ [4, 3],
11
+ [2, 3],
12
+ [1, 3],
13
+ [2, 4],
14
+ [5, 4],
15
+ [5, 1],
16
+ [2, 1]
17
+ ];
18
+ static edgeMap = [
19
+ 19,
20
+ 37,
21
+ 46,
22
+ 10,
23
+ 52,
24
+ 43,
25
+ 25,
26
+ 16,
27
+ 21,
28
+ 50,
29
+ 48,
30
+ 23,
31
+ 7,
32
+ 3,
33
+ 1,
34
+ 5,
35
+ 34,
36
+ 30,
37
+ 28,
38
+ 32,
39
+ 41,
40
+ 39,
41
+ 14,
42
+ 12
43
+ ];
44
+ ep = Array.from({ length: 24 }, (_, index) => index);
45
+ static random(random) {
46
+ const cube = new EdgeCube();
47
+ for (let i = 0; i < 23; i += 1) {
48
+ const t = i + random.nextInt(24 - i);
49
+ if (t !== i) {
50
+ const value = cube.ep[i];
51
+ cube.ep[i] = cube.ep[t];
52
+ cube.ep[t] = value;
53
+ }
54
+ }
55
+ return cube;
56
+ }
57
+ copy(edge) {
58
+ for (let i = 0; i < 24; i += 1) this.ep[i] = edge.ep[i];
59
+ }
60
+ getParity() {
61
+ return parity(this.ep);
62
+ }
63
+ fill333Facelet(facelet) {
64
+ for (let i = 0; i < 24; i += 1) facelet[EdgeCube.edgeMap[i]] = "URFDLB"[EdgeCube.edgeColor[this.ep[i] % 12][Math.floor(this.ep[i] / 12)]];
65
+ }
66
+ checkEdge() {
67
+ let check = 0;
68
+ let edgeParity = false;
69
+ for (let i = 0; i < 12; i += 1) {
70
+ check |= 1 << this.ep[i];
71
+ edgeParity = edgeParity !== this.ep[i] >= 12;
72
+ }
73
+ check &= check >> 12;
74
+ return check === 0 && !edgeParity;
75
+ }
76
+ move(move) {
77
+ const key = move % 3;
78
+ switch (Math.floor(move / 3)) {
79
+ case 0:
80
+ swap(this.ep, 0, 1, 2, 3, key);
81
+ swap(this.ep, 12, 13, 14, 15, key);
82
+ break;
83
+ case 1:
84
+ swap(this.ep, 11, 15, 10, 19, key);
85
+ swap(this.ep, 23, 3, 22, 7, key);
86
+ break;
87
+ case 2:
88
+ swap(this.ep, 0, 11, 6, 8, key);
89
+ swap(this.ep, 12, 23, 18, 20, key);
90
+ break;
91
+ case 3:
92
+ swap(this.ep, 4, 5, 6, 7, key);
93
+ swap(this.ep, 16, 17, 18, 19, key);
94
+ break;
95
+ case 4:
96
+ swap(this.ep, 1, 20, 5, 21, key);
97
+ swap(this.ep, 13, 8, 17, 9, key);
98
+ break;
99
+ case 5:
100
+ swap(this.ep, 2, 9, 4, 10, key);
101
+ swap(this.ep, 14, 21, 16, 22, key);
102
+ break;
103
+ case 6:
104
+ swap(this.ep, 0, 1, 2, 3, key);
105
+ swap(this.ep, 12, 13, 14, 15, key);
106
+ swap(this.ep, 9, 22, 11, 20, key);
107
+ break;
108
+ case 7:
109
+ swap(this.ep, 11, 15, 10, 19, key);
110
+ swap(this.ep, 23, 3, 22, 7, key);
111
+ swap(this.ep, 2, 16, 6, 12, key);
112
+ break;
113
+ case 8:
114
+ swap(this.ep, 0, 11, 6, 8, key);
115
+ swap(this.ep, 12, 23, 18, 20, key);
116
+ swap(this.ep, 3, 19, 5, 13, key);
117
+ break;
118
+ case 9:
119
+ swap(this.ep, 4, 5, 6, 7, key);
120
+ swap(this.ep, 16, 17, 18, 19, key);
121
+ swap(this.ep, 8, 23, 10, 21, key);
122
+ break;
123
+ case 10:
124
+ swap(this.ep, 1, 20, 5, 21, key);
125
+ swap(this.ep, 13, 8, 17, 9, key);
126
+ swap(this.ep, 14, 0, 18, 4, key);
127
+ break;
128
+ case 11:
129
+ swap(this.ep, 2, 9, 4, 10, key);
130
+ swap(this.ep, 14, 21, 16, 22, key);
131
+ swap(this.ep, 7, 15, 1, 17, key);
132
+ break;
133
+ }
134
+ }
135
+ };
136
+ var Edge3 = class Edge3 {
137
+ static N_SYM = 1538;
138
+ static N_RAW = 20160;
139
+ static N_EPRUN = Edge3.N_SYM * Edge3.N_RAW;
140
+ static MAX_DEPTH = 10;
141
+ static prunValues = [
142
+ 1,
143
+ 4,
144
+ 16,
145
+ 55,
146
+ 324,
147
+ 1922,
148
+ 12275,
149
+ 77640,
150
+ 485359,
151
+ 2778197,
152
+ 11742425,
153
+ 27492416,
154
+ 31002941,
155
+ 31006080
156
+ ];
157
+ static eprun = [];
158
+ static sym2raw = [];
159
+ static symstate = [];
160
+ static raw2sym = [];
161
+ static syminv = [
162
+ 0,
163
+ 1,
164
+ 6,
165
+ 3,
166
+ 4,
167
+ 5,
168
+ 2,
169
+ 7
170
+ ];
171
+ static mvrot = [];
172
+ static mvroto = [];
173
+ static factX = [
174
+ 1,
175
+ 1,
176
+ 1,
177
+ 3,
178
+ 12,
179
+ 60,
180
+ 360,
181
+ 2520,
182
+ 20160,
183
+ 181440,
184
+ 1814400,
185
+ 19958400,
186
+ 239500800
187
+ ];
188
+ static done = 0;
189
+ static fullEdgeMap = [
190
+ 0,
191
+ 2,
192
+ 4,
193
+ 6,
194
+ 1,
195
+ 3,
196
+ 7,
197
+ 5,
198
+ 8,
199
+ 9,
200
+ 10,
201
+ 11
202
+ ];
203
+ static popcount = [];
204
+ static selectUnused = [];
205
+ edge = Array.from({ length: 12 }, () => 0);
206
+ edgeo = Array.from({ length: 12 }, () => 0);
207
+ temp = Array.from({ length: 12 }, () => 0);
208
+ isStd = true;
209
+ static initStatus() {
210
+ return Edge3.done / Edge3.prunValues[Edge3.MAX_DEPTH - 1];
211
+ }
212
+ static ensureTables() {
213
+ if (Edge3.eprun.length !== 0) return;
214
+ Edge3.eprun = Array.from({ length: Math.floor(Edge3.N_EPRUN / 16) }, () => 0);
215
+ Edge3.sym2raw = Array.from({ length: Edge3.N_SYM }, () => 0);
216
+ Edge3.symstate = Array.from({ length: Edge3.N_SYM }, () => 0);
217
+ Edge3.raw2sym = Array.from({ length: 11880 }, () => 0);
218
+ Edge3.mvrot = Array.from({ length: 160 }, () => Array.from({ length: 12 }, () => 0));
219
+ Edge3.mvroto = Array.from({ length: 160 }, () => Array.from({ length: 12 }, () => 0));
220
+ }
221
+ static ensureCoordinateTables() {
222
+ if (Edge3.popcount.length !== 0) return;
223
+ Edge3.popcount = Array.from({ length: 4096 }, () => 0);
224
+ for (let mask = 1; mask < Edge3.popcount.length; mask += 1) Edge3.popcount[mask] = Edge3.popcount[mask >> 1] + (mask & 1);
225
+ Edge3.selectUnused = Array.from({ length: 4096 }, () => Array.from({ length: 12 }, () => -1));
226
+ for (let used = 0; used < Edge3.selectUnused.length; used += 1) {
227
+ let rank = 0;
228
+ for (let value = 0; value < 12; value += 1) {
229
+ if ((used & 1 << value) !== 0) continue;
230
+ Edge3.selectUnused[used][rank] = value;
231
+ rank += 1;
232
+ }
233
+ }
234
+ }
235
+ static initMvrot() {
236
+ Edge3.ensureTables();
237
+ const edge = new Edge3();
238
+ for (let move = 0; move < 20; move += 1) for (let rotation = 0; rotation < 8; rotation += 1) {
239
+ edge.set(0);
240
+ edge.move(move);
241
+ edge.rotate(rotation);
242
+ for (let i = 0; i < 12; i += 1) Edge3.mvrot[move << 3 | rotation][i] = edge.edge[i];
243
+ edge.std();
244
+ for (let i = 0; i < 12; i += 1) Edge3.mvroto[move << 3 | rotation][i] = edge.temp[i];
245
+ }
246
+ }
247
+ static initRaw2Sym() {
248
+ Edge3.ensureTables();
249
+ Edge3.sym2raw.fill(0);
250
+ Edge3.symstate.fill(0);
251
+ Edge3.raw2sym.fill(0);
252
+ const edge = new Edge3();
253
+ const occ = Array.from({ length: Math.floor(11880 / 8) }, () => 0);
254
+ let count = 0;
255
+ for (let i = 0; i < 11880; i += 1) {
256
+ if ((occ[i >>> 3] & 1 << (i & 7)) !== 0) continue;
257
+ if (count >= Edge3.N_SYM) throw new Error("@cubegin/scramble-core: Edge3 raw symmetry table overflow");
258
+ edge.set(i * Edge3.factX[8]);
259
+ for (let j = 0; j < 8; j += 1) {
260
+ const idx = edge.get(4);
261
+ if (idx === i) Edge3.symstate[count] = Edge3.symstate[count] | 1 << j;
262
+ occ[idx >> 3] = occ[idx >> 3] | 1 << (idx & 7);
263
+ Edge3.raw2sym[idx] = count << 3 | Edge3.syminv[j];
264
+ edge.rot(0);
265
+ if (j % 2 === 1) {
266
+ edge.rot(1);
267
+ edge.rot(2);
268
+ }
269
+ }
270
+ Edge3.sym2raw[count] = i;
271
+ count += 1;
272
+ }
273
+ if (count !== Edge3.N_SYM) throw new Error(`@cubegin/scramble-core: Edge3 raw symmetry table initialized ${count} classes`);
274
+ }
275
+ static setPruning(table, index, value) {
276
+ table[index >> 4] = table[index >> 4] ^ (3 ^ value) << ((index & 15) << 1);
277
+ }
278
+ static getPruning(table, index) {
279
+ return table[index >> 4] >>> ((index & 15) << 1) & 3;
280
+ }
281
+ static getprun(edge, prun) {
282
+ if (prun !== void 0) {
283
+ const depm3 = Edge3.getPruning(Edge3.eprun, edge);
284
+ if (depm3 === 3) return Edge3.MAX_DEPTH;
285
+ return (depm3 - prun + 16) % 3 + prun - 1;
286
+ }
287
+ const temp = new Edge3();
288
+ let depth = 0;
289
+ let depm3 = Edge3.getPruning(Edge3.eprun, edge);
290
+ if (depm3 === 3) return Edge3.MAX_DEPTH;
291
+ while (edge !== 0) {
292
+ depm3 = depm3 === 0 ? 2 : depm3 - 1;
293
+ const symcord1 = Math.floor(edge / Edge3.N_RAW);
294
+ const cord1 = Edge3.sym2raw[symcord1];
295
+ const cord2 = edge % Edge3.N_RAW;
296
+ temp.set(cord1 * Edge3.N_RAW + cord2);
297
+ for (let move = 0; move < 17; move += 1) {
298
+ const cord1x = Edge3.getmvrot(temp.edge, move << 3, 4);
299
+ let symcord1x = Edge3.raw2sym[cord1x];
300
+ const symx = symcord1x & 7;
301
+ symcord1x >>>= 3;
302
+ const cord2x = Edge3.getmvrot(temp.edge, move << 3 | symx, 10) % Edge3.N_RAW;
303
+ const idx = symcord1x * Edge3.N_RAW + cord2x;
304
+ if (Edge3.getPruning(Edge3.eprun, idx) === depm3) {
305
+ depth += 1;
306
+ edge = idx;
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ return depth;
312
+ }
313
+ static createPrun() {
314
+ Edge3.ensureTables();
315
+ const edge = new Edge3();
316
+ const first = new Edge3();
317
+ const second = new Edge3();
318
+ Edge3.eprun.fill(-1);
319
+ let depth = 0;
320
+ Edge3.done = 1;
321
+ Edge3.setPruning(Edge3.eprun, 0, 0);
322
+ while (Edge3.done !== Edge3.N_EPRUN) {
323
+ const inv = depth > 9;
324
+ const depm3 = depth % 3;
325
+ const dep1m3 = (depth + 1) % 3;
326
+ const find = inv ? 3 : depm3;
327
+ const check = inv ? depm3 : 3;
328
+ if (depth >= Edge3.MAX_DEPTH - 1) break;
329
+ for (let base = 0; base < Edge3.N_EPRUN; base += 16) {
330
+ let value = Edge3.eprun[base >> 4];
331
+ if (!inv && value === -1) continue;
332
+ for (let i = base, end = base + 16; i < end; i += 1, value >>= 2) {
333
+ if ((value & 3) !== find) continue;
334
+ const symcord1 = Math.floor(i / Edge3.N_RAW);
335
+ const cord1 = Edge3.sym2raw[symcord1];
336
+ const cord2 = i % Edge3.N_RAW;
337
+ edge.set(cord1 * Edge3.N_RAW + cord2);
338
+ for (let move = 0; move < 17; move += 1) {
339
+ const cord1x = Edge3.getmvrot(edge.edge, move << 3, 4);
340
+ let symcord1x = Edge3.raw2sym[cord1x];
341
+ const symx = symcord1x & 7;
342
+ symcord1x >>>= 3;
343
+ const cord2x = Edge3.getmvrot(edge.edge, move << 3 | symx, 10) % Edge3.N_RAW;
344
+ const idx = symcord1x * Edge3.N_RAW + cord2x;
345
+ if (Edge3.getPruning(Edge3.eprun, idx) !== check) continue;
346
+ Edge3.setPruning(Edge3.eprun, inv ? i : idx, dep1m3);
347
+ Edge3.done += 1;
348
+ if (inv) break;
349
+ let symState = Edge3.symstate[symcord1x];
350
+ if (symState === 1) continue;
351
+ first.setEdge(edge);
352
+ first.move(move);
353
+ first.rotate(symx);
354
+ for (let j = 1; (symState >>= 1) !== 0; j += 1) {
355
+ if ((symState & 1) !== 1) continue;
356
+ second.setEdge(first);
357
+ second.rotate(j);
358
+ const idxx = symcord1x * Edge3.N_RAW + second.get(10) % Edge3.N_RAW;
359
+ if (Edge3.getPruning(Edge3.eprun, idxx) === check) {
360
+ Edge3.setPruning(Edge3.eprun, idxx, dep1m3);
361
+ Edge3.done += 1;
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
367
+ depth += 1;
368
+ }
369
+ if (Edge3.done !== Edge3.prunValues[Edge3.MAX_DEPTH - 1]) throw new Error(`@cubegin/scramble-core: Edge3 pruning table initialized ${Edge3.done} states`);
370
+ }
371
+ getsym() {
372
+ const cord1x = this.get(4);
373
+ let symcord1x = Edge3.raw2sym[cord1x];
374
+ const symx = symcord1x & 7;
375
+ symcord1x >>>= 3;
376
+ this.rotate(symx);
377
+ const cord2x = this.get(10) % Edge3.N_RAW;
378
+ return symcord1x * Edge3.N_RAW + cord2x;
379
+ }
380
+ setFromEdgeCube(edgeCube) {
381
+ for (let i = 0; i < 12; i += 1) {
382
+ this.temp[i] = i;
383
+ this.edge[i] = edgeCube.ep[Edge3.fullEdgeMap[i] + 12] % 12;
384
+ }
385
+ let edgeParity = 1;
386
+ for (let i = 0; i < 12; i += 1) while (this.edge[i] !== i) {
387
+ const t = this.edge[i];
388
+ this.edge[i] = this.edge[t];
389
+ this.edge[t] = t;
390
+ const s = this.temp[i];
391
+ this.temp[i] = this.temp[t];
392
+ this.temp[t] = s;
393
+ edgeParity ^= 1;
394
+ }
395
+ for (let i = 0; i < 12; i += 1) this.edge[i] = this.temp[edgeCube.ep[Edge3.fullEdgeMap[i]] % 12];
396
+ return edgeParity;
397
+ }
398
+ setEdge(edge) {
399
+ for (let i = 0; i < 12; i += 1) {
400
+ this.edge[i] = edge.edge[i];
401
+ this.edgeo[i] = edge.edgeo[i];
402
+ }
403
+ this.isStd = edge.isStd;
404
+ }
405
+ static getmvrot(edgePermutation, mrIdx, end) {
406
+ Edge3.ensureCoordinateTables();
407
+ const moveO = Edge3.mvroto[mrIdx];
408
+ const move = Edge3.mvrot[mrIdx];
409
+ let idx = 0;
410
+ let used = 0;
411
+ for (let i = 0; i < end; i += 1) {
412
+ const value = moveO[edgePermutation[move[i]]];
413
+ idx *= 12 - i;
414
+ idx += value - Edge3.popcount[used & (1 << value) - 1];
415
+ used |= 1 << value;
416
+ }
417
+ return idx;
418
+ }
419
+ std() {
420
+ for (let i = 0; i < 12; i += 1) this.temp[this.edgeo[i]] = i;
421
+ for (let i = 0; i < 12; i += 1) {
422
+ this.edge[i] = this.temp[this.edge[i]];
423
+ this.edgeo[i] = i;
424
+ }
425
+ this.isStd = true;
426
+ }
427
+ get(end) {
428
+ Edge3.ensureCoordinateTables();
429
+ if (!this.isStd) this.std();
430
+ let idx = 0;
431
+ let used = 0;
432
+ for (let i = 0; i < end; i += 1) {
433
+ const value = this.edge[i];
434
+ idx *= 12 - i;
435
+ idx += value - Edge3.popcount[used & (1 << value) - 1];
436
+ used |= 1 << value;
437
+ }
438
+ return idx;
439
+ }
440
+ set(index) {
441
+ Edge3.ensureCoordinateTables();
442
+ let used = 0;
443
+ let edgeParity = 0;
444
+ for (let i = 0; i < 11; i += 1) {
445
+ const p = Edge3.factX[11 - i];
446
+ let v = Math.floor(index / p);
447
+ index %= p;
448
+ edgeParity ^= v;
449
+ const edge = Edge3.selectUnused[used][v];
450
+ this.edge[i] = edge;
451
+ used |= 1 << edge;
452
+ }
453
+ const last = Edge3.selectUnused[used][0];
454
+ if ((edgeParity & 1) === 0) this.edge[11] = last;
455
+ else {
456
+ this.edge[11] = this.edge[10];
457
+ this.edge[10] = last;
458
+ }
459
+ for (let i = 0; i < 12; i += 1) this.edgeo[i] = i;
460
+ this.isStd = true;
461
+ }
462
+ move(move) {
463
+ this.isStd = false;
464
+ switch (move) {
465
+ case 0:
466
+ this.circle(this.edge, 0, 4, 1, 5);
467
+ this.circle(this.edgeo, 0, 4, 1, 5);
468
+ break;
469
+ case 1:
470
+ this.swap2(this.edge, 0, 4, 1, 5);
471
+ this.swap2(this.edgeo, 0, 4, 1, 5);
472
+ break;
473
+ case 2:
474
+ this.circle(this.edge, 0, 5, 1, 4);
475
+ this.circle(this.edgeo, 0, 5, 1, 4);
476
+ break;
477
+ case 3:
478
+ this.swap2(this.edge, 5, 10, 6, 11);
479
+ this.swap2(this.edgeo, 5, 10, 6, 11);
480
+ break;
481
+ case 4:
482
+ this.circle(this.edge, 0, 11, 3, 8);
483
+ this.circle(this.edgeo, 0, 11, 3, 8);
484
+ break;
485
+ case 5:
486
+ this.swap2(this.edge, 0, 11, 3, 8);
487
+ this.swap2(this.edgeo, 0, 11, 3, 8);
488
+ break;
489
+ case 6:
490
+ this.circle(this.edge, 0, 8, 3, 11);
491
+ this.circle(this.edgeo, 0, 8, 3, 11);
492
+ break;
493
+ case 7:
494
+ this.circle(this.edge, 2, 7, 3, 6);
495
+ this.circle(this.edgeo, 2, 7, 3, 6);
496
+ break;
497
+ case 8:
498
+ this.swap2(this.edge, 2, 7, 3, 6);
499
+ this.swap2(this.edgeo, 2, 7, 3, 6);
500
+ break;
501
+ case 9:
502
+ this.circle(this.edge, 2, 6, 3, 7);
503
+ this.circle(this.edgeo, 2, 6, 3, 7);
504
+ break;
505
+ case 10:
506
+ this.swap2(this.edge, 4, 8, 7, 9);
507
+ this.swap2(this.edgeo, 4, 8, 7, 9);
508
+ break;
509
+ case 11:
510
+ this.circle(this.edge, 1, 9, 2, 10);
511
+ this.circle(this.edgeo, 1, 9, 2, 10);
512
+ break;
513
+ case 12:
514
+ this.swap2(this.edge, 1, 9, 2, 10);
515
+ this.swap2(this.edgeo, 1, 9, 2, 10);
516
+ break;
517
+ case 13:
518
+ this.circle(this.edge, 1, 10, 2, 9);
519
+ this.circle(this.edgeo, 1, 10, 2, 9);
520
+ break;
521
+ case 14:
522
+ this.swap2(this.edge, 0, 4, 1, 5);
523
+ this.swap2(this.edgeo, 0, 4, 1, 5);
524
+ this.swapPair(this.edge, 9, 11);
525
+ this.swapPair(this.edgeo, 8, 10);
526
+ break;
527
+ case 15:
528
+ this.swap2(this.edge, 5, 10, 6, 11);
529
+ this.swap2(this.edgeo, 5, 10, 6, 11);
530
+ this.swapPair(this.edge, 1, 3);
531
+ this.swapPair(this.edgeo, 0, 2);
532
+ break;
533
+ case 16:
534
+ this.swap2(this.edge, 0, 11, 3, 8);
535
+ this.swap2(this.edgeo, 0, 11, 3, 8);
536
+ this.swapPair(this.edge, 5, 7);
537
+ this.swapPair(this.edgeo, 4, 6);
538
+ break;
539
+ case 17:
540
+ this.swap2(this.edge, 2, 7, 3, 6);
541
+ this.swap2(this.edgeo, 2, 7, 3, 6);
542
+ this.swapPair(this.edge, 8, 10);
543
+ this.swapPair(this.edgeo, 9, 11);
544
+ break;
545
+ case 18:
546
+ this.swap2(this.edge, 4, 8, 7, 9);
547
+ this.swap2(this.edgeo, 4, 8, 7, 9);
548
+ this.swapPair(this.edge, 0, 2);
549
+ this.swapPair(this.edgeo, 1, 3);
550
+ break;
551
+ case 19:
552
+ this.swap2(this.edge, 1, 9, 2, 10);
553
+ this.swap2(this.edgeo, 1, 9, 2, 10);
554
+ this.swapPair(this.edge, 4, 6);
555
+ this.swapPair(this.edgeo, 5, 7);
556
+ break;
557
+ }
558
+ }
559
+ rot(rotation) {
560
+ this.isStd = false;
561
+ switch (rotation) {
562
+ case 0:
563
+ this.move(14);
564
+ this.move(17);
565
+ break;
566
+ case 1:
567
+ this.circlex(11, 5, 10, 6);
568
+ this.circlex(5, 10, 6, 11);
569
+ this.circlex(1, 2, 3, 0);
570
+ this.circlex(4, 9, 7, 8);
571
+ this.circlex(8, 4, 9, 7);
572
+ this.circlex(0, 1, 2, 3);
573
+ break;
574
+ case 2:
575
+ this.swapx(4, 5);
576
+ this.swapx(5, 4);
577
+ this.swapx(11, 8);
578
+ this.swapx(8, 11);
579
+ this.swapx(7, 6);
580
+ this.swapx(6, 7);
581
+ this.swapx(9, 10);
582
+ this.swapx(10, 9);
583
+ this.swapx(1, 1);
584
+ this.swapx(0, 0);
585
+ this.swapx(3, 3);
586
+ this.swapx(2, 2);
587
+ break;
588
+ }
589
+ }
590
+ rotate(rotation) {
591
+ while (rotation >= 2) {
592
+ rotation -= 2;
593
+ this.rot(1);
594
+ this.rot(2);
595
+ }
596
+ if (rotation !== 0) this.rot(0);
597
+ }
598
+ circle(arr, a, b, c, d) {
599
+ const temp = arr[d];
600
+ arr[d] = arr[c];
601
+ arr[c] = arr[b];
602
+ arr[b] = arr[a];
603
+ arr[a] = temp;
604
+ }
605
+ swap2(arr, a, b, c, d) {
606
+ let temp = arr[a];
607
+ arr[a] = arr[c];
608
+ arr[c] = temp;
609
+ temp = arr[b];
610
+ arr[b] = arr[d];
611
+ arr[d] = temp;
612
+ }
613
+ swapPair(arr, x, y) {
614
+ const temp = arr[x];
615
+ arr[x] = arr[y];
616
+ arr[y] = temp;
617
+ }
618
+ swapx(x, y) {
619
+ const temp = this.edge[x];
620
+ this.edge[x] = this.edgeo[y];
621
+ this.edgeo[y] = temp;
622
+ }
623
+ circlex(a, b, c, d) {
624
+ const temp = this.edgeo[d];
625
+ this.edgeo[d] = this.edge[c];
626
+ this.edge[c] = this.edgeo[b];
627
+ this.edgeo[b] = this.edge[a];
628
+ this.edge[a] = temp;
629
+ }
630
+ };
631
+ //#endregion
632
+ export { Edge3, EdgeCube };