@cubingcenter/scrambler 0.5.3 → 0.6.0

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 (244) hide show
  1. package/README.md +24 -9
  2. package/dist/cli/index.js +0 -0
  3. package/dist/core/api.d.ts.map +1 -1
  4. package/dist/core/api.js +11 -1
  5. package/dist/core/types.d.ts +1 -1
  6. package/dist/core/types.d.ts.map +1 -1
  7. package/dist/puzzles/cube4/index.d.ts +4 -2
  8. package/dist/puzzles/cube4/index.d.ts.map +1 -1
  9. package/dist/puzzles/cube4/index.js +3 -1
  10. package/dist/puzzles/cube4/random-state.d.ts +16 -0
  11. package/dist/puzzles/cube4/random-state.d.ts.map +1 -0
  12. package/dist/puzzles/cube4/random-state.js +76 -0
  13. package/dist/puzzles/cube4/reduction/browser-loader.d.ts +18 -0
  14. package/dist/puzzles/cube4/reduction/browser-loader.d.ts.map +1 -0
  15. package/dist/puzzles/cube4/reduction/browser-loader.js +95 -0
  16. package/dist/puzzles/cube4/reduction/center1.d.ts +65 -0
  17. package/dist/puzzles/cube4/reduction/center1.d.ts.map +1 -0
  18. package/dist/puzzles/cube4/reduction/center1.js +245 -0
  19. package/dist/puzzles/cube4/reduction/center2.d.ts +91 -0
  20. package/dist/puzzles/cube4/reduction/center2.d.ts.map +1 -0
  21. package/dist/puzzles/cube4/reduction/center2.js +449 -0
  22. package/dist/puzzles/cube4/reduction/center3.d.ts +47 -0
  23. package/dist/puzzles/cube4/reduction/center3.d.ts.map +1 -0
  24. package/dist/puzzles/cube4/reduction/center3.js +278 -0
  25. package/dist/puzzles/cube4/reduction/edge3.d.ts +100 -0
  26. package/dist/puzzles/cube4/reduction/edge3.d.ts.map +1 -0
  27. package/dist/puzzles/cube4/reduction/edge3.js +511 -0
  28. package/dist/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
  29. package/dist/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
  30. package/dist/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
  31. package/dist/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
  32. package/dist/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
  33. package/dist/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
  34. package/dist/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
  35. package/dist/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
  36. package/dist/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
  37. package/dist/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
  38. package/dist/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
  39. package/dist/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
  40. package/dist/puzzles/cube4/reduction/geometry.d.ts +33 -0
  41. package/dist/puzzles/cube4/reduction/geometry.d.ts.map +1 -0
  42. package/dist/puzzles/cube4/reduction/geometry.js +302 -0
  43. package/dist/puzzles/cube4/reduction/node-loader.d.ts +17 -0
  44. package/dist/puzzles/cube4/reduction/node-loader.d.ts.map +1 -0
  45. package/dist/puzzles/cube4/reduction/node-loader.js +98 -0
  46. package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts +130 -0
  47. package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts.map +1 -0
  48. package/dist/puzzles/cube4/reduction/pairing-coordinate.js +281 -0
  49. package/dist/puzzles/cube4/reduction/phase3-search.d.ts +42 -0
  50. package/dist/puzzles/cube4/reduction/phase3-search.d.ts.map +1 -0
  51. package/dist/puzzles/cube4/reduction/phase3-search.js +133 -0
  52. package/dist/puzzles/cube4/reduction/phase3.d.ts +34 -0
  53. package/dist/puzzles/cube4/reduction/phase3.d.ts.map +1 -0
  54. package/dist/puzzles/cube4/reduction/phase3.js +83 -0
  55. package/dist/puzzles/cube4/reduction/phase4.d.ts +35 -0
  56. package/dist/puzzles/cube4/reduction/phase4.d.ts.map +1 -0
  57. package/dist/puzzles/cube4/reduction/phase4.js +82 -0
  58. package/dist/puzzles/cube4/reduction/solve.d.ts +31 -0
  59. package/dist/puzzles/cube4/reduction/solve.d.ts.map +1 -0
  60. package/dist/puzzles/cube4/reduction/solve.js +311 -0
  61. package/dist/puzzles/cube4/scrambler.d.ts +9 -1
  62. package/dist/puzzles/cube4/scrambler.d.ts.map +1 -1
  63. package/dist/puzzles/cube4/scrambler.js +123 -81
  64. package/dist/puzzles/cube4/types.d.ts +6 -0
  65. package/dist/puzzles/cube4/types.d.ts.map +1 -1
  66. package/dist/puzzles/cube4/validation.d.ts +6 -0
  67. package/dist/puzzles/cube4/validation.d.ts.map +1 -0
  68. package/dist/puzzles/cube4/validation.js +91 -0
  69. package/dist/puzzles/fto/coordinates.d.ts +53 -0
  70. package/dist/puzzles/fto/coordinates.d.ts.map +1 -0
  71. package/dist/puzzles/fto/coordinates.js +228 -0
  72. package/dist/puzzles/fto/facelets.d.ts +6 -0
  73. package/dist/puzzles/fto/facelets.d.ts.map +1 -0
  74. package/dist/puzzles/fto/facelets.js +99 -0
  75. package/dist/puzzles/fto/index.d.ts +12 -0
  76. package/dist/puzzles/fto/index.d.ts.map +1 -0
  77. package/dist/puzzles/fto/index.js +13 -0
  78. package/dist/puzzles/fto/moves.d.ts +12 -0
  79. package/dist/puzzles/fto/moves.d.ts.map +1 -0
  80. package/dist/puzzles/fto/moves.js +115 -0
  81. package/dist/puzzles/fto/random-state.d.ts +17 -0
  82. package/dist/puzzles/fto/random-state.d.ts.map +1 -0
  83. package/dist/puzzles/fto/random-state.js +40 -0
  84. package/dist/puzzles/fto/scrambler.d.ts +6 -0
  85. package/dist/puzzles/fto/scrambler.d.ts.map +1 -0
  86. package/dist/puzzles/fto/scrambler.js +49 -0
  87. package/dist/puzzles/fto/solver/engine.d.ts +18 -0
  88. package/dist/puzzles/fto/solver/engine.d.ts.map +1 -0
  89. package/dist/puzzles/fto/solver/engine.js +1168 -0
  90. package/dist/puzzles/fto/solver/index.d.ts +2 -0
  91. package/dist/puzzles/fto/solver/index.d.ts.map +1 -0
  92. package/dist/puzzles/fto/solver/index.js +1 -0
  93. package/dist/puzzles/fto/state.d.ts +16 -0
  94. package/dist/puzzles/fto/state.d.ts.map +1 -0
  95. package/dist/puzzles/fto/state.js +61 -0
  96. package/dist/puzzles/fto/types.d.ts +32 -0
  97. package/dist/puzzles/fto/types.d.ts.map +1 -0
  98. package/dist/puzzles/fto/types.js +46 -0
  99. package/dist/puzzles/fto/validation.d.ts +19 -0
  100. package/dist/puzzles/fto/validation.d.ts.map +1 -0
  101. package/dist/puzzles/fto/validation.js +143 -0
  102. package/dist/puzzles/index.d.ts +2 -0
  103. package/dist/puzzles/index.d.ts.map +1 -1
  104. package/dist/puzzles/index.js +6 -0
  105. package/dist/puzzles/skewb/index.d.ts +1 -1
  106. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  107. package/dist/puzzles/skewb/index.js +1 -1
  108. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  109. package/dist/puzzles/skewb/random-state.js +4 -1
  110. package/dist/puzzles/sq1/facelets.d.ts +12 -0
  111. package/dist/puzzles/sq1/facelets.d.ts.map +1 -0
  112. package/dist/puzzles/sq1/facelets.js +26 -0
  113. package/dist/puzzles/sq1/index.d.ts +10 -0
  114. package/dist/puzzles/sq1/index.d.ts.map +1 -0
  115. package/dist/puzzles/sq1/index.js +11 -0
  116. package/dist/puzzles/sq1/moves.d.ts +55 -0
  117. package/dist/puzzles/sq1/moves.d.ts.map +1 -0
  118. package/dist/puzzles/sq1/moves.js +220 -0
  119. package/dist/puzzles/sq1/random-state.d.ts +6 -0
  120. package/dist/puzzles/sq1/random-state.d.ts.map +1 -0
  121. package/dist/puzzles/sq1/random-state.js +49 -0
  122. package/dist/puzzles/sq1/scrambler.d.ts +10 -0
  123. package/dist/puzzles/sq1/scrambler.d.ts.map +1 -0
  124. package/dist/puzzles/sq1/scrambler.js +90 -0
  125. package/dist/puzzles/sq1/solver/browser-loader.d.ts +5 -0
  126. package/dist/puzzles/sq1/solver/browser-loader.d.ts.map +1 -0
  127. package/dist/puzzles/sq1/solver/browser-loader.js +92 -0
  128. package/dist/puzzles/sq1/solver/full-cube.d.ts +53 -0
  129. package/dist/puzzles/sq1/solver/full-cube.d.ts.map +1 -0
  130. package/dist/puzzles/sq1/solver/full-cube.js +281 -0
  131. package/dist/puzzles/sq1/solver/generated/manifest.json +50 -0
  132. package/dist/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
  133. package/dist/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
  134. package/dist/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
  135. package/dist/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
  136. package/dist/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
  137. package/dist/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
  138. package/dist/puzzles/sq1/solver/generated/square-prun.bin +0 -0
  139. package/dist/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
  140. package/dist/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
  141. package/dist/puzzles/sq1/solver/index.d.ts +5 -0
  142. package/dist/puzzles/sq1/solver/index.d.ts.map +1 -0
  143. package/dist/puzzles/sq1/solver/index.js +4 -0
  144. package/dist/puzzles/sq1/solver/node-loader.d.ts +4 -0
  145. package/dist/puzzles/sq1/solver/node-loader.d.ts.map +1 -0
  146. package/dist/puzzles/sq1/solver/node-loader.js +113 -0
  147. package/dist/puzzles/sq1/solver/search.d.ts +27 -0
  148. package/dist/puzzles/sq1/solver/search.d.ts.map +1 -0
  149. package/dist/puzzles/sq1/solver/search.js +225 -0
  150. package/dist/puzzles/sq1/solver/shape.d.ts +22 -0
  151. package/dist/puzzles/sq1/solver/shape.d.ts.map +1 -0
  152. package/dist/puzzles/sq1/solver/shape.js +185 -0
  153. package/dist/puzzles/sq1/solver/square.d.ts +10 -0
  154. package/dist/puzzles/sq1/solver/square.d.ts.map +1 -0
  155. package/dist/puzzles/sq1/solver/square.js +90 -0
  156. package/dist/puzzles/sq1/solver/table-metadata.d.ts +48 -0
  157. package/dist/puzzles/sq1/solver/table-metadata.d.ts.map +1 -0
  158. package/dist/puzzles/sq1/solver/table-metadata.js +47 -0
  159. package/dist/puzzles/sq1/solver/tables.d.ts +17 -0
  160. package/dist/puzzles/sq1/solver/tables.d.ts.map +1 -0
  161. package/dist/puzzles/sq1/solver/tables.js +66 -0
  162. package/dist/puzzles/sq1/state.d.ts +10 -0
  163. package/dist/puzzles/sq1/state.d.ts.map +1 -0
  164. package/dist/puzzles/sq1/state.js +74 -0
  165. package/dist/puzzles/sq1/types.d.ts +32 -0
  166. package/dist/puzzles/sq1/types.d.ts.map +1 -0
  167. package/dist/puzzles/sq1/types.js +1 -0
  168. package/dist/puzzles/sq1/validation.d.ts +7 -0
  169. package/dist/puzzles/sq1/validation.d.ts.map +1 -0
  170. package/dist/puzzles/sq1/validation.js +64 -0
  171. package/dist/random/prng.d.ts.map +1 -1
  172. package/dist/random/prng.js +9 -4
  173. package/dist-cjs/core/api.js +11 -1
  174. package/dist-cjs/puzzles/cube4/index.js +11 -4
  175. package/dist-cjs/puzzles/cube4/random-state.js +79 -0
  176. package/dist-cjs/puzzles/cube4/reduction/browser-loader.js +100 -0
  177. package/dist-cjs/puzzles/cube4/reduction/center1.js +258 -0
  178. package/dist-cjs/puzzles/cube4/reduction/center2.js +462 -0
  179. package/dist-cjs/puzzles/cube4/reduction/center3.js +284 -0
  180. package/dist-cjs/puzzles/cube4/reduction/edge3.js +522 -0
  181. package/dist-cjs/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
  182. package/dist-cjs/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
  183. package/dist-cjs/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
  184. package/dist-cjs/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
  185. package/dist-cjs/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
  186. package/dist-cjs/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
  187. package/dist-cjs/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
  188. package/dist-cjs/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
  189. package/dist-cjs/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
  190. package/dist-cjs/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
  191. package/dist-cjs/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
  192. package/dist-cjs/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
  193. package/dist-cjs/puzzles/cube4/reduction/geometry.js +308 -0
  194. package/dist-cjs/puzzles/cube4/reduction/node-loader.js +104 -0
  195. package/dist-cjs/puzzles/cube4/reduction/pairing-coordinate.js +294 -0
  196. package/dist-cjs/puzzles/cube4/reduction/phase3-search.js +138 -0
  197. package/dist-cjs/puzzles/cube4/reduction/phase3.js +86 -0
  198. package/dist-cjs/puzzles/cube4/reduction/phase4.js +87 -0
  199. package/dist-cjs/puzzles/cube4/reduction/solve.js +314 -0
  200. package/dist-cjs/puzzles/cube4/scrambler.js +122 -79
  201. package/dist-cjs/puzzles/cube4/validation.js +97 -0
  202. package/dist-cjs/puzzles/fto/coordinates.js +240 -0
  203. package/dist-cjs/puzzles/fto/facelets.js +104 -0
  204. package/dist-cjs/puzzles/fto/index.js +68 -0
  205. package/dist-cjs/puzzles/fto/moves.js +126 -0
  206. package/dist-cjs/puzzles/fto/random-state.js +43 -0
  207. package/dist-cjs/puzzles/fto/scrambler.js +53 -0
  208. package/dist-cjs/puzzles/fto/solver/engine.js +1175 -0
  209. package/dist-cjs/puzzles/fto/solver/index.js +9 -0
  210. package/dist-cjs/puzzles/fto/state.js +69 -0
  211. package/dist-cjs/puzzles/fto/types.js +49 -0
  212. package/dist-cjs/puzzles/fto/validation.js +147 -0
  213. package/dist-cjs/puzzles/index.js +7 -1
  214. package/dist-cjs/puzzles/skewb/index.js +2 -1
  215. package/dist-cjs/puzzles/skewb/random-state.js +4 -1
  216. package/dist-cjs/puzzles/sq1/facelets.js +30 -0
  217. package/dist-cjs/puzzles/sq1/index.js +52 -0
  218. package/dist-cjs/puzzles/sq1/moves.js +234 -0
  219. package/dist-cjs/puzzles/sq1/random-state.js +52 -0
  220. package/dist-cjs/puzzles/sq1/scrambler.js +95 -0
  221. package/dist-cjs/puzzles/sq1/solver/browser-loader.js +97 -0
  222. package/dist-cjs/puzzles/sq1/solver/full-cube.js +289 -0
  223. package/dist-cjs/puzzles/sq1/solver/generated/manifest.json +50 -0
  224. package/dist-cjs/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
  225. package/dist-cjs/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
  226. package/dist-cjs/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
  227. package/dist-cjs/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
  228. package/dist-cjs/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
  229. package/dist-cjs/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
  230. package/dist-cjs/puzzles/sq1/solver/generated/square-prun.bin +0 -0
  231. package/dist-cjs/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
  232. package/dist-cjs/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
  233. package/dist-cjs/puzzles/sq1/solver/index.js +18 -0
  234. package/dist-cjs/puzzles/sq1/solver/node-loader.js +120 -0
  235. package/dist-cjs/puzzles/sq1/solver/search.js +229 -0
  236. package/dist-cjs/puzzles/sq1/solver/shape.js +191 -0
  237. package/dist-cjs/puzzles/sq1/solver/square.js +93 -0
  238. package/dist-cjs/puzzles/sq1/solver/table-metadata.js +50 -0
  239. package/dist-cjs/puzzles/sq1/solver/tables.js +106 -0
  240. package/dist-cjs/puzzles/sq1/state.js +81 -0
  241. package/dist-cjs/puzzles/sq1/types.js +2 -0
  242. package/dist-cjs/puzzles/sq1/validation.js +68 -0
  243. package/dist-cjs/random/prng.js +9 -4
  244. package/package.json +43 -14
@@ -0,0 +1,2 @@
1
+ export { solveFto, initFtoSolver, isFtoSolverInitialized, solveFtoFacelet, generateFtoRandomState } from "./engine.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/fto/solver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { solveFto, initFtoSolver, isFtoSolverInitialized, solveFtoFacelet, generateFtoRandomState } from "./engine.js";
@@ -0,0 +1,16 @@
1
+ export declare class FtoCubie {
2
+ cp: number[];
3
+ co: number[];
4
+ ep: number[];
5
+ uf: number[];
6
+ rl: number[];
7
+ constructor(cp?: readonly number[], co?: readonly number[], ep?: readonly number[], uf?: readonly number[], rl?: readonly number[]);
8
+ clone(): FtoCubie;
9
+ isEqual(other: FtoCubie): boolean;
10
+ static multiply(...args: FtoCubie[]): FtoCubie;
11
+ }
12
+ export declare function createSolvedFtoState(): FtoCubie;
13
+ export declare function cloneFtoState(state: FtoCubie): FtoCubie;
14
+ export declare function statesEqual(a: FtoCubie, b: FtoCubie): boolean;
15
+ export declare function isSolvedFtoState(state: FtoCubie): boolean;
16
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/fto/state.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACZ,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;gBAGlB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,EACtB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,EACtB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,EACtB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,EACtB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE;IASjB,KAAK,IAAI,QAAQ;IAIjB,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;WAkB1B,QAAQ,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ;CAgBtD;AAED,wBAAgB,oBAAoB,IAAI,QAAQ,CAE/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAEvD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAGzD"}
@@ -0,0 +1,61 @@
1
+ export class FtoCubie {
2
+ cp;
3
+ co;
4
+ ep;
5
+ uf;
6
+ rl;
7
+ constructor(cp, co, ep, uf, rl) {
8
+ this.cp = cp ? Array.from(cp) : [0, 1, 2, 3, 4, 5];
9
+ this.co = co ? Array.from(co) : [0, 0, 0, 0, 0, 0];
10
+ this.ep = ep ? Array.from(ep) : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
11
+ this.uf = uf ? Array.from(uf) : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
12
+ this.rl = rl ? Array.from(rl) : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
13
+ }
14
+ clone() {
15
+ return new FtoCubie(this.cp, this.co, this.ep, this.uf, this.rl);
16
+ }
17
+ isEqual(other) {
18
+ for (let i = 0; i < 6; i++) {
19
+ if (this.cp[i] !== other.cp[i] || this.co[i] !== other.co[i]) {
20
+ return false;
21
+ }
22
+ }
23
+ for (let i = 0; i < 12; i++) {
24
+ if (this.ep[i] !== other.ep[i] ||
25
+ this.uf[i] !== other.uf[i] ||
26
+ this.rl[i] !== other.rl[i]) {
27
+ return false;
28
+ }
29
+ }
30
+ return true;
31
+ }
32
+ static multiply(...args) {
33
+ const prod = new FtoCubie();
34
+ for (let k = args.length - 1; k >= 0; k--) {
35
+ const a = args[k];
36
+ for (let i = 0; i < 6; i++) {
37
+ prod.co[i] = a.co[prod.cp[i]] ^ prod.co[i];
38
+ prod.cp[i] = a.cp[prod.cp[i]];
39
+ }
40
+ for (let i = 0; i < 12; i++) {
41
+ prod.ep[i] = a.ep[prod.ep[i]];
42
+ prod.uf[i] = a.uf[prod.uf[i]];
43
+ prod.rl[i] = a.rl[prod.rl[i]];
44
+ }
45
+ }
46
+ return prod;
47
+ }
48
+ }
49
+ export function createSolvedFtoState() {
50
+ return new FtoCubie();
51
+ }
52
+ export function cloneFtoState(state) {
53
+ return state.clone();
54
+ }
55
+ export function statesEqual(a, b) {
56
+ return a.isEqual(b);
57
+ }
58
+ export function isSolvedFtoState(state) {
59
+ const solved = new FtoCubie();
60
+ return state.isEqual(solved);
61
+ }
@@ -0,0 +1,32 @@
1
+ export type FtoFace = "U" | "D" | "F" | "B" | "L" | "BR" | "R" | "BL";
2
+ export type FtoMove = "U" | "U'" | "D" | "D'" | "F" | "F'" | "B" | "B'" | "L" | "L'" | "R" | "R'" | "BL" | "BL'" | "BR" | "BR'";
3
+ export interface FtoFacelets {
4
+ U: string[];
5
+ D: string[];
6
+ F: string[];
7
+ B: string[];
8
+ L: string[];
9
+ BR: string[];
10
+ R: string[];
11
+ BL: string[];
12
+ }
13
+ export declare const FTO_FACES: readonly FtoFace[];
14
+ export declare const FTO_ALL_MOVES: readonly FtoMove[];
15
+ export declare const FTO_AXIS_MAP: Record<FtoFace, number>;
16
+ export declare const SCRAMBLE_LENGTH = 30;
17
+ export declare const FTO_CORNER_COUNT = 6;
18
+ export declare const FTO_EDGE_COUNT = 12;
19
+ export declare const FTO_CENTER_ORBIT_COUNT = 12;
20
+ export declare const FTO_CORNER_PERM_STATES = 360;
21
+ export declare const FTO_CORNER_ORI_STATES = 32;
22
+ export declare const FTO_EDGE_PERM_STATES = 239500800;
23
+ export declare const FTO_CENTER_ORBIT_STATES = 369600;
24
+ export interface FtoRandomStateOptions {
25
+ seed?: string | number;
26
+ rejectTrivial?: boolean;
27
+ }
28
+ export interface FtoValidationResult {
29
+ valid: boolean;
30
+ errors: string[];
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/fto/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAEtE,MAAM,MAAM,OAAO,GACf,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,CAAC;AAEV,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,EAAE,EAAE,MAAM,EAAE,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,OAAO,EAS9B,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,SAAS,OAAO,EAiBlC,CAAC;AAEX,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAShD,CAAC;AAEF,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB"}
@@ -0,0 +1,46 @@
1
+ export const FTO_FACES = [
2
+ "U",
3
+ "D",
4
+ "F",
5
+ "B",
6
+ "L",
7
+ "BR",
8
+ "R",
9
+ "BL"
10
+ ];
11
+ export const FTO_ALL_MOVES = [
12
+ "U",
13
+ "U'",
14
+ "D",
15
+ "D'",
16
+ "F",
17
+ "F'",
18
+ "B",
19
+ "B'",
20
+ "L",
21
+ "L'",
22
+ "R",
23
+ "R'",
24
+ "BL",
25
+ "BL'",
26
+ "BR",
27
+ "BR'"
28
+ ];
29
+ export const FTO_AXIS_MAP = {
30
+ U: 0,
31
+ D: 0,
32
+ F: 1,
33
+ B: 1,
34
+ L: 2,
35
+ BR: 2,
36
+ R: 3,
37
+ BL: 3
38
+ };
39
+ export const SCRAMBLE_LENGTH = 30;
40
+ export const FTO_CORNER_COUNT = 6;
41
+ export const FTO_EDGE_COUNT = 12;
42
+ export const FTO_CENTER_ORBIT_COUNT = 12;
43
+ export const FTO_CORNER_PERM_STATES = 360; // 6! / 2
44
+ export const FTO_CORNER_ORI_STATES = 32; // 2^5
45
+ export const FTO_EDGE_PERM_STATES = 239500800; // 12! / 2
46
+ export const FTO_CENTER_ORBIT_STATES = 369600; // C(12,3) * C(9,3) * C(6,3)
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Validation and reachability checking for FTO (Face-Turning Octahedron) states.
3
+ */
4
+ import type { FtoValidationResult } from "./types.js";
5
+ import { FtoCubie } from "./state.js";
6
+ /**
7
+ * Validates the physical and group-theoretic reachability constraints of an FTO state:
8
+ * - 6 corners with unique indices in 0..5 and even permutation parity (A_6)
9
+ * - 6 corner orientations in {0, 1} with sum ≡ 0 (mod 2)
10
+ * - 12 edges with unique indices in 0..11 and even permutation parity (A_12)
11
+ * - 12 centers in orbit 1 (uf) with exactly 3 of each of the 4 colors (0..3)
12
+ * - 12 centers in orbit 2 (rl) with exactly 3 of each of the 4 colors (0..3)
13
+ */
14
+ export declare function validateFtoState(state: FtoCubie): FtoValidationResult;
15
+ /**
16
+ * Checks if a state is trivial (solved or 1 move away from solved).
17
+ */
18
+ export declare function isTrivialFtoState(state: FtoCubie): boolean;
19
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/puzzles/fto/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,QAAQ,EAA0C,MAAM,YAAY,CAAC;AAI9E;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,mBAAmB,CAsGrE;AAYD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAa1D"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Validation and reachability checking for FTO (Face-Turning Octahedron) states.
3
+ */
4
+ import { FTO_ALL_MOVES, FTO_CORNER_COUNT, FTO_EDGE_COUNT } from "./types.js";
5
+ import { createSolvedFtoState, isSolvedFtoState } from "./state.js";
6
+ import { applyFtoMove } from "./moves.js";
7
+ import { getPermutationParity } from "./coordinates.js";
8
+ /**
9
+ * Validates the physical and group-theoretic reachability constraints of an FTO state:
10
+ * - 6 corners with unique indices in 0..5 and even permutation parity (A_6)
11
+ * - 6 corner orientations in {0, 1} with sum ≡ 0 (mod 2)
12
+ * - 12 edges with unique indices in 0..11 and even permutation parity (A_12)
13
+ * - 12 centers in orbit 1 (uf) with exactly 3 of each of the 4 colors (0..3)
14
+ * - 12 centers in orbit 2 (rl) with exactly 3 of each of the 4 colors (0..3)
15
+ */
16
+ export function validateFtoState(state) {
17
+ const errors = [];
18
+ // 1. Validate corners (cp)
19
+ if (!Array.isArray(state.cp) || state.cp.length !== FTO_CORNER_COUNT) {
20
+ errors.push(`Corner permutation array (cp) must have length ${FTO_CORNER_COUNT}`);
21
+ }
22
+ else {
23
+ const cpSeen = new Uint8Array(FTO_CORNER_COUNT);
24
+ let validRange = true;
25
+ for (let i = 0; i < FTO_CORNER_COUNT; i++) {
26
+ const v = state.cp[i];
27
+ if (v < 0 || v >= FTO_CORNER_COUNT || cpSeen[v] > 0) {
28
+ validRange = false;
29
+ break;
30
+ }
31
+ cpSeen[v] = 1;
32
+ }
33
+ if (!validRange) {
34
+ errors.push("Corner permutation array (cp) must contain a valid permutation of 0..5");
35
+ }
36
+ else if (getPermutationParity(state.cp)) {
37
+ errors.push("Corner permutation must have even parity (A_6)");
38
+ }
39
+ }
40
+ // 2. Validate corner orientations (co)
41
+ if (!Array.isArray(state.co) || state.co.length !== FTO_CORNER_COUNT) {
42
+ errors.push(`Corner orientation array (co) must have length ${FTO_CORNER_COUNT}`);
43
+ }
44
+ else {
45
+ let sum = 0;
46
+ let validValues = true;
47
+ for (let i = 0; i < FTO_CORNER_COUNT; i++) {
48
+ const o = state.co[i];
49
+ if (o !== 0 && o !== 1) {
50
+ validValues = false;
51
+ break;
52
+ }
53
+ sum += o;
54
+ }
55
+ if (!validValues) {
56
+ errors.push("Corner orientations must be 0 or 1");
57
+ }
58
+ else if ((sum & 1) !== 0) {
59
+ errors.push("Sum of corner orientations must be even (mod 2)");
60
+ }
61
+ }
62
+ // 3. Validate edges (ep)
63
+ if (!Array.isArray(state.ep) || state.ep.length !== FTO_EDGE_COUNT) {
64
+ errors.push(`Edge permutation array (ep) must have length ${FTO_EDGE_COUNT}`);
65
+ }
66
+ else {
67
+ const epSeen = new Uint8Array(FTO_EDGE_COUNT);
68
+ let validRange = true;
69
+ for (let i = 0; i < FTO_EDGE_COUNT; i++) {
70
+ const v = state.ep[i];
71
+ if (v < 0 || v >= FTO_EDGE_COUNT || epSeen[v] > 0) {
72
+ validRange = false;
73
+ break;
74
+ }
75
+ epSeen[v] = 1;
76
+ }
77
+ if (!validRange) {
78
+ errors.push("Edge permutation array (ep) must contain a valid permutation of 0..11");
79
+ }
80
+ else if (getPermutationParity(state.ep)) {
81
+ errors.push("Edge permutation must have even parity (A_12)");
82
+ }
83
+ }
84
+ // 4. Validate center orbit 1 (uf)
85
+ if (!Array.isArray(state.uf) || state.uf.length !== 12) {
86
+ errors.push("Center orbit 1 (uf) must have length 12");
87
+ }
88
+ else {
89
+ const counts = [0, 0, 0, 0];
90
+ for (let i = 0; i < 12; i++) {
91
+ const color = Math.floor(state.uf[i] / 3);
92
+ if (color >= 0 && color < 4) {
93
+ counts[color]++;
94
+ }
95
+ }
96
+ if (!counts.every((c) => c === 3)) {
97
+ errors.push("Center orbit 1 (uf) must contain exactly 3 pieces of each of the 4 colors");
98
+ }
99
+ }
100
+ // 5. Validate center orbit 2 (rl)
101
+ if (!Array.isArray(state.rl) || state.rl.length !== 12) {
102
+ errors.push("Center orbit 2 (rl) must have length 12");
103
+ }
104
+ else {
105
+ const counts = [0, 0, 0, 0];
106
+ for (let i = 0; i < 12; i++) {
107
+ const color = Math.floor(state.rl[i] / 3);
108
+ if (color >= 0 && color < 4) {
109
+ counts[color]++;
110
+ }
111
+ }
112
+ if (!counts.every((c) => c === 3)) {
113
+ errors.push("Center orbit 2 (rl) must contain exactly 3 pieces of each of the 4 colors");
114
+ }
115
+ }
116
+ return {
117
+ valid: errors.length === 0,
118
+ errors
119
+ };
120
+ }
121
+ let singleMoveStates = null;
122
+ function getSingleMoveStates() {
123
+ if (!singleMoveStates) {
124
+ const solved = createSolvedFtoState();
125
+ singleMoveStates = FTO_ALL_MOVES.map((move) => applyFtoMove(solved, move));
126
+ }
127
+ return singleMoveStates;
128
+ }
129
+ /**
130
+ * Checks if a state is trivial (solved or 1 move away from solved).
131
+ */
132
+ export function isTrivialFtoState(state) {
133
+ if (isSolvedFtoState(state)) {
134
+ return true;
135
+ }
136
+ const oneMoveStates = getSingleMoveStates();
137
+ for (let i = 0; i < oneMoveStates.length; i++) {
138
+ if (state.isEqual(oneMoveStates[i])) {
139
+ return true;
140
+ }
141
+ }
142
+ return false;
143
+ }
@@ -8,4 +8,6 @@ export * as cube7x7 from "./cube7x7/index.js";
8
8
  export * as pyraminx from "./pyraminx/index.js";
9
9
  export * as clock from "./clock/index.js";
10
10
  export * as skewb from "./skewb/index.js";
11
+ export * as fto from "./fto/index.js";
12
+ export * as sq1 from "./sq1/index.js";
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/puzzles/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/puzzles/index.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC"}
@@ -9,6 +9,8 @@ import { cube7ScrambleGenerator } from "./cube7x7/index.js";
9
9
  import { pyraminxScrambleGenerator } from "./pyraminx/index.js";
10
10
  import { clockScrambleGenerator } from "./clock/index.js";
11
11
  import { skewbScrambleGenerator } from "./skewb/index.js";
12
+ import { ftoScrambleGenerator } from "./fto/index.js";
13
+ import { sq1ScrambleGenerator } from "./sq1/index.js";
12
14
  registerScrambleGenerator(cube2ScrambleGenerator);
13
15
  registerScrambleGenerator(cube3ScrambleGenerator);
14
16
  registerScrambleGenerator(cube4ScrambleGenerator);
@@ -19,6 +21,8 @@ registerScrambleGenerator(cube7ScrambleGenerator);
19
21
  registerScrambleGenerator(pyraminxScrambleGenerator);
20
22
  registerScrambleGenerator(clockScrambleGenerator);
21
23
  registerScrambleGenerator(skewbScrambleGenerator);
24
+ registerScrambleGenerator(ftoScrambleGenerator);
25
+ registerScrambleGenerator(sq1ScrambleGenerator);
22
26
  export * as cube2 from "./cube2/index.js";
23
27
  export * as cube3 from "./cube3/index.js";
24
28
  export * as cube4 from "./cube4/index.js";
@@ -29,3 +33,5 @@ export * as cube7x7 from "./cube7x7/index.js";
29
33
  export * as pyraminx from "./pyraminx/index.js";
30
34
  export * as clock from "./clock/index.js";
31
35
  export * as skewb from "./skewb/index.js";
36
+ export * as fto from "./fto/index.js";
37
+ export * as sq1 from "./sq1/index.js";
@@ -3,7 +3,7 @@ export type { SkewbMove, SkewbState, SkewbFaceMove, SkewbRandomStateOptions, Ske
3
3
  export { applySkewbAlgorithm, applySkewbMove, formatSkewbAlgorithm, invertSkewbAlgorithm, invertSkewbMove, parseSkewbAlgorithm, parseSkewbMove, } from "./moves.js";
4
4
  export { cloneSkewbState, createSolvedSkewbState, isSolvedSkewbState, skewbStatesEqual, } from "./state.js";
5
5
  export { permutationParity, validateSkewbState, isAllowedRandomSkewbState, isOneMoveFromSolvedSkewbState } from "./validation.js";
6
- export { generateRandomSkewbState } from "./random-state.js";
6
+ export { generateRandomSkewbState, generateRandomSkewbStateSync } from "./random-state.js";
7
7
  export { createSolvedSkewbFacelets, formatSkewbFacelets, getSkewbFaceOrder, toSkewbFacelets } from "./facelets.js";
8
8
  export { solveSkewb, solveSkewbWithInfo, solveSkewbSync, verifySkewbScramble, verifySkewbSolution, getStateIndex, getStateFromIndex, } from "./solver/index.js";
9
9
  export * as solver from "./solver/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/skewb/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/G,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnH,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/skewb/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/G,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnH,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -5,7 +5,7 @@ export { SKEWB_MOVES, SKEWB_FACES } from "./types.js";
5
5
  export { applySkewbAlgorithm, applySkewbMove, formatSkewbAlgorithm, invertSkewbAlgorithm, invertSkewbMove, parseSkewbAlgorithm, parseSkewbMove, } from "./moves.js";
6
6
  export { cloneSkewbState, createSolvedSkewbState, isSolvedSkewbState, skewbStatesEqual, } from "./state.js";
7
7
  export { permutationParity, validateSkewbState, isAllowedRandomSkewbState, isOneMoveFromSolvedSkewbState } from "./validation.js";
8
- export { generateRandomSkewbState } from "./random-state.js";
8
+ export { generateRandomSkewbState, generateRandomSkewbStateSync } from "./random-state.js";
9
9
  export { createSolvedSkewbFacelets, formatSkewbFacelets, getSkewbFaceOrder, toSkewbFacelets } from "./facelets.js";
10
10
  export { solveSkewb, solveSkewbWithInfo, solveSkewbSync, verifySkewbScramble, verifySkewbSolution, getStateIndex, getStateFromIndex, } from "./solver/index.js";
11
11
  export * as solver from "./solver/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/skewb/random-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AActE,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,UAAU,CAAC,CAGrB;AAID,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAmB9F"}
1
+ {"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/skewb/random-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AActE,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,UAAU,CAAC,CAKrB;AAID,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAmB9F"}
@@ -1,7 +1,10 @@
1
1
  import { createRandomSource } from "../../random/index.js";
2
2
  import { ensureTablesLoaded, areSkewbTablesLoaded, getCentersTransition, getOrientationTransition, getPermutationTransition, getStateFromRank, MOVE_COUNT, rankFromComponents, SOLVED_RANK, STATE_COUNT, } from "./solver/index.js";
3
3
  export async function generateRandomSkewbState(options = {}) {
4
- await ensureTablesLoaded();
4
+ // Only pay the await/table-load cost when the tables are not already
5
+ // loaded: in the hot path this runs the sync body directly.
6
+ if (!areSkewbTablesLoaded())
7
+ await ensureTablesLoaded();
5
8
  return generateRandomSkewbStateSync(options);
6
9
  }
7
10
  // Synchronous variant for callers that have already ensured the tables are
@@ -0,0 +1,12 @@
1
+ import type { Square1Facelets, Square1State } from "./types.js";
2
+ /**
3
+ * Converts a Square-1 state into a Square1Facelets structure.
4
+ * Extracting face colors and side rim colors for the 12 slots on top and bottom,
5
+ * and the middle layer state.
6
+ */
7
+ export declare function toSquare1Facelets(state: Square1State): Square1Facelets;
8
+ /**
9
+ * Formats Square1Facelets into a compact serialization string.
10
+ */
11
+ export declare function formatSquare1Facelets(facelets: Square1Facelets): string;
12
+ //# sourceMappingURL=facelets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facelets.d.ts","sourceRoot":"","sources":["../../../src/puzzles/sq1/facelets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAUtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAMvE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Converts a Square-1 state into a Square1Facelets structure.
3
+ * Extracting face colors and side rim colors for the 12 slots on top and bottom,
4
+ * and the middle layer state.
5
+ */
6
+ export function toSquare1Facelets(state) {
7
+ return {
8
+ top: state.top.map((s) => s.faceColor),
9
+ topSides: state.top.map((s) => s.sideColor),
10
+ bottom: state.bottom.map((s) => s.faceColor),
11
+ bottomSides: state.bottom.map((s) => s.sideColor),
12
+ middle: state.middle,
13
+ topSlots: state.top.map((s) => ({ ...s })),
14
+ bottomSlots: state.bottom.map((s) => ({ ...s })),
15
+ };
16
+ }
17
+ /**
18
+ * Formats Square1Facelets into a compact serialization string.
19
+ */
20
+ export function formatSquare1Facelets(facelets) {
21
+ const topStr = facelets.top.join("");
22
+ const topSidesStr = facelets.topSides.join("");
23
+ const botStr = facelets.bottom.join("");
24
+ const botSidesStr = facelets.bottomSides.join("");
25
+ return `${topStr}:${topSidesStr}/${botStr}:${botSidesStr}/${facelets.middle}`;
26
+ }
@@ -0,0 +1,10 @@
1
+ export type { Square1Color, Square1Slot, Square1State, Square1Facelets, Square1RandomStateOptions, Square1ValidationResult, Square1Move } from "./types.js";
2
+ export { createSolvedSquare1State, cloneSquare1State, statesEqual, isSolvedSquare1State } from "./state.js";
3
+ export { isSliceable, applyTopTurn, applyBottomTurn, applyTurn, applySlice, getValidTurns, parseSquare1Algorithm, formatSquare1Algorithm, applySquare1Move, applySquare1Algorithm, invertSquare1Move, invertSquare1Algorithm } from "./moves.js";
4
+ export { toSquare1Facelets, formatSquare1Facelets } from "./facelets.js";
5
+ export { validateSquare1State, isTrivialSquare1State } from "./validation.js";
6
+ export { generateRandomSquare1State } from "./random-state.js";
7
+ export { sq1ScrambleGenerator, generateSquare1Scramble, generateSquare1ScrambleSync } from "./scrambler.js";
8
+ export { FullCube, fullCubeToState, stateToFullCube, Square1Searcher, ensureSquare1TablesLoaded, areSquare1TablesLoaded, getSquare1SolverTablesSync, generateSquare1SolverTables, INVERSE_SOLUTION, type Square1Solution, type Square1SolverTables } from "./solver/index.js";
9
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/sq1/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,QAAQ,EACR,eAAe,EACf,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { sq1ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(sq1ScrambleGenerator);
4
+ export { createSolvedSquare1State, cloneSquare1State, statesEqual, isSolvedSquare1State } from "./state.js";
5
+ export { isSliceable, applyTopTurn, applyBottomTurn, applyTurn, applySlice, getValidTurns, parseSquare1Algorithm, formatSquare1Algorithm, applySquare1Move, applySquare1Algorithm, invertSquare1Move, invertSquare1Algorithm } from "./moves.js";
6
+ export { toSquare1Facelets, formatSquare1Facelets } from "./facelets.js";
7
+ export { validateSquare1State, isTrivialSquare1State } from "./validation.js";
8
+ export { generateRandomSquare1State } from "./random-state.js";
9
+ export { sq1ScrambleGenerator, generateSquare1Scramble, generateSquare1ScrambleSync } from "./scrambler.js";
10
+ export { FullCube, fullCubeToState, stateToFullCube, Square1Searcher, ensureSquare1TablesLoaded, areSquare1TablesLoaded, getSquare1SolverTablesSync, generateSquare1SolverTables, INVERSE_SOLUTION } from "./solver/index.js";
11
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -0,0 +1,55 @@
1
+ import type { Square1State } from "./types.js";
2
+ /**
3
+ * Checks whether the puzzle is in a state where a slice (/) turn is physically possible.
4
+ * Both top and bottom layers must have clean cuts at 11/0 (Back seam) and 5/6 (Front seam).
5
+ */
6
+ export declare function isSliceable(state: Square1State): boolean;
7
+ /**
8
+ * Applies a clockwise turn of the top layer by u * 30 degrees (u in range -5..6 or any integer).
9
+ */
10
+ export declare function applyTopTurn(state: Square1State, u: number): Square1State;
11
+ /**
12
+ * Applies a turn of the bottom layer by d * 30 degrees (d in range -5..6 or any integer).
13
+ */
14
+ export declare function applyBottomTurn(state: Square1State, d: number): Square1State;
15
+ /**
16
+ * Applies simultaneous top (u) and bottom (d) turns.
17
+ */
18
+ export declare function applyTurn(state: Square1State, u: number, d: number): Square1State;
19
+ /**
20
+ * Applies a slice (/) move, swapping the right half of top (slots 6..11)
21
+ * with the right half of bottom (slots 0..5).
22
+ */
23
+ export declare function applySlice(state: Square1State): Square1State;
24
+ /**
25
+ * Returns all (u, d) turns from the current state that lead to a sliceable state.
26
+ * u and d are within range [-5, 6].
27
+ */
28
+ export declare function getValidTurns(state: Square1State): [number, number][];
29
+ /**
30
+ * Parses a Square-1 algorithm string into individual move tokens.
31
+ * Supported tokens: "/", "(u, d)", "(u, d) /", etc.
32
+ */
33
+ export declare function parseSquare1Algorithm(alg: string): string[];
34
+ /**
35
+ * Formats an array of Square-1 move tokens into standard WCA notation.
36
+ */
37
+ export declare function formatSquare1Algorithm(moves: string[]): string;
38
+ /**
39
+ * Applies a single move token to the Square-1 state.
40
+ * Token can be "/", "(u, d)", or "(u, d) /".
41
+ */
42
+ export declare function applySquare1Move(state: Square1State, move: string): Square1State;
43
+ /**
44
+ * Applies a full algorithm to a Square-1 state.
45
+ */
46
+ export declare function applySquare1Algorithm(state: Square1State, alg: string | string[]): Square1State;
47
+ /**
48
+ * Inverts a single Square-1 move token.
49
+ */
50
+ export declare function invertSquare1Move(move: string): string;
51
+ /**
52
+ * Inverts an entire Square-1 algorithm sequence.
53
+ */
54
+ export declare function invertSquare1Algorithm(alg: string | string[]): string[];
55
+ //# sourceMappingURL=moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/sq1/moves.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAkBxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAazE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAa5E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAiBjF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAoB5D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAarE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAqBhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GACrB,YAAY,CAOd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAatD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAwBvE"}