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,262 @@
1
+ import { SearchWCA } from "../min2phase/search-wca.mjs";
2
+ import { ckmv2, ckmv3, move2std, move3std, skipAxis2, skipAxis3, toMove } from "./tables.mjs";
3
+ import { Center1, Center2, Center3 } from "./center.mjs";
4
+ import { Edge3 } from "./edge.mjs";
5
+ import { FullCube } from "./full-cube.mjs";
6
+ //#region .build/vendor/scramble-core/src/solvers/threephase/search.ts
7
+ const PHASE1_SOLUTIONS = 1e4;
8
+ const PHASE2_ATTEMPTS = 500;
9
+ const PHASE2_SOLUTIONS = 100;
10
+ const PHASE3_ATTEMPTS = 100;
11
+ let isInitialized = false;
12
+ const initThreephaseTables = () => {
13
+ if (isInitialized) return;
14
+ SearchWCA.init();
15
+ Center1.initSym();
16
+ Center1.raw2sym = Array.from({ length: 735471 }, () => 0);
17
+ Center1.initSym2Raw();
18
+ Center1.createMoveTable();
19
+ Center1.raw2sym = null;
20
+ Center1.createPrun();
21
+ Center2.init();
22
+ Center3.init();
23
+ Edge3.initMvrot();
24
+ Edge3.initRaw2Sym();
25
+ Edge3.createPrun();
26
+ isInitialized = true;
27
+ };
28
+ var Search = class {
29
+ inverseSolution = true;
30
+ withRotation = false;
31
+ solution = "";
32
+ p1sols = [];
33
+ move1 = Array.from({ length: 15 }, () => 0);
34
+ move2 = Array.from({ length: 20 }, () => 0);
35
+ move3 = Array.from({ length: 20 }, () => 0);
36
+ c1 = new FullCube();
37
+ c2 = new FullCube();
38
+ ct2 = new Center2();
39
+ ct3 = new Center3();
40
+ e12 = new Edge3();
41
+ tempe = Array.from({ length: 20 }, () => new Edge3());
42
+ search333 = new SearchWCA();
43
+ arr2 = Array.from({ length: PHASE2_SOLUTIONS }, () => null);
44
+ cube = new FullCube();
45
+ length1 = 0;
46
+ length2 = 0;
47
+ add1 = false;
48
+ p1SolsCnt = 0;
49
+ arr2idx = 0;
50
+ randomState(random) {
51
+ this.cube = FullCube.random(random);
52
+ this.doSearch();
53
+ return this.solution;
54
+ }
55
+ solve(scramble) {
56
+ this.cube = FullCube.fromMoves(scramble);
57
+ this.doSearch();
58
+ return this.solution;
59
+ }
60
+ doSearch() {
61
+ initThreephaseTables();
62
+ this.solution = "";
63
+ const ud = new Center1(this.cube.getCenter(), 0).getsym();
64
+ const fb = new Center1(this.cube.getCenter(), 1).getsym();
65
+ const rl = new Center1(this.cube.getCenter(), 2).getsym();
66
+ const udprun = Center1.csprun[ud >>> 6];
67
+ const fbprun = Center1.csprun[fb >>> 6];
68
+ const rlprun = Center1.csprun[rl >>> 6];
69
+ this.p1SolsCnt = 0;
70
+ this.arr2idx = 0;
71
+ this.p1sols.length = 0;
72
+ for (this.length1 = Math.min(udprun, fbprun, rlprun); this.length1 < 100; this.length1 += 1) if (rlprun <= this.length1 && this.search1(rl >>> 6, rl & 63, this.length1, -1, 0) || udprun <= this.length1 && this.search1(ud >>> 6, ud & 63, this.length1, -1, 0) || fbprun <= this.length1 && this.search1(fb >>> 6, fb & 63, this.length1, -1, 0)) break;
73
+ const p1SolsArr = [...this.p1sols].sort((first, second) => first.value - second.value);
74
+ if (p1SolsArr[0] === void 0) throw new Error("@cubegin/scramble-core: threephase phase 1 found no candidates");
75
+ let maxLength2 = 9;
76
+ let length12 = 100;
77
+ do {
78
+ outer: for (length12 = p1SolsArr[0].value; length12 < 100; length12 += 1) for (const p1Solution of p1SolsArr) {
79
+ if (p1Solution.value > length12) break;
80
+ if (length12 - p1Solution.length1 > maxLength2) continue;
81
+ this.c1.copy(p1Solution);
82
+ this.ct2.set(this.c1.getCenter(), this.c1.getEdge().getParity());
83
+ const s2ct = this.ct2.getct();
84
+ const s2rl = this.ct2.getrl();
85
+ this.length1 = p1Solution.length1;
86
+ this.length2 = length12 - p1Solution.length1;
87
+ if (this.search2(s2ct, s2rl, this.length2, 28, 0)) break outer;
88
+ }
89
+ maxLength2 += 1;
90
+ } while (length12 === 100);
91
+ const arr2 = this.arr2.slice(0, this.arr2idx).filter((cube) => cube !== null).sort((first, second) => first.value - second.value);
92
+ if (arr2.length === 0) throw new Error(`@cubegin/scramble-core: threephase phase 2 found no candidates (phase1=${this.p1sols.length}, firstValue=${String(p1SolsArr[0]?.value)}, arr2idx=${this.arr2idx}, arr2len=${this.arr2.length})`);
93
+ let length123 = 100;
94
+ let index = 0;
95
+ let maxLength3 = 13;
96
+ do {
97
+ outer2: for (length123 = arr2[0].value; length123 < 100; length123 += 1) for (let i = 0; i < Math.min(arr2.length, PHASE3_ATTEMPTS); i += 1) {
98
+ const candidate = arr2[i];
99
+ if (candidate.value > length123) break;
100
+ if (length123 - candidate.length1 - candidate.length2 > maxLength3) continue;
101
+ const edgeParity = this.e12.setFromEdgeCube(candidate.getEdge());
102
+ this.ct3.set(candidate.getCenter(), edgeParity ^ candidate.getCorner().getParity());
103
+ const ct = this.ct3.getct();
104
+ const edge = this.e12.get(10);
105
+ const prun = Edge3.getprun(this.e12.getsym());
106
+ const length3 = length123 - candidate.length1 - candidate.length2;
107
+ if (prun <= length3 && this.search3(edge, ct, prun, length3, 20, 0)) {
108
+ index = i;
109
+ break outer2;
110
+ }
111
+ }
112
+ maxLength3 += 1;
113
+ } while (length123 === 100);
114
+ const solcube = new FullCube(arr2[index]);
115
+ this.length1 = solcube.length1;
116
+ this.length2 = solcube.length2;
117
+ const length = length123 - this.length1 - this.length2;
118
+ for (let i = 0; i < length; i += 1) solcube.move(move3std[this.move3[i]]);
119
+ const facelet = solcube.to333Facelet();
120
+ const sol = this.search333.solution(facelet, 21, 1e6, 500, 0);
121
+ if (sol.startsWith("Error")) throw new Error(`@cubegin/scramble-core: min2phase returned ${sol} during 4x4 reduction`);
122
+ const sol333 = toMove(sol);
123
+ for (const move of sol333) solcube.move(move);
124
+ this.solution = solcube.getMoveString(this.inverseSolution, this.withRotation);
125
+ }
126
+ search1(ct, sym, maxLength, lastMove, depth) {
127
+ if (ct === 0 && maxLength < 5) return maxLength === 0 && this.init2(sym, lastMove);
128
+ for (let axis = 0; axis < 27; axis += 3) {
129
+ if (axis === lastMove || axis === lastMove - 9 || axis === lastMove - 18) continue;
130
+ for (let power = 0; power < 3; power += 1) {
131
+ const move = axis + power;
132
+ let ctx = Center1.ctsmv[ct][Center1.symmove[sym][move]];
133
+ const prun = Center1.csprun[ctx >>> 6];
134
+ if (prun >= maxLength) {
135
+ if (prun > maxLength) break;
136
+ continue;
137
+ }
138
+ const symx = Center1.symmult[sym][ctx & 63];
139
+ ctx >>>= 6;
140
+ this.move1[depth] = move;
141
+ if (this.search1(ctx, symx, maxLength - 1, axis, depth + 1)) return true;
142
+ }
143
+ }
144
+ return false;
145
+ }
146
+ init2(sym, _lastMove) {
147
+ this.c1.copy(this.cube);
148
+ for (let i = 0; i < this.length1; i += 1) this.c1.move(this.move1[i]);
149
+ switch (Center1.finish[sym]) {
150
+ case 0:
151
+ this.c1.move(24);
152
+ this.c1.move(35);
153
+ this.move1[this.length1] = 24;
154
+ this.move1[this.length1 + 1] = 35;
155
+ this.add1 = true;
156
+ sym = 19;
157
+ break;
158
+ case 12869:
159
+ this.c1.move(18);
160
+ this.c1.move(29);
161
+ this.move1[this.length1] = 18;
162
+ this.move1[this.length1 + 1] = 29;
163
+ this.add1 = true;
164
+ sym = 34;
165
+ break;
166
+ case 735470:
167
+ this.add1 = false;
168
+ sym = 0;
169
+ break;
170
+ default: return false;
171
+ }
172
+ this.ct2.set(this.c1.getCenter(), this.c1.getEdge().getParity());
173
+ const s2ct = this.ct2.getct();
174
+ const s2rl = this.ct2.getrl();
175
+ if (!Number.isSafeInteger(s2ct) || !Number.isSafeInteger(s2rl) || s2ct < 0 || s2ct >= 6435 || s2rl < 0 || s2rl >= 70) throw new Error(`@cubegin/scramble-core: invalid phase 2 coordinate ct=${s2ct} rl=${s2rl}`);
176
+ const ctp = Center2.ctprun[s2ct * 70 + s2rl];
177
+ this.c1.value = ctp + this.length1;
178
+ this.c1.length1 = this.length1;
179
+ this.c1.add1 = this.add1;
180
+ this.c1.sym = sym;
181
+ this.p1SolsCnt += 1;
182
+ this.pushP1Solution(this.c1);
183
+ return this.p1SolsCnt === PHASE1_SOLUTIONS;
184
+ }
185
+ pushP1Solution(cube) {
186
+ if (this.p1sols.length < PHASE2_ATTEMPTS) {
187
+ this.p1sols.push(new FullCube(cube));
188
+ return;
189
+ }
190
+ let maxIndex = 0;
191
+ for (let i = 1; i < this.p1sols.length; i += 1) if (this.p1sols[i].value > this.p1sols[maxIndex].value) maxIndex = i;
192
+ if (this.p1sols[maxIndex].value > cube.value) this.p1sols[maxIndex].copy(cube);
193
+ }
194
+ search2(ct, rl, maxLength, lastMove, depth) {
195
+ if (ct === 0 && Center2.ctprun[rl] === 0 && maxLength === 0) return this.init3();
196
+ for (let move = 0; move < 23; move += 1) {
197
+ if (ckmv2[lastMove][move]) {
198
+ move = skipAxis2[move];
199
+ continue;
200
+ }
201
+ const ctx = Center2.ctmv[ct][move];
202
+ const rlx = Center2.rlmv[rl][move];
203
+ const prun = Center2.ctprun[ctx * 70 + rlx];
204
+ if (prun >= maxLength) {
205
+ if (prun > maxLength) move = skipAxis2[move];
206
+ continue;
207
+ }
208
+ this.move2[depth] = move2std[move];
209
+ if (this.search2(ctx, rlx, maxLength - 1, move, depth + 1)) return true;
210
+ }
211
+ return false;
212
+ }
213
+ init3() {
214
+ this.c2.copy(this.c1);
215
+ for (let i = 0; i < this.length2; i += 1) this.c2.move(this.move2[i]);
216
+ if (!this.c2.checkEdge()) return false;
217
+ const edgeParity = this.e12.setFromEdgeCube(this.c2.getEdge());
218
+ this.ct3.set(this.c2.getCenter(), edgeParity ^ this.c2.getCorner().getParity());
219
+ const ct = this.ct3.getct();
220
+ const prun = Edge3.getprun(this.e12.getsym());
221
+ const candidate = this.arr2[this.arr2idx] ?? new FullCube(this.c2);
222
+ this.arr2[this.arr2idx] = candidate;
223
+ candidate.copy(this.c2);
224
+ candidate.value = this.length1 + this.length2 + Math.max(prun, Center3.prun[ct]);
225
+ candidate.length2 = this.length2;
226
+ this.arr2idx += 1;
227
+ return this.arr2idx === this.arr2.length;
228
+ }
229
+ search3(edge, ct, prun, maxLength, lastMove, depth) {
230
+ if (maxLength === 0) return edge === 0 && ct === 0;
231
+ this.tempe[depth].set(edge);
232
+ for (let move = 0; move < 17; move += 1) {
233
+ if (ckmv3[lastMove][move]) {
234
+ move = skipAxis3[move];
235
+ continue;
236
+ }
237
+ const ctx = Center3.ctmove[ct][move];
238
+ const prun1 = Center3.prun[ctx];
239
+ if (prun1 >= maxLength) {
240
+ if (prun1 > maxLength && move < 14) move = skipAxis3[move];
241
+ continue;
242
+ }
243
+ const edgex = Edge3.getmvrot(this.tempe[depth].edge, move << 3, 10);
244
+ let symcord1x = Edge3.raw2sym[Math.floor(edgex / Edge3.N_RAW)];
245
+ const symx = symcord1x & 7;
246
+ symcord1x >>>= 3;
247
+ const cord2x = Edge3.getmvrot(this.tempe[depth].edge, move << 3 | symx, 10) % Edge3.N_RAW;
248
+ const prunx = Edge3.getprun(symcord1x * Edge3.N_RAW + cord2x, prun);
249
+ if (prunx >= maxLength) {
250
+ if (prunx > maxLength && move < 14) move = skipAxis3[move];
251
+ continue;
252
+ }
253
+ if (this.search3(edgex, ctx, prunx, maxLength - 1, move, depth + 1)) {
254
+ this.move3[depth] = move;
255
+ return true;
256
+ }
257
+ }
258
+ return false;
259
+ }
260
+ };
261
+ //#endregion
262
+ export { Search };
@@ -0,0 +1,201 @@
1
+ const move2str = [
2
+ "U",
3
+ "U2",
4
+ "U'",
5
+ "R",
6
+ "R2",
7
+ "R'",
8
+ "F",
9
+ "F2",
10
+ "F'",
11
+ "D",
12
+ "D2",
13
+ "D'",
14
+ "L",
15
+ "L2",
16
+ "L'",
17
+ "B",
18
+ "B2",
19
+ "B'",
20
+ "Uw",
21
+ "Uw2",
22
+ "Uw'",
23
+ "Rw",
24
+ "Rw2",
25
+ "Rw'",
26
+ "Fw",
27
+ "Fw2",
28
+ "Fw'",
29
+ "Dw",
30
+ "Dw2",
31
+ "Dw'",
32
+ "Lw",
33
+ "Lw2",
34
+ "Lw'",
35
+ "Bw",
36
+ "Bw2",
37
+ "Bw'"
38
+ ];
39
+ const move2std = [
40
+ 0,
41
+ 1,
42
+ 2,
43
+ 3,
44
+ 4,
45
+ 5,
46
+ 6,
47
+ 7,
48
+ 8,
49
+ 9,
50
+ 10,
51
+ 11,
52
+ 12,
53
+ 13,
54
+ 14,
55
+ 15,
56
+ 16,
57
+ 17,
58
+ 19,
59
+ 21,
60
+ 22,
61
+ 23,
62
+ 25,
63
+ 28,
64
+ 30,
65
+ 31,
66
+ 32,
67
+ 34,
68
+ 36
69
+ ];
70
+ const move3std = [
71
+ 0,
72
+ 1,
73
+ 2,
74
+ 4,
75
+ 6,
76
+ 7,
77
+ 8,
78
+ 9,
79
+ 10,
80
+ 11,
81
+ 13,
82
+ 15,
83
+ 16,
84
+ 17,
85
+ 19,
86
+ 22,
87
+ 25,
88
+ 28,
89
+ 31,
90
+ 34,
91
+ 36
92
+ ];
93
+ const Cnk = Array.from({ length: 25 }, () => Array.from({ length: 25 }, () => 0));
94
+ const fact = Array.from({ length: 13 }, () => 0);
95
+ for (let i = 0; i < 25; i += 1) {
96
+ Cnk[i][i] = 1;
97
+ Cnk[i][0] = 1;
98
+ }
99
+ for (let i = 1; i < 25; i += 1) for (let j = 1; j <= i; j += 1) Cnk[i][j] = Cnk[i - 1][j] + Cnk[i - 1][j - 1];
100
+ fact[0] = 1;
101
+ for (let i = 0; i < 12; i += 1) fact[i + 1] = fact[i] * (i + 1);
102
+ const std2move = Array.from({ length: 37 }, () => 0);
103
+ const std3move = Array.from({ length: 37 }, () => 0);
104
+ const ckmv = Array.from({ length: 37 }, () => Array.from({ length: 36 }, () => false));
105
+ const ckmv2 = Array.from({ length: 29 }, () => Array.from({ length: 28 }, () => false));
106
+ const ckmv3 = Array.from({ length: 21 }, () => Array.from({ length: 20 }, () => false));
107
+ const skipAxis = Array.from({ length: 36 }, () => 0);
108
+ const skipAxis2 = Array.from({ length: 28 }, () => 0);
109
+ const skipAxis3 = Array.from({ length: 20 }, () => 0);
110
+ for (let i = 0; i < 29; i += 1) std2move[move2std[i]] = i;
111
+ for (let i = 0; i < 21; i += 1) std3move[move3std[i]] = i;
112
+ for (let i = 0; i < 36; i += 1) {
113
+ for (let j = 0; j < 36; j += 1) ckmv[i][j] = Math.floor(i / 3) === Math.floor(j / 3) || Math.floor(i / 3) % 3 === Math.floor(j / 3) % 3 && i > j;
114
+ ckmv[36][i] = false;
115
+ }
116
+ for (let i = 0; i < 29; i += 1) for (let j = 0; j < 28; j += 1) ckmv2[i][j] = ckmv[move2std[i]][move2std[j]];
117
+ for (let i = 0; i < 21; i += 1) for (let j = 0; j < 20; j += 1) ckmv3[i][j] = ckmv[move3std[i]][move3std[j]];
118
+ for (let i = 0; i < 36; i += 1) {
119
+ skipAxis[i] = 36;
120
+ for (let j = i; j < 36; j += 1) if (!ckmv[i][j]) {
121
+ skipAxis[i] = j - 1;
122
+ break;
123
+ }
124
+ }
125
+ for (let i = 0; i < 28; i += 1) {
126
+ skipAxis2[i] = 28;
127
+ for (let j = i; j < 28; j += 1) if (!ckmv2[i][j]) {
128
+ skipAxis2[i] = j - 1;
129
+ break;
130
+ }
131
+ }
132
+ for (let i = 0; i < 20; i += 1) {
133
+ skipAxis3[i] = 20;
134
+ for (let j = i; j < 20; j += 1) if (!ckmv3[i][j]) {
135
+ skipAxis3[i] = j - 1;
136
+ break;
137
+ }
138
+ }
139
+ const swap = (arr, a, b, c, d, key) => {
140
+ let temp;
141
+ switch (key) {
142
+ case 0:
143
+ temp = arr[d];
144
+ arr[d] = arr[c];
145
+ arr[c] = arr[b];
146
+ arr[b] = arr[a];
147
+ arr[a] = temp;
148
+ return;
149
+ case 1:
150
+ temp = arr[a];
151
+ arr[a] = arr[c];
152
+ arr[c] = temp;
153
+ temp = arr[b];
154
+ arr[b] = arr[d];
155
+ arr[d] = temp;
156
+ return;
157
+ case 2:
158
+ temp = arr[a];
159
+ arr[a] = arr[b];
160
+ arr[b] = arr[c];
161
+ arr[c] = arr[d];
162
+ arr[d] = temp;
163
+ return;
164
+ default: return;
165
+ }
166
+ };
167
+ const set8Perm = (arr, idx) => {
168
+ let val = 1985229328;
169
+ for (let i = 0; i < 7; i += 1) {
170
+ const p = fact[7 - i];
171
+ let v = Math.floor(idx / p);
172
+ idx -= v * p;
173
+ v <<= 2;
174
+ arr[i] = val >>> v & 15;
175
+ const m = (1 << v) - 1;
176
+ val = (val & m) + (val >>> 4 & ~m);
177
+ }
178
+ arr[7] = val;
179
+ };
180
+ const parity = (arr) => {
181
+ let value = 0;
182
+ for (let i = 0; i < arr.length; i += 1) for (let j = i; j < arr.length; j += 1) if (arr[i] > arr[j]) value ^= 1;
183
+ return value;
184
+ };
185
+ const toMove = (algorithm) => {
186
+ const moves = [];
187
+ const tokens = algorithm.trim().length === 0 ? [] : algorithm.trim().split(/\s+/);
188
+ for (const token of tokens) {
189
+ const match = token.match(/^([URFDLB])w?(2|')?$/);
190
+ if (match === null) continue;
191
+ const faceIndex = "URFDLB".indexOf(match[1]);
192
+ const isWide = token.includes("w");
193
+ let move = faceIndex * 3 + (isWide ? 18 : 0);
194
+ if (match[2] === "2") move += 1;
195
+ if (match[2] === "'") move += 2;
196
+ moves.push(move);
197
+ }
198
+ return moves;
199
+ };
200
+ //#endregion
201
+ export { Cnk, ckmv2, ckmv3, move2std, move2str, move3std, parity, set8Perm, skipAxis2, skipAxis3, swap, toMove };
@@ -0,0 +1,15 @@
1
+ import { RandomSource } from "../random-source.mjs";
2
+
3
+ //#region .build/vendor/scramble-core/src/solvers/two-by-two-solver.d.ts
4
+ interface TwoByTwoState {
5
+ permutation: number;
6
+ orientation: number;
7
+ }
8
+ declare class TwoByTwoSolver {
9
+ randomState(random: RandomSource): TwoByTwoState;
10
+ solveIn(state: TwoByTwoState, maxLength: number): string | null;
11
+ generateExactly(state: TwoByTwoState, length: number): string;
12
+ private solve;
13
+ }
14
+ //#endregion
15
+ export { TwoByTwoSolver, TwoByTwoState };