@cubingcenter/scrambler 0.1.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 (359) hide show
  1. package/README.md +169 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +10 -0
  5. package/dist/cli/run.d.ts +9 -0
  6. package/dist/cli/run.d.ts.map +1 -0
  7. package/dist/cli/run.js +139 -0
  8. package/dist/core/api.d.ts +19 -0
  9. package/dist/core/api.d.ts.map +1 -0
  10. package/dist/core/api.js +94 -0
  11. package/dist/core/errors.d.ts +21 -0
  12. package/dist/core/errors.d.ts.map +1 -0
  13. package/dist/core/errors.js +34 -0
  14. package/dist/core/index.d.ts +5 -0
  15. package/dist/core/index.d.ts.map +1 -0
  16. package/dist/core/index.js +3 -0
  17. package/dist/core/registry.d.ts +10 -0
  18. package/dist/core/registry.d.ts.map +1 -0
  19. package/dist/core/registry.js +35 -0
  20. package/dist/core/types.d.ts +34 -0
  21. package/dist/core/types.d.ts.map +1 -0
  22. package/dist/core/types.js +1 -0
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +3 -0
  26. package/dist/puzzles/clock/index.d.ts +2 -0
  27. package/dist/puzzles/clock/index.d.ts.map +1 -0
  28. package/dist/puzzles/clock/index.js +1 -0
  29. package/dist/puzzles/clock/scrambler.d.ts +4 -0
  30. package/dist/puzzles/clock/scrambler.d.ts.map +1 -0
  31. package/dist/puzzles/clock/scrambler.js +50 -0
  32. package/dist/puzzles/cube2/facelets.d.ts +5 -0
  33. package/dist/puzzles/cube2/facelets.d.ts.map +1 -0
  34. package/dist/puzzles/cube2/facelets.js +53 -0
  35. package/dist/puzzles/cube2/index.d.ts +10 -0
  36. package/dist/puzzles/cube2/index.d.ts.map +1 -0
  37. package/dist/puzzles/cube2/index.js +8 -0
  38. package/dist/puzzles/cube2/moves.d.ts +9 -0
  39. package/dist/puzzles/cube2/moves.d.ts.map +1 -0
  40. package/dist/puzzles/cube2/moves.js +79 -0
  41. package/dist/puzzles/cube2/random-state.d.ts +3 -0
  42. package/dist/puzzles/cube2/random-state.d.ts.map +1 -0
  43. package/dist/puzzles/cube2/random-state.js +51 -0
  44. package/dist/puzzles/cube2/scrambler.d.ts +6 -0
  45. package/dist/puzzles/cube2/scrambler.d.ts.map +1 -0
  46. package/dist/puzzles/cube2/scrambler.js +54 -0
  47. package/dist/puzzles/cube2/solver/browser-loader.d.ts +12 -0
  48. package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -0
  49. package/dist/puzzles/cube2/solver/browser-loader.js +80 -0
  50. package/dist/puzzles/cube2/solver/generated/distances.bin +1 -0
  51. package/dist/puzzles/cube2/solver/generated/manifest.json +21 -0
  52. package/dist/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
  53. package/dist/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
  54. package/dist/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
  55. package/dist/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
  56. package/dist/puzzles/cube2/solver/generated-assets.d.ts +6 -0
  57. package/dist/puzzles/cube2/solver/generated-assets.d.ts.map +1 -0
  58. package/dist/puzzles/cube2/solver/generated-assets.js +25 -0
  59. package/dist/puzzles/cube2/solver/index.d.ts +3 -0
  60. package/dist/puzzles/cube2/solver/index.d.ts.map +1 -0
  61. package/dist/puzzles/cube2/solver/index.js +1 -0
  62. package/dist/puzzles/cube2/solver/node-loader.d.ts +6 -0
  63. package/dist/puzzles/cube2/solver/node-loader.d.ts.map +1 -0
  64. package/dist/puzzles/cube2/solver/node-loader.js +83 -0
  65. package/dist/puzzles/cube2/solver/search.d.ts +8 -0
  66. package/dist/puzzles/cube2/solver/search.d.ts.map +1 -0
  67. package/dist/puzzles/cube2/solver/search.js +50 -0
  68. package/dist/puzzles/cube2/solver/table-metadata.d.ts +16 -0
  69. package/dist/puzzles/cube2/solver/table-metadata.d.ts.map +1 -0
  70. package/dist/puzzles/cube2/solver/table-metadata.js +15 -0
  71. package/dist/puzzles/cube2/solver/tables.d.ts +14 -0
  72. package/dist/puzzles/cube2/solver/tables.d.ts.map +1 -0
  73. package/dist/puzzles/cube2/solver/tables.js +82 -0
  74. package/dist/puzzles/cube2/state.d.ts +6 -0
  75. package/dist/puzzles/cube2/state.d.ts.map +1 -0
  76. package/dist/puzzles/cube2/state.js +30 -0
  77. package/dist/puzzles/cube2/types.d.ts +23 -0
  78. package/dist/puzzles/cube2/types.d.ts.map +1 -0
  79. package/dist/puzzles/cube2/types.js +21 -0
  80. package/dist/puzzles/cube2/validation.d.ts +6 -0
  81. package/dist/puzzles/cube2/validation.d.ts.map +1 -0
  82. package/dist/puzzles/cube2/validation.js +72 -0
  83. package/dist/puzzles/cube3/facelets.d.ts +5 -0
  84. package/dist/puzzles/cube3/facelets.d.ts.map +1 -0
  85. package/dist/puzzles/cube3/facelets.js +89 -0
  86. package/dist/puzzles/cube3/index.d.ts +10 -0
  87. package/dist/puzzles/cube3/index.d.ts.map +1 -0
  88. package/dist/puzzles/cube3/index.js +8 -0
  89. package/dist/puzzles/cube3/moves.d.ts +9 -0
  90. package/dist/puzzles/cube3/moves.d.ts.map +1 -0
  91. package/dist/puzzles/cube3/moves.js +210 -0
  92. package/dist/puzzles/cube3/random-state.d.ts +3 -0
  93. package/dist/puzzles/cube3/random-state.d.ts.map +1 -0
  94. package/dist/puzzles/cube3/random-state.js +59 -0
  95. package/dist/puzzles/cube3/scrambler.d.ts +6 -0
  96. package/dist/puzzles/cube3/scrambler.d.ts.map +1 -0
  97. package/dist/puzzles/cube3/scrambler.js +59 -0
  98. package/dist/puzzles/cube3/solver/browser-loader.d.ts +5 -0
  99. package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -0
  100. package/dist/puzzles/cube3/solver/browser-loader.js +134 -0
  101. package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts +31 -0
  102. package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts.map +1 -0
  103. package/dist/puzzles/cube3/solver/browser-worker-pool.js +118 -0
  104. package/dist/puzzles/cube3/solver/browser-worker.d.ts +2 -0
  105. package/dist/puzzles/cube3/solver/browser-worker.d.ts.map +1 -0
  106. package/dist/puzzles/cube3/solver/browser-worker.js +71 -0
  107. package/dist/puzzles/cube3/solver/coordinates.d.ts +34 -0
  108. package/dist/puzzles/cube3/solver/coordinates.d.ts.map +1 -0
  109. package/dist/puzzles/cube3/solver/coordinates.js +266 -0
  110. package/dist/puzzles/cube3/solver/generated/manifest.json +404 -0
  111. package/dist/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
  112. package/dist/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
  113. package/dist/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
  114. package/dist/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
  115. package/dist/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
  116. package/dist/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
  117. package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
  118. package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
  119. package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
  120. package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
  121. package/dist/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
  122. package/dist/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
  123. package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
  124. package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
  125. package/dist/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
  126. package/dist/puzzles/cube3/solver/generated-assets.d.ts +5 -0
  127. package/dist/puzzles/cube3/solver/generated-assets.d.ts.map +1 -0
  128. package/dist/puzzles/cube3/solver/generated-assets.js +60 -0
  129. package/dist/puzzles/cube3/solver/index.d.ts +10 -0
  130. package/dist/puzzles/cube3/solver/index.d.ts.map +1 -0
  131. package/dist/puzzles/cube3/solver/index.js +5 -0
  132. package/dist/puzzles/cube3/solver/node-loader.d.ts +3 -0
  133. package/dist/puzzles/cube3/solver/node-loader.d.ts.map +1 -0
  134. package/dist/puzzles/cube3/solver/node-loader.js +120 -0
  135. package/dist/puzzles/cube3/solver/phase1.d.ts +28 -0
  136. package/dist/puzzles/cube3/solver/phase1.d.ts.map +1 -0
  137. package/dist/puzzles/cube3/solver/phase1.js +150 -0
  138. package/dist/puzzles/cube3/solver/phase2.d.ts +44 -0
  139. package/dist/puzzles/cube3/solver/phase2.d.ts.map +1 -0
  140. package/dist/puzzles/cube3/solver/phase2.js +270 -0
  141. package/dist/puzzles/cube3/solver/search-utils.d.ts +9 -0
  142. package/dist/puzzles/cube3/solver/search-utils.d.ts.map +1 -0
  143. package/dist/puzzles/cube3/solver/search-utils.js +41 -0
  144. package/dist/puzzles/cube3/solver/table-metadata.d.ts +97 -0
  145. package/dist/puzzles/cube3/solver/table-metadata.d.ts.map +1 -0
  146. package/dist/puzzles/cube3/solver/table-metadata.js +21 -0
  147. package/dist/puzzles/cube3/solver/tables.d.ts +72 -0
  148. package/dist/puzzles/cube3/solver/tables.d.ts.map +1 -0
  149. package/dist/puzzles/cube3/solver/tables.js +202 -0
  150. package/dist/puzzles/cube3/solver/worker-pool.d.ts +18 -0
  151. package/dist/puzzles/cube3/solver/worker-pool.d.ts.map +1 -0
  152. package/dist/puzzles/cube3/solver/worker-pool.js +116 -0
  153. package/dist/puzzles/cube3/solver/worker.d.ts +2 -0
  154. package/dist/puzzles/cube3/solver/worker.d.ts.map +1 -0
  155. package/dist/puzzles/cube3/solver/worker.js +73 -0
  156. package/dist/puzzles/cube3/state.d.ts +6 -0
  157. package/dist/puzzles/cube3/state.d.ts.map +1 -0
  158. package/dist/puzzles/cube3/state.js +40 -0
  159. package/dist/puzzles/cube3/subset-state.d.ts +4 -0
  160. package/dist/puzzles/cube3/subset-state.d.ts.map +1 -0
  161. package/dist/puzzles/cube3/subset-state.js +163 -0
  162. package/dist/puzzles/cube3/types.d.ts +29 -0
  163. package/dist/puzzles/cube3/types.d.ts.map +1 -0
  164. package/dist/puzzles/cube3/types.js +22 -0
  165. package/dist/puzzles/cube3/validation.d.ts +6 -0
  166. package/dist/puzzles/cube3/validation.d.ts.map +1 -0
  167. package/dist/puzzles/cube3/validation.js +83 -0
  168. package/dist/puzzles/cube4/facelets.d.ts +5 -0
  169. package/dist/puzzles/cube4/facelets.d.ts.map +1 -0
  170. package/dist/puzzles/cube4/facelets.js +135 -0
  171. package/dist/puzzles/cube4/index.d.ts +7 -0
  172. package/dist/puzzles/cube4/index.d.ts.map +1 -0
  173. package/dist/puzzles/cube4/index.js +8 -0
  174. package/dist/puzzles/cube4/moves.d.ts +37 -0
  175. package/dist/puzzles/cube4/moves.d.ts.map +1 -0
  176. package/dist/puzzles/cube4/moves.js +243 -0
  177. package/dist/puzzles/cube4/scrambler.d.ts +4 -0
  178. package/dist/puzzles/cube4/scrambler.d.ts.map +1 -0
  179. package/dist/puzzles/cube4/scrambler.js +98 -0
  180. package/dist/puzzles/cube4/state.d.ts +16 -0
  181. package/dist/puzzles/cube4/state.d.ts.map +1 -0
  182. package/dist/puzzles/cube4/state.js +84 -0
  183. package/dist/puzzles/cube4/types.d.ts +76 -0
  184. package/dist/puzzles/cube4/types.d.ts.map +1 -0
  185. package/dist/puzzles/cube4/types.js +62 -0
  186. package/dist/puzzles/cube5x5/index.d.ts +4 -0
  187. package/dist/puzzles/cube5x5/index.d.ts.map +1 -0
  188. package/dist/puzzles/cube5x5/index.js +2 -0
  189. package/dist/puzzles/cube5x5/scrambler.d.ts +4 -0
  190. package/dist/puzzles/cube5x5/scrambler.d.ts.map +1 -0
  191. package/dist/puzzles/cube5x5/scrambler.js +93 -0
  192. package/dist/puzzles/cube5x5/types.d.ts +4 -0
  193. package/dist/puzzles/cube5x5/types.d.ts.map +1 -0
  194. package/dist/puzzles/cube5x5/types.js +4 -0
  195. package/dist/puzzles/cube6x6/index.d.ts +4 -0
  196. package/dist/puzzles/cube6x6/index.d.ts.map +1 -0
  197. package/dist/puzzles/cube6x6/index.js +2 -0
  198. package/dist/puzzles/cube6x6/scrambler.d.ts +4 -0
  199. package/dist/puzzles/cube6x6/scrambler.d.ts.map +1 -0
  200. package/dist/puzzles/cube6x6/scrambler.js +105 -0
  201. package/dist/puzzles/cube6x6/types.d.ts +4 -0
  202. package/dist/puzzles/cube6x6/types.d.ts.map +1 -0
  203. package/dist/puzzles/cube6x6/types.js +8 -0
  204. package/dist/puzzles/cube7x7/index.d.ts +4 -0
  205. package/dist/puzzles/cube7x7/index.d.ts.map +1 -0
  206. package/dist/puzzles/cube7x7/index.js +2 -0
  207. package/dist/puzzles/cube7x7/scrambler.d.ts +4 -0
  208. package/dist/puzzles/cube7x7/scrambler.d.ts.map +1 -0
  209. package/dist/puzzles/cube7x7/scrambler.js +93 -0
  210. package/dist/puzzles/cube7x7/types.d.ts +4 -0
  211. package/dist/puzzles/cube7x7/types.d.ts.map +1 -0
  212. package/dist/puzzles/cube7x7/types.js +8 -0
  213. package/dist/puzzles/index.d.ts +10 -0
  214. package/dist/puzzles/index.d.ts.map +1 -0
  215. package/dist/puzzles/index.js +28 -0
  216. package/dist/puzzles/megaminx/index.d.ts +4 -0
  217. package/dist/puzzles/megaminx/index.d.ts.map +1 -0
  218. package/dist/puzzles/megaminx/index.js +2 -0
  219. package/dist/puzzles/megaminx/scrambler.d.ts +4 -0
  220. package/dist/puzzles/megaminx/scrambler.d.ts.map +1 -0
  221. package/dist/puzzles/megaminx/scrambler.js +56 -0
  222. package/dist/puzzles/megaminx/types.d.ts +6 -0
  223. package/dist/puzzles/megaminx/types.d.ts.map +1 -0
  224. package/dist/puzzles/megaminx/types.js +4 -0
  225. package/dist/puzzles/pyraminx/index.d.ts +9 -0
  226. package/dist/puzzles/pyraminx/index.d.ts.map +1 -0
  227. package/dist/puzzles/pyraminx/index.js +7 -0
  228. package/dist/puzzles/pyraminx/moves.d.ts +9 -0
  229. package/dist/puzzles/pyraminx/moves.d.ts.map +1 -0
  230. package/dist/puzzles/pyraminx/moves.js +117 -0
  231. package/dist/puzzles/pyraminx/random-state.d.ts +3 -0
  232. package/dist/puzzles/pyraminx/random-state.d.ts.map +1 -0
  233. package/dist/puzzles/pyraminx/random-state.js +53 -0
  234. package/dist/puzzles/pyraminx/scrambler.d.ts +6 -0
  235. package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -0
  236. package/dist/puzzles/pyraminx/scrambler.js +56 -0
  237. package/dist/puzzles/pyraminx/solver.d.ts +10 -0
  238. package/dist/puzzles/pyraminx/solver.d.ts.map +1 -0
  239. package/dist/puzzles/pyraminx/solver.js +160 -0
  240. package/dist/puzzles/pyraminx/state.d.ts +6 -0
  241. package/dist/puzzles/pyraminx/state.d.ts.map +1 -0
  242. package/dist/puzzles/pyraminx/state.js +32 -0
  243. package/dist/puzzles/pyraminx/types.d.ts +17 -0
  244. package/dist/puzzles/pyraminx/types.d.ts.map +1 -0
  245. package/dist/puzzles/pyraminx/types.js +7 -0
  246. package/dist/puzzles/pyraminx/validation.d.ts +8 -0
  247. package/dist/puzzles/pyraminx/validation.d.ts.map +1 -0
  248. package/dist/puzzles/pyraminx/validation.js +79 -0
  249. package/dist/random/index.d.ts +3 -0
  250. package/dist/random/index.d.ts.map +1 -0
  251. package/dist/random/index.js +1 -0
  252. package/dist/random/prng.d.ts +7 -0
  253. package/dist/random/prng.d.ts.map +1 -0
  254. package/dist/random/prng.js +60 -0
  255. package/dist-cjs/cli/index.js +12 -0
  256. package/dist-cjs/cli/run.js +142 -0
  257. package/dist-cjs/core/api.js +102 -0
  258. package/dist-cjs/core/errors.js +42 -0
  259. package/dist-cjs/core/index.js +19 -0
  260. package/dist-cjs/core/registry.js +39 -0
  261. package/dist-cjs/core/types.js +2 -0
  262. package/dist-cjs/index.js +19 -0
  263. package/dist-cjs/package.json +3 -0
  264. package/dist-cjs/puzzles/clock/index.js +6 -0
  265. package/dist-cjs/puzzles/clock/scrambler.js +54 -0
  266. package/dist-cjs/puzzles/cube2/facelets.js +58 -0
  267. package/dist-cjs/puzzles/cube2/index.js +67 -0
  268. package/dist-cjs/puzzles/cube2/moves.js +88 -0
  269. package/dist-cjs/puzzles/cube2/random-state.js +54 -0
  270. package/dist-cjs/puzzles/cube2/scrambler.js +58 -0
  271. package/dist-cjs/puzzles/cube2/solver/browser-loader.js +85 -0
  272. package/dist-cjs/puzzles/cube2/solver/generated/distances.bin +1 -0
  273. package/dist-cjs/puzzles/cube2/solver/generated/manifest.json +21 -0
  274. package/dist-cjs/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
  275. package/dist-cjs/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
  276. package/dist-cjs/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
  277. package/dist-cjs/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
  278. package/dist-cjs/puzzles/cube2/solver/generated-assets.js +61 -0
  279. package/dist-cjs/puzzles/cube2/solver/index.js +5 -0
  280. package/dist-cjs/puzzles/cube2/solver/node-loader.js +89 -0
  281. package/dist-cjs/puzzles/cube2/solver/search.js +53 -0
  282. package/dist-cjs/puzzles/cube2/solver/table-metadata.js +18 -0
  283. package/dist-cjs/puzzles/cube2/solver/tables.js +91 -0
  284. package/dist-cjs/puzzles/cube2/state.js +36 -0
  285. package/dist-cjs/puzzles/cube2/types.js +24 -0
  286. package/dist-cjs/puzzles/cube2/validation.js +78 -0
  287. package/dist-cjs/puzzles/cube3/facelets.js +94 -0
  288. package/dist-cjs/puzzles/cube3/index.js +68 -0
  289. package/dist-cjs/puzzles/cube3/moves.js +219 -0
  290. package/dist-cjs/puzzles/cube3/random-state.js +62 -0
  291. package/dist-cjs/puzzles/cube3/scrambler.js +63 -0
  292. package/dist-cjs/puzzles/cube3/solver/browser-loader.js +139 -0
  293. package/dist-cjs/puzzles/cube3/solver/coordinates.js +285 -0
  294. package/dist-cjs/puzzles/cube3/solver/generated/manifest.json +404 -0
  295. package/dist-cjs/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
  296. package/dist-cjs/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
  297. package/dist-cjs/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
  298. package/dist-cjs/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
  299. package/dist-cjs/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
  300. package/dist-cjs/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
  301. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
  302. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
  303. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
  304. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
  305. package/dist-cjs/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
  306. package/dist-cjs/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
  307. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
  308. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
  309. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
  310. package/dist-cjs/puzzles/cube3/solver/generated-assets.js +98 -0
  311. package/dist-cjs/puzzles/cube3/solver/index.js +49 -0
  312. package/dist-cjs/puzzles/cube3/solver/node-loader.js +126 -0
  313. package/dist-cjs/puzzles/cube3/solver/phase1.js +158 -0
  314. package/dist-cjs/puzzles/cube3/solver/phase2.js +279 -0
  315. package/dist-cjs/puzzles/cube3/solver/search-utils.js +49 -0
  316. package/dist-cjs/puzzles/cube3/solver/table-metadata.js +24 -0
  317. package/dist-cjs/puzzles/cube3/solver/tables.js +216 -0
  318. package/dist-cjs/puzzles/cube3/state.js +46 -0
  319. package/dist-cjs/puzzles/cube3/subset-state.js +166 -0
  320. package/dist-cjs/puzzles/cube3/types.js +25 -0
  321. package/dist-cjs/puzzles/cube3/validation.js +89 -0
  322. package/dist-cjs/puzzles/cube4/facelets.js +140 -0
  323. package/dist-cjs/puzzles/cube4/index.js +45 -0
  324. package/dist-cjs/puzzles/cube4/moves.js +251 -0
  325. package/dist-cjs/puzzles/cube4/scrambler.js +135 -0
  326. package/dist-cjs/puzzles/cube4/state.js +92 -0
  327. package/dist-cjs/puzzles/cube4/types.js +65 -0
  328. package/dist-cjs/puzzles/cube5x5/index.js +9 -0
  329. package/dist-cjs/puzzles/cube5x5/scrambler.js +97 -0
  330. package/dist-cjs/puzzles/cube5x5/types.js +7 -0
  331. package/dist-cjs/puzzles/cube6x6/index.js +9 -0
  332. package/dist-cjs/puzzles/cube6x6/scrambler.js +109 -0
  333. package/dist-cjs/puzzles/cube6x6/types.js +11 -0
  334. package/dist-cjs/puzzles/cube7x7/index.js +9 -0
  335. package/dist-cjs/puzzles/cube7x7/scrambler.js +97 -0
  336. package/dist-cjs/puzzles/cube7x7/types.js +11 -0
  337. package/dist-cjs/puzzles/index.js +64 -0
  338. package/dist-cjs/puzzles/megaminx/index.js +11 -0
  339. package/dist-cjs/puzzles/megaminx/scrambler.js +60 -0
  340. package/dist-cjs/puzzles/megaminx/types.js +7 -0
  341. package/dist-cjs/puzzles/pyraminx/index.js +30 -0
  342. package/dist-cjs/puzzles/pyraminx/moves.js +126 -0
  343. package/dist-cjs/puzzles/pyraminx/random-state.js +56 -0
  344. package/dist-cjs/puzzles/pyraminx/scrambler.js +60 -0
  345. package/dist-cjs/puzzles/pyraminx/solver.js +170 -0
  346. package/dist-cjs/puzzles/pyraminx/state.js +38 -0
  347. package/dist-cjs/puzzles/pyraminx/types.js +10 -0
  348. package/dist-cjs/puzzles/pyraminx/validation.js +84 -0
  349. package/dist-cjs/random/index.js +5 -0
  350. package/dist-cjs/random/prng.js +63 -0
  351. package/docs/cubingcenter-integration.md +69 -0
  352. package/docs/development.md +44 -0
  353. package/docs/facelets.md +64 -0
  354. package/docs/getting-started.md +73 -0
  355. package/examples/cli-json.md +30 -0
  356. package/examples/commonjs.cjs +11 -0
  357. package/examples/esm.mjs +9 -0
  358. package/examples/timer-preview.mjs +29 -0
  359. package/package.json +53 -0
@@ -0,0 +1,160 @@
1
+ import { applyPyraminxMove } from "./moves.js";
2
+ import { createSolvedPyraminxState } from "./state.js";
3
+ // Fast state-to-index encoder/decoder to allow optimal BFS solving
4
+ // Factorials for permutation encoding
5
+ const FACT = [1, 1, 2, 6, 24, 120, 720];
6
+ export function getPermutationIndex(perm) {
7
+ let index = 0;
8
+ const n = perm.length;
9
+ for (let i = 0; i < n; i++) {
10
+ let count = 0;
11
+ for (let j = i + 1; j < n; j++) {
12
+ if (perm[j] < perm[i])
13
+ count++;
14
+ }
15
+ index += count * FACT[n - 1 - i];
16
+ }
17
+ return index;
18
+ }
19
+ export function getPermutationFromIndex(index, n) {
20
+ const perm = Array(n).fill(0);
21
+ const temp = Array.from({ length: n }, (_, i) => i);
22
+ let val = index;
23
+ for (let i = 0; i < n; i++) {
24
+ const f = FACT[n - 1 - i];
25
+ const choice = Math.floor(val / f);
26
+ val %= f;
27
+ perm[i] = temp[choice];
28
+ temp.splice(choice, 1);
29
+ }
30
+ return perm;
31
+ }
32
+ export function getOrientationIndex(orient) {
33
+ let index = 0;
34
+ for (let i = 0; i < 5; i++) {
35
+ index = (index << 1) | orient[i];
36
+ }
37
+ return index;
38
+ }
39
+ export function getOrientationFromIndex(index) {
40
+ const orient = Array(6).fill(0);
41
+ let temp = index;
42
+ let sum = 0;
43
+ for (let i = 4; i >= 0; i--) {
44
+ const bit = temp & 1;
45
+ orient[i] = bit;
46
+ sum += bit;
47
+ temp >>= 1;
48
+ }
49
+ orient[5] = sum % 2 === 0 ? 0 : 1;
50
+ return orient;
51
+ }
52
+ export function getCentersIndex(centers) {
53
+ return centers[0] + 3 * centers[1] + 9 * centers[2] + 27 * centers[3];
54
+ }
55
+ export function getCentersFromIndex(index) {
56
+ let temp = index;
57
+ const centers = Array(4).fill(0);
58
+ for (let i = 0; i < 4; i++) {
59
+ centers[i] = temp % 3;
60
+ temp = Math.floor(temp / 3);
61
+ }
62
+ return centers;
63
+ }
64
+ export function getStateIndex(state) {
65
+ const c = getCentersIndex(state.centers);
66
+ const p = getPermutationIndex(state.edgesPerm);
67
+ const o = getOrientationIndex(state.edgesOrient);
68
+ // c is 0..80, p is 0..719, o is 0..31
69
+ return c + 81 * (p + 720 * o);
70
+ }
71
+ // Bidirectional BFS solver
72
+ const MOVES = ["U", "U'", "L", "L'", "R", "R'", "B", "B'"];
73
+ export function solvePyraminx(state) {
74
+ const startIdx = getStateIndex(state);
75
+ const solvedIdx = getStateIndex(createSolvedPyraminxState());
76
+ if (startIdx === solvedIdx)
77
+ return [];
78
+ // Bidirectional BFS:
79
+ // forwardMap and backwardMap store the move that led to this index and the parent index
80
+ const forwardMap = new Map();
81
+ const backwardMap = new Map();
82
+ const forwardQueue = [startIdx];
83
+ const backwardQueue = [solvedIdx];
84
+ forwardMap.set(startIdx, { move: "", parent: -1 });
85
+ backwardMap.set(solvedIdx, { move: "", parent: -1 });
86
+ while (forwardQueue.length > 0 && backwardQueue.length > 0) {
87
+ // Expand forward
88
+ const fSize = forwardQueue.length;
89
+ for (let i = 0; i < Math.min(fSize, 1000); i++) {
90
+ const currIdx = forwardQueue.shift();
91
+ const currState = getPyraminxStateFromIndex(currIdx);
92
+ for (const move of MOVES) {
93
+ const nextState = applyPyraminxMove(currState, move);
94
+ const nextIdx = getStateIndex(nextState);
95
+ if (!forwardMap.has(nextIdx)) {
96
+ forwardMap.set(nextIdx, { move, parent: currIdx });
97
+ if (backwardMap.has(nextIdx)) {
98
+ return reconstructPath(nextIdx, forwardMap, backwardMap);
99
+ }
100
+ forwardQueue.push(nextIdx);
101
+ }
102
+ }
103
+ }
104
+ // Expand backward
105
+ const bSize = backwardQueue.length;
106
+ for (let i = 0; i < Math.min(bSize, 1000); i++) {
107
+ const currIdx = backwardQueue.shift();
108
+ const currState = getPyraminxStateFromIndex(currIdx);
109
+ for (const move of MOVES) {
110
+ const nextState = applyPyraminxMove(currState, move);
111
+ const nextIdx = getStateIndex(nextState);
112
+ if (!backwardMap.has(nextIdx)) {
113
+ // Note: we record the inverse move since we are searching from solved
114
+ const invMove = move.endsWith("'") ? move.slice(0, -1) : `${move}'`;
115
+ backwardMap.set(nextIdx, { move: invMove, parent: currIdx });
116
+ if (forwardMap.has(nextIdx)) {
117
+ return reconstructPath(nextIdx, forwardMap, backwardMap);
118
+ }
119
+ backwardQueue.push(nextIdx);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ throw new Error("Pyraminx state is unsolvable");
125
+ }
126
+ function getPyraminxStateFromIndex(index) {
127
+ let val = index;
128
+ const centersIdx = val % 81;
129
+ val = Math.floor(val / 81);
130
+ const permIdx = val % 720;
131
+ const orientIdx = Math.floor(val / 720);
132
+ return {
133
+ centers: getCentersFromIndex(centersIdx),
134
+ edgesPerm: getPermutationFromIndex(permIdx, 6),
135
+ edgesOrient: getOrientationFromIndex(orientIdx),
136
+ tips: [0, 0, 0, 0] // tips are solved separately
137
+ };
138
+ }
139
+ function reconstructPath(meetingIdx, forwardMap, backwardMap) {
140
+ const path = [];
141
+ // Reconstruct forward path
142
+ let curr = meetingIdx;
143
+ while (curr !== -1) {
144
+ const edge = forwardMap.get(curr);
145
+ if (edge.parent !== -1) {
146
+ path.unshift(edge.move);
147
+ }
148
+ curr = edge.parent;
149
+ }
150
+ // Reconstruct backward path
151
+ curr = meetingIdx;
152
+ while (curr !== -1) {
153
+ const edge = backwardMap.get(curr);
154
+ if (edge.parent !== -1) {
155
+ path.push(edge.move);
156
+ }
157
+ curr = edge.parent;
158
+ }
159
+ return path;
160
+ }
@@ -0,0 +1,6 @@
1
+ import type { PyraminxState } from "./types.js";
2
+ export declare function createSolvedPyraminxState(): PyraminxState;
3
+ export declare function clonePyraminxState(state: PyraminxState): PyraminxState;
4
+ export declare function pyraminxStatesEqual(left: PyraminxState, right: PyraminxState): boolean;
5
+ export declare function isSolvedPyraminxState(state: PyraminxState): boolean;
6
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,yBAAyB,IAAI,aAAa,CAOzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAOtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAOtF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAOnE"}
@@ -0,0 +1,32 @@
1
+ export function createSolvedPyraminxState() {
2
+ return {
3
+ centers: [0, 0, 0, 0],
4
+ edgesPerm: [0, 1, 2, 3, 4, 5],
5
+ edgesOrient: [0, 0, 0, 0, 0, 0],
6
+ tips: [0, 0, 0, 0]
7
+ };
8
+ }
9
+ export function clonePyraminxState(state) {
10
+ return {
11
+ centers: [...state.centers],
12
+ edgesPerm: [...state.edgesPerm],
13
+ edgesOrient: [...state.edgesOrient],
14
+ tips: [...state.tips]
15
+ };
16
+ }
17
+ export function pyraminxStatesEqual(left, right) {
18
+ return (arraysEqual(left.centers, right.centers) &&
19
+ arraysEqual(left.edgesPerm, right.edgesPerm) &&
20
+ arraysEqual(left.edgesOrient, right.edgesOrient) &&
21
+ arraysEqual(left.tips, right.tips));
22
+ }
23
+ export function isSolvedPyraminxState(state) {
24
+ return (state.centers.every(c => c === 0) &&
25
+ state.edgesPerm.every((e, idx) => e === idx) &&
26
+ state.edgesOrient.every(o => o === 0)
27
+ // tips don't have to be 0 for the core to be solved in the state-matching, but for full solved they do
28
+ );
29
+ }
30
+ function arraysEqual(left, right) {
31
+ return left.length === right.length && left.every((value, index) => value === right[index]);
32
+ }
@@ -0,0 +1,17 @@
1
+ export type PyraminxFaceMove = "U" | "L" | "R" | "B";
2
+ export type PyraminxTipMove = "u" | "l" | "r" | "b";
3
+ export type PyraminxMoveSuffix = "" | "'";
4
+ export type PyraminxMove = `${PyraminxFaceMove}${PyraminxMoveSuffix}` | `${PyraminxTipMove}${PyraminxMoveSuffix}`;
5
+ export interface PyraminxState {
6
+ centers: number[];
7
+ edgesPerm: number[];
8
+ edgesOrient: number[];
9
+ tips: number[];
10
+ }
11
+ export interface PyraminxRandomStateOptions {
12
+ seed?: string | number;
13
+ rejectTrivial?: boolean;
14
+ }
15
+ export declare const PYRAMINX_CORE_MOVES: readonly PyraminxMove[];
16
+ export declare const PYRAMINX_TIPS: readonly PyraminxTipMove[];
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,EAAE,GAAG,GAAG,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,GAAG,gBAAgB,GAAG,kBAAkB,EAAE,GAAG,GAAG,eAAe,GAAG,kBAAkB,EAAE,CAAC;AAElH,MAAM,WAAW,aAAa;IAE5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAKtD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,SAAS,eAAe,EAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const PYRAMINX_CORE_MOVES = [
2
+ "U", "U'",
3
+ "L", "L'",
4
+ "R", "R'",
5
+ "B", "B'"
6
+ ];
7
+ export const PYRAMINX_TIPS = ["u", "l", "r", "b"];
@@ -0,0 +1,8 @@
1
+ import type { PyraminxState } from "./types.js";
2
+ export declare function validatePyraminxState(state: PyraminxState): {
3
+ valid: boolean;
4
+ errors: string[];
5
+ };
6
+ export declare function permutationParity(permutation: readonly number[]): number;
7
+ export declare function isAllowedRandomPyraminxState(state: PyraminxState): boolean;
8
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAiEhG;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAUxE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,79 @@
1
+ import { isSolvedPyraminxState } from "./state.js";
2
+ export function validatePyraminxState(state) {
3
+ const errors = [];
4
+ // 1. Centers validation
5
+ if (state.centers.length !== 4) {
6
+ errors.push("Centers must contain 4 values.");
7
+ }
8
+ else {
9
+ for (const val of state.centers) {
10
+ if (val < 0 || val > 2 || !Number.isInteger(val)) {
11
+ errors.push(`Center orientation out of range: ${val}`);
12
+ }
13
+ }
14
+ }
15
+ // 2. Tips validation
16
+ if (state.tips.length !== 4) {
17
+ errors.push("Tips must contain 4 values.");
18
+ }
19
+ else {
20
+ for (const val of state.tips) {
21
+ if (val < 0 || val > 2 || !Number.isInteger(val)) {
22
+ errors.push(`Tip orientation out of range: ${val}`);
23
+ }
24
+ }
25
+ }
26
+ // 3. Edges Permutation validation
27
+ if (state.edgesPerm.length !== 6) {
28
+ errors.push("Edges permutation must contain 6 values.");
29
+ }
30
+ else {
31
+ const seen = new Set();
32
+ for (const val of state.edgesPerm) {
33
+ if (val < 0 || val > 5 || !Number.isInteger(val) || seen.has(val)) {
34
+ errors.push(`Invalid edge permutation value: ${val}`);
35
+ }
36
+ seen.add(val);
37
+ }
38
+ }
39
+ // 4. Edges Orientation validation
40
+ if (state.edgesOrient.length !== 6) {
41
+ errors.push("Edges orientation must contain 6 values.");
42
+ }
43
+ else {
44
+ let sumOrient = 0;
45
+ for (const val of state.edgesOrient) {
46
+ if (val < 0 || val > 1 || !Number.isInteger(val)) {
47
+ errors.push(`Edge orientation out of range: ${val}`);
48
+ }
49
+ sumOrient += val;
50
+ }
51
+ if (sumOrient % 2 !== 0) {
52
+ errors.push("Edge orientation sum must be even.");
53
+ }
54
+ }
55
+ // 5. Permutation parity validation
56
+ if (errors.length === 0) {
57
+ if (permutationParity(state.edgesPerm) !== 0) {
58
+ errors.push("Edge permutation parity must be even.");
59
+ }
60
+ }
61
+ return {
62
+ valid: errors.length === 0,
63
+ errors
64
+ };
65
+ }
66
+ export function permutationParity(permutation) {
67
+ let inversions = 0;
68
+ for (let left = 0; left < permutation.length; left += 1) {
69
+ for (let right = left + 1; right < permutation.length; right += 1) {
70
+ if (permutation[left] > permutation[right]) {
71
+ inversions += 1;
72
+ }
73
+ }
74
+ }
75
+ return inversions % 2;
76
+ }
77
+ export function isAllowedRandomPyraminxState(state) {
78
+ return validatePyraminxState(state).valid && !isSolvedPyraminxState(state);
79
+ }
@@ -0,0 +1,3 @@
1
+ export { createRandomSource } from "./prng.js";
2
+ export type { RandomSource } from "./prng.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/random/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export { createRandomSource } from "./prng.js";
@@ -0,0 +1,7 @@
1
+ export interface RandomSource {
2
+ next(): number;
3
+ nextInt(maxExclusive: number): number;
4
+ choice<T>(items: readonly T[]): T;
5
+ }
6
+ export declare function createRandomSource(seed?: string | number): RandomSource;
7
+ //# sourceMappingURL=prng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../../src/random/prng.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,MAAM,CAAC;IACf,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAMvE"}
@@ -0,0 +1,60 @@
1
+ import { randomBytes } from "node:crypto";
2
+ export function createRandomSource(seed) {
3
+ if (seed === undefined) {
4
+ return new CryptoRandomSource();
5
+ }
6
+ return new SeededRandomSource(hashSeed(seed));
7
+ }
8
+ class CryptoRandomSource {
9
+ next() {
10
+ const value = randomBytes(6).readUIntBE(0, 6);
11
+ return value / 0x1000000000000;
12
+ }
13
+ nextInt(maxExclusive) {
14
+ validateMax(maxExclusive);
15
+ return Math.floor(this.next() * maxExclusive);
16
+ }
17
+ choice(items) {
18
+ if (items.length === 0) {
19
+ throw new RangeError("Cannot choose from an empty collection.");
20
+ }
21
+ return items[this.nextInt(items.length)];
22
+ }
23
+ }
24
+ class SeededRandomSource {
25
+ state;
26
+ constructor(seed) {
27
+ this.state = seed >>> 0;
28
+ }
29
+ next() {
30
+ this.state += 0x6d2b79f5;
31
+ let value = this.state;
32
+ value = Math.imul(value ^ (value >>> 15), value | 1);
33
+ value ^= value + Math.imul(value ^ (value >>> 7), value | 61);
34
+ return ((value ^ (value >>> 14)) >>> 0) / 0x100000000;
35
+ }
36
+ nextInt(maxExclusive) {
37
+ validateMax(maxExclusive);
38
+ return Math.floor(this.next() * maxExclusive);
39
+ }
40
+ choice(items) {
41
+ if (items.length === 0) {
42
+ throw new RangeError("Cannot choose from an empty collection.");
43
+ }
44
+ return items[this.nextInt(items.length)];
45
+ }
46
+ }
47
+ function validateMax(maxExclusive) {
48
+ if (!Number.isInteger(maxExclusive) || maxExclusive < 1) {
49
+ throw new RangeError(`maxExclusive must be a positive integer. Received: ${maxExclusive}`);
50
+ }
51
+ }
52
+ function hashSeed(seed) {
53
+ const text = String(seed);
54
+ let hash = 0x811c9dc5;
55
+ for (let index = 0; index < text.length; index += 1) {
56
+ hash ^= text.charCodeAt(index);
57
+ hash = Math.imul(hash, 0x01000193);
58
+ }
59
+ return hash >>> 0;
60
+ }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const run_js_1 = require("./run.js");
5
+ async function main() {
6
+ const result = await (0, run_js_1.runCli)(process.argv.slice(2), {
7
+ stdout: (text) => process.stdout.write(text),
8
+ stderr: (text) => process.stderr.write(text)
9
+ });
10
+ process.exitCode = result.exitCode;
11
+ }
12
+ main();
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCli = runCli;
4
+ const index_js_1 = require("../index.js");
5
+ async function runCli(argv, io) {
6
+ try {
7
+ await run(parseArgs(argv), io);
8
+ return { exitCode: 0 };
9
+ }
10
+ catch (error) {
11
+ const message = error instanceof Error ? error.message : String(error);
12
+ io.stderr(`${message}\n`);
13
+ return { exitCode: error instanceof index_js_1.ScramblerError ? 2 : 1 };
14
+ }
15
+ }
16
+ async function run(cliArgs, io) {
17
+ if (cliArgs.help || !cliArgs.command) {
18
+ printHelp(io);
19
+ return;
20
+ }
21
+ if (cliArgs.command === "list") {
22
+ printEvents(io);
23
+ return;
24
+ }
25
+ const scrambles = await (0, index_js_1.generateScrambles)(cliArgs.command, cliArgs.count, {
26
+ ...(cliArgs.seed === undefined ? {} : { seed: cliArgs.seed })
27
+ });
28
+ if (cliArgs.json) {
29
+ printJson(scrambles, io);
30
+ return;
31
+ }
32
+ for (const result of scrambles) {
33
+ io.stdout(`${result.scramble}\n`);
34
+ }
35
+ }
36
+ function printJson(scrambles, io) {
37
+ const serialized = scrambles.map(serializeScramble);
38
+ const output = serialized.length === 1 ? serialized[0] : serialized;
39
+ io.stdout(`${JSON.stringify(output, null, 2)}\n`);
40
+ }
41
+ function serializeScramble(result) {
42
+ const metadata = result.metadata ?? {};
43
+ const serialized = {
44
+ eventId: result.eventId,
45
+ scramble: result.scramble,
46
+ moves: result.moves,
47
+ quality: result.quality,
48
+ generator: result.generator
49
+ };
50
+ if (result.seed !== undefined) {
51
+ serialized.seed = result.seed;
52
+ }
53
+ if ("facelets" in metadata) {
54
+ serialized.facelets = metadata.facelets;
55
+ }
56
+ if ("faceletString" in metadata) {
57
+ serialized.faceletString = metadata.faceletString;
58
+ }
59
+ return serialized;
60
+ }
61
+ function printEvents(io) {
62
+ const events = (0, index_js_1.getSupportedEvents)();
63
+ if (events.length === 0) {
64
+ io.stdout("No scramble events are registered yet.\n");
65
+ return;
66
+ }
67
+ for (const event of events) {
68
+ io.stdout(`${event.eventId}\t${event.name}\t${event.quality}\n`);
69
+ }
70
+ }
71
+ function printHelp(io) {
72
+ io.stdout(`Usage:
73
+ cubingcenter-scrambler --help
74
+ cubingcenter-scrambler list
75
+ cubingcenter-scrambler <eventId> [--count N] [--seed value] [--json]
76
+
77
+ Options:
78
+ --count, -c Number of scrambles to generate. Defaults to 1.
79
+ --seed, -s Seed value for reproducible generation when supported.
80
+ --json Print structured JSON with metadata when available.
81
+ --help, -h Show this help message.
82
+ `);
83
+ }
84
+ function parseArgs(argv) {
85
+ const parsed = {
86
+ count: 1,
87
+ help: false,
88
+ json: false
89
+ };
90
+ for (let index = 0; index < argv.length; index += 1) {
91
+ const value = argv[index];
92
+ if (value === undefined) {
93
+ continue;
94
+ }
95
+ if (value === "--help" || value === "-h") {
96
+ parsed.help = true;
97
+ continue;
98
+ }
99
+ if (value === "--json") {
100
+ parsed.json = true;
101
+ continue;
102
+ }
103
+ if (value === "--count" || value === "-c") {
104
+ parsed.count = parsePositiveInteger(readValue(argv, index, value));
105
+ index += 1;
106
+ continue;
107
+ }
108
+ if (value === "--seed" || value === "-s") {
109
+ parsed.seed = readValue(argv, index, value);
110
+ index += 1;
111
+ continue;
112
+ }
113
+ if (value.startsWith("--count=")) {
114
+ parsed.count = parsePositiveInteger(value.slice("--count=".length));
115
+ continue;
116
+ }
117
+ if (value.startsWith("--seed=")) {
118
+ parsed.seed = value.slice("--seed=".length);
119
+ continue;
120
+ }
121
+ if (!parsed.command) {
122
+ parsed.command = value;
123
+ continue;
124
+ }
125
+ throw new Error(`Unexpected argument: ${value}`);
126
+ }
127
+ return parsed;
128
+ }
129
+ function readValue(argv, index, flag) {
130
+ const value = argv[index + 1];
131
+ if (!value || value.startsWith("-")) {
132
+ throw new Error(`Missing value for ${flag}`);
133
+ }
134
+ return value;
135
+ }
136
+ function parsePositiveInteger(value) {
137
+ const count = Number(value);
138
+ if (!Number.isInteger(count) || count < 1) {
139
+ throw new Error(`Count must be a positive integer. Received: ${value}`);
140
+ }
141
+ return count;
142
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initializeScrambler = initializeScrambler;
4
+ exports.registerScrambleGenerator = registerScrambleGenerator;
5
+ exports.getSupportedEvents = getSupportedEvents;
6
+ exports.getEventInfo = getEventInfo;
7
+ exports.generateScramble = generateScramble;
8
+ exports.generateScrambles = generateScrambles;
9
+ const errors_js_1 = require("./errors.js");
10
+ const registry_js_1 = require("./registry.js");
11
+ const browser_loader_js_1 = require("../puzzles/cube2/solver/browser-loader.js");
12
+ const browser_loader_js_2 = require("../puzzles/cube3/solver/browser-loader.js");
13
+ /**
14
+ * Pre-load solver tables in browser environments.
15
+ * In Node.js this is a no-op (tables are read lazily from the filesystem).
16
+ *
17
+ * @param baseUrl - Base URL where the `puzzles/cube3/solver/generated/`
18
+ * assets are served. If omitted, defaults to the current document base URL
19
+ * or `"."`. In a Next.js app you typically copy the `.bin` files to
20
+ * `public/scrambler-tables/` and pass `"/scrambler-tables"`.
21
+ * @param eventId - Optional event ID to selectively load tables. If omitted,
22
+ * loads all standard tables.
23
+ */
24
+ async function initializeScrambler(baseUrl, eventId) {
25
+ if (typeof self === "undefined") {
26
+ // Node.js — tables are loaded on-demand from the filesystem
27
+ return;
28
+ }
29
+ if (eventId === "222" || eventId === "222so") {
30
+ await (0, browser_loader_js_1.loadBrowserTables)(baseUrl);
31
+ }
32
+ else if (eventId === "333") {
33
+ await (0, browser_loader_js_2.loadBrowserTables)(baseUrl);
34
+ }
35
+ else if (!eventId) {
36
+ await Promise.all([
37
+ (0, browser_loader_js_1.loadBrowserTables)(baseUrl),
38
+ (0, browser_loader_js_2.loadBrowserTables)(baseUrl)
39
+ ]);
40
+ }
41
+ }
42
+ function registerScrambleGenerator(generator, registry = registry_js_1.defaultRegistry) {
43
+ registry.register(generator);
44
+ }
45
+ function getSupportedEvents(registry = registry_js_1.defaultRegistry) {
46
+ return registry.list();
47
+ }
48
+ function getEventInfo(eventId, registry = registry_js_1.defaultRegistry) {
49
+ const generator = registry.get(eventId);
50
+ if (!generator) {
51
+ throw new errors_js_1.UnsupportedEventError(eventId);
52
+ }
53
+ return { ...generator.info };
54
+ }
55
+ async function generateScramble(eventId, options = {}, registry = registry_js_1.defaultRegistry) {
56
+ const generator = registry.get(eventId);
57
+ if (!generator) {
58
+ throw new errors_js_1.UnsupportedEventError(eventId);
59
+ }
60
+ try {
61
+ const result = await generator.generate(options);
62
+ return normalizeResult(eventId, result, options);
63
+ }
64
+ catch (error) {
65
+ if (error instanceof Error && error.name.endsWith("Error")) {
66
+ throw error;
67
+ }
68
+ throw new errors_js_1.GeneratorFailedError(eventId, error);
69
+ }
70
+ }
71
+ async function generateScrambles(eventId, count, options = {}, registry = registry_js_1.defaultRegistry) {
72
+ if (!Number.isInteger(count) || count < 1) {
73
+ throw new errors_js_1.InvalidCountError(count);
74
+ }
75
+ return Promise.all(Array.from({ length: count }, (_, index) => (generateScramble(eventId, deriveBatchScrambleOptions(options, index, count), registry))));
76
+ }
77
+ function deriveBatchScrambleOptions(options, index, count) {
78
+ if (count === 1 || options.seed === undefined) {
79
+ return options;
80
+ }
81
+ return {
82
+ ...options,
83
+ seed: `${options.seed}:${index}`
84
+ };
85
+ }
86
+ function normalizeResult(requestedEventId, result, options) {
87
+ const moves = result.moves.length > 0 ? result.moves : splitMoves(result.scramble);
88
+ const seed = result.seed ?? options.seed;
89
+ const normalized = {
90
+ ...result,
91
+ eventId: result.eventId || requestedEventId,
92
+ moves
93
+ };
94
+ if (seed !== undefined) {
95
+ normalized.seed = seed;
96
+ }
97
+ return normalized;
98
+ }
99
+ function splitMoves(scramble) {
100
+ const trimmed = scramble.trim();
101
+ return trimmed.length === 0 ? [] : trimmed.split(/\s+/);
102
+ }