@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,93 @@
1
+ import { createRandomSource } from "../../random/index.js";
2
+ import { CUBE7_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
3
+ export const cube7ScrambleGenerator = {
4
+ info: {
5
+ eventId: "777",
6
+ name: "7x7x7 Cube",
7
+ puzzle: "cube-7x7",
8
+ quality: "random-move",
9
+ generator: "cube7-random-move",
10
+ description: "Random-move 7x7 scramble with 100 moves."
11
+ },
12
+ generate(options = {}) {
13
+ return generateCube7Scramble(options);
14
+ }
15
+ };
16
+ export function generateCube7Scramble(options = {}) {
17
+ const random = createRandomSource(options.seed);
18
+ const moves = [];
19
+ for (let i = 0; i < SCRAMBLE_LENGTH; i++) {
20
+ let move;
21
+ do {
22
+ move = random.choice(CUBE7_ALL_MOVES);
23
+ } while (isRedundant(moves, move));
24
+ moves.push(move);
25
+ }
26
+ const scramble = moves.join(" ");
27
+ const result = {
28
+ eventId: "777",
29
+ scramble,
30
+ moves,
31
+ quality: "random-move",
32
+ generator: "cube7-random-move",
33
+ metadata: {
34
+ totalMoves: moves.length,
35
+ distribution: "random-move-wca-format"
36
+ }
37
+ };
38
+ if (options.seed !== undefined) {
39
+ result.seed = options.seed;
40
+ }
41
+ return result;
42
+ }
43
+ const MAX_AXIS_BLOCK = 4;
44
+ function getBaseMove(move) {
45
+ if (move.endsWith("2") || move.endsWith("'")) {
46
+ return move.slice(0, -1);
47
+ }
48
+ return move;
49
+ }
50
+ function getAxis(base) {
51
+ if (base.includes("R") || base.includes("L"))
52
+ return "X";
53
+ if (base.includes("U") || base.includes("D"))
54
+ return "Y";
55
+ if (base.includes("F") || base.includes("B"))
56
+ return "Z";
57
+ return "";
58
+ }
59
+ function isRedundant(moves, newMove) {
60
+ if (moves.length === 0)
61
+ return false;
62
+ const newBase = getBaseMove(newMove);
63
+ const newAxis = getAxis(newBase);
64
+ const lastBase = getBaseMove(moves[moves.length - 1]);
65
+ // No same base move consecutively
66
+ if (lastBase === newBase)
67
+ return true;
68
+ const lastAxis = getAxis(lastBase);
69
+ // Different axis: always allowed
70
+ if (newAxis !== lastAxis)
71
+ return false;
72
+ // Same axis: scan the current block
73
+ const basesInBlock = new Set();
74
+ basesInBlock.add(lastBase);
75
+ let blockLength = 1;
76
+ for (let i = moves.length - 2; i >= 0; i--) {
77
+ const base = getBaseMove(moves[i]);
78
+ if (getAxis(base) === newAxis) {
79
+ basesInBlock.add(base);
80
+ blockLength++;
81
+ }
82
+ else {
83
+ break;
84
+ }
85
+ }
86
+ // No same base within the block
87
+ if (basesInBlock.has(newBase))
88
+ return true;
89
+ // Max block length
90
+ if (blockLength >= MAX_AXIS_BLOCK)
91
+ return true;
92
+ return false;
93
+ }
@@ -0,0 +1,4 @@
1
+ export type Cube7Move = "U" | "U2" | "U'" | "D" | "D2" | "D'" | "R" | "R2" | "R'" | "L" | "L2" | "L'" | "F" | "F2" | "F'" | "B" | "B2" | "B'" | "Uw" | "Uw2" | "Uw'" | "Dw" | "Dw2" | "Dw'" | "Rw" | "Rw2" | "Rw'" | "Lw" | "Lw2" | "Lw'" | "Fw" | "Fw2" | "Fw'" | "Bw" | "Bw2" | "Bw'" | "3Uw" | "3Uw2" | "3Uw'" | "3Dw" | "3Dw2" | "3Dw'" | "3Rw" | "3Rw2" | "3Rw'" | "3Lw" | "3Lw2" | "3Lw'" | "3Fw" | "3Fw2" | "3Fw'" | "3Bw" | "3Bw2" | "3Bw'";
2
+ export declare const CUBE7_ALL_MOVES: readonly Cube7Move[];
3
+ export declare const SCRAMBLE_LENGTH = 100;
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube7x7/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAS5B,eAAO,MAAM,eAAe,EAAE,SAAS,SAAS,EAE/C,CAAC;AAEF,eAAO,MAAM,eAAe,MAAM,CAAC"}
@@ -0,0 +1,8 @@
1
+ const BASE_MOVES = [
2
+ "U", "D", "R", "L", "F", "B",
3
+ "Uw", "Dw", "Rw", "Lw", "Fw", "Bw",
4
+ "3Uw", "3Dw", "3Rw", "3Lw", "3Fw", "3Bw"
5
+ ];
6
+ const SUFFIXES = ["", "2", "'"];
7
+ export const CUBE7_ALL_MOVES = BASE_MOVES.flatMap((base) => SUFFIXES.map(suffix => `${base}${suffix}`));
8
+ export const SCRAMBLE_LENGTH = 100;
@@ -0,0 +1,10 @@
1
+ export * as cube2 from "./cube2/index.js";
2
+ export * as cube3 from "./cube3/index.js";
3
+ export * as cube4 from "./cube4/index.js";
4
+ export * as megaminx from "./megaminx/index.js";
5
+ export * as cube5x5 from "./cube5x5/index.js";
6
+ export * as cube6x6 from "./cube6x6/index.js";
7
+ export * as cube7x7 from "./cube7x7/index.js";
8
+ export * as pyraminx from "./pyraminx/index.js";
9
+ export * as clock from "./clock/index.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/puzzles/index.ts"],"names":[],"mappings":"AAqBA,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"}
@@ -0,0 +1,28 @@
1
+ import { registerScrambleGenerator } from "../core/index.js";
2
+ import { cube2ScrambleGenerator } from "./cube2/index.js";
3
+ import { cube3ScrambleGenerator } from "./cube3/index.js";
4
+ import { cube4ScrambleGenerator } from "./cube4/index.js";
5
+ import { megaminxScrambleGenerator } from "./megaminx/index.js";
6
+ import { cube5ScrambleGenerator } from "./cube5x5/index.js";
7
+ import { cube6ScrambleGenerator } from "./cube6x6/index.js";
8
+ import { cube7ScrambleGenerator } from "./cube7x7/index.js";
9
+ import { pyraminxScrambleGenerator } from "./pyraminx/index.js";
10
+ import { clockScrambleGenerator } from "./clock/index.js";
11
+ registerScrambleGenerator(cube2ScrambleGenerator);
12
+ registerScrambleGenerator(cube3ScrambleGenerator);
13
+ registerScrambleGenerator(cube4ScrambleGenerator);
14
+ registerScrambleGenerator(megaminxScrambleGenerator);
15
+ registerScrambleGenerator(cube5ScrambleGenerator);
16
+ registerScrambleGenerator(cube6ScrambleGenerator);
17
+ registerScrambleGenerator(cube7ScrambleGenerator);
18
+ registerScrambleGenerator(pyraminxScrambleGenerator);
19
+ registerScrambleGenerator(clockScrambleGenerator);
20
+ export * as cube2 from "./cube2/index.js";
21
+ export * as cube3 from "./cube3/index.js";
22
+ export * as cube4 from "./cube4/index.js";
23
+ export * as megaminx from "./megaminx/index.js";
24
+ export * as cube5x5 from "./cube5x5/index.js";
25
+ export * as cube6x6 from "./cube6x6/index.js";
26
+ export * as cube7x7 from "./cube7x7/index.js";
27
+ export * as pyraminx from "./pyraminx/index.js";
28
+ export * as clock from "./clock/index.js";
@@ -0,0 +1,4 @@
1
+ export type { MegaminxMove } from "./types.js";
2
+ export { MEGAMINX_R_MOVES, MEGAMINX_D_MOVES, SCRAMBLE_LINES, MOVES_PER_LINE } from "./types.js";
3
+ export { megaminxScrambleGenerator, generateMegaminxScramble } from "./scrambler.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MEGAMINX_R_MOVES, MEGAMINX_D_MOVES, SCRAMBLE_LINES, MOVES_PER_LINE } from "./types.js";
2
+ export { megaminxScrambleGenerator, generateMegaminxScramble } from "./scrambler.js";
@@ -0,0 +1,4 @@
1
+ import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
2
+ export declare const megaminxScrambleGenerator: ScrambleGenerator;
3
+ export declare function generateMegaminxScramble(options?: ScrambleOptions): ScrambleResult;
4
+ //# sourceMappingURL=scrambler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK9F,eAAO,MAAM,yBAAyB,EAAE,iBAYvC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAuCtF"}
@@ -0,0 +1,56 @@
1
+ import { createRandomSource } from "../../random/index.js";
2
+ import { MEGAMINX_R_MOVES, MEGAMINX_D_MOVES, SCRAMBLE_LINES, MOVES_PER_LINE } from "./types.js";
3
+ export const megaminxScrambleGenerator = {
4
+ info: {
5
+ eventId: "mega",
6
+ name: "Megaminx",
7
+ puzzle: "megaminx",
8
+ quality: "random-move",
9
+ generator: "megaminx-random-move",
10
+ description: "Random-move Megaminx scramble using WCA notation (7 lines of 10 moves + U/U')."
11
+ },
12
+ generate(options = {}) {
13
+ return generateMegaminxScramble(options);
14
+ }
15
+ };
16
+ export function generateMegaminxScramble(options = {}) {
17
+ const random = createRandomSource(options.seed);
18
+ const moves = [];
19
+ for (let line = 0; line < SCRAMBLE_LINES; line++) {
20
+ let lastD = "D++";
21
+ for (let pair = 0; pair < 5; pair++) {
22
+ const rMove = random.choice(MEGAMINX_R_MOVES);
23
+ const dMove = random.choice(MEGAMINX_D_MOVES);
24
+ moves.push(rMove, dMove);
25
+ lastD = dMove;
26
+ }
27
+ const uMove = lastD === "D++" ? "U" : "U'";
28
+ moves.push(uMove);
29
+ }
30
+ const scramble = formatMegaminxScramble(moves);
31
+ const result = {
32
+ eventId: "mega",
33
+ scramble,
34
+ moves,
35
+ quality: "random-move",
36
+ generator: "megaminx-random-move",
37
+ metadata: {
38
+ lines: SCRAMBLE_LINES,
39
+ movesPerLine: MOVES_PER_LINE,
40
+ totalMoves: moves.length,
41
+ distribution: "random-move-wca-format"
42
+ }
43
+ };
44
+ if (options.seed !== undefined) {
45
+ result.seed = options.seed;
46
+ }
47
+ return result;
48
+ }
49
+ function formatMegaminxScramble(moves) {
50
+ const lines = [];
51
+ for (let i = 0; i < SCRAMBLE_LINES; i++) {
52
+ const lineMoves = moves.slice(i * MOVES_PER_LINE, (i + 1) * MOVES_PER_LINE);
53
+ lines.push(lineMoves.join(" "));
54
+ }
55
+ return lines.join("\n");
56
+ }
@@ -0,0 +1,6 @@
1
+ export type MegaminxMove = "R++" | "R--" | "D++" | "D--" | "U" | "U'";
2
+ export declare const MEGAMINX_R_MOVES: readonly MegaminxMove[];
3
+ export declare const MEGAMINX_D_MOVES: readonly MegaminxMove[];
4
+ export declare const SCRAMBLE_LINES = 7;
5
+ export declare const MOVES_PER_LINE = 11;
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AAEtE,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAA4B,CAAC;AACjF,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAA4B,CAAC;AAEjF,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const MEGAMINX_R_MOVES = ["R++", "R--"];
2
+ export const MEGAMINX_D_MOVES = ["D++", "D--"];
3
+ export const SCRAMBLE_LINES = 7;
4
+ export const MOVES_PER_LINE = 11;
@@ -0,0 +1,9 @@
1
+ export { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
2
+ export type { PyraminxMove, PyraminxState, PyraminxFaceMove, PyraminxTipMove, PyraminxRandomStateOptions } from "./types.js";
3
+ export { applyPyraminxAlgorithm, applyPyraminxMove, formatPyraminxAlgorithm, invertPyraminxAlgorithm, invertPyraminxMove, parsePyraminxAlgorithm, parsePyraminxMove } from "./moves.js";
4
+ export { clonePyraminxState, createSolvedPyraminxState, pyraminxStatesEqual, isSolvedPyraminxState } from "./state.js";
5
+ export { permutationParity, validatePyraminxState, isAllowedRandomPyraminxState } from "./validation.js";
6
+ export { generateRandomPyraminxState } from "./random-state.js";
7
+ export { pyraminxScrambleGenerator, generatePyraminxScramble } from "./scrambler.js";
8
+ export { solvePyraminx } from "./solver.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACd,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
2
+ export { applyPyraminxAlgorithm, applyPyraminxMove, formatPyraminxAlgorithm, invertPyraminxAlgorithm, invertPyraminxMove, parsePyraminxAlgorithm, parsePyraminxMove } from "./moves.js";
3
+ export { clonePyraminxState, createSolvedPyraminxState, pyraminxStatesEqual, isSolvedPyraminxState } from "./state.js";
4
+ export { permutationParity, validatePyraminxState, isAllowedRandomPyraminxState } from "./validation.js";
5
+ export { generateRandomPyraminxState } from "./random-state.js";
6
+ export { pyraminxScrambleGenerator, generatePyraminxScramble } from "./scrambler.js";
7
+ export { solvePyraminx } from "./solver.js";
@@ -0,0 +1,9 @@
1
+ import type { PyraminxMove, PyraminxState } from "./types.js";
2
+ export declare function applyPyraminxMove(state: PyraminxState, move: PyraminxMove): PyraminxState;
3
+ export declare function applyPyraminxAlgorithm(state: PyraminxState, moves: readonly PyraminxMove[]): PyraminxState;
4
+ export declare function invertPyraminxAlgorithm(moves: readonly PyraminxMove[]): PyraminxMove[];
5
+ export declare function parsePyraminxAlgorithm(algorithm: string): PyraminxMove[];
6
+ export declare function formatPyraminxAlgorithm(moves: readonly PyraminxMove[]): string;
7
+ export declare function parsePyraminxMove(value: string): PyraminxMove;
8
+ export declare function invertPyraminxMove(move: PyraminxMove): PyraminxMove;
9
+ //# sourceMappingURL=moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/moves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAKjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,aAAa,CA4BzF;AA8DD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,aAAa,CAE1G;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAEtF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAU7D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAKnE"}
@@ -0,0 +1,117 @@
1
+ import { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
2
+ import { clonePyraminxState } from "./state.js";
3
+ // Mathematical representation of Pyraminx moves
4
+ export function applyPyraminxMove(state, move) {
5
+ const isInverse = move.endsWith("'");
6
+ const baseMove = move.replace("'", "");
7
+ const isTip = baseMove === baseMove.toLowerCase();
8
+ const next = clonePyraminxState(state);
9
+ if (isTip) {
10
+ const tipIndex = PYRAMINX_TIPS.indexOf(baseMove);
11
+ if (tipIndex !== -1) {
12
+ if (isInverse) {
13
+ next.tips[tipIndex] = (next.tips[tipIndex] + 2) % 3;
14
+ }
15
+ else {
16
+ next.tips[tipIndex] = (next.tips[tipIndex] + 1) % 3;
17
+ }
18
+ }
19
+ return next;
20
+ }
21
+ // Otherwise, it is a core layer move
22
+ const face = baseMove;
23
+ const turns = isInverse ? 2 : 1; // CW is 1, CCW is 2 turns CW
24
+ for (let step = 0; step < turns; step++) {
25
+ applySingleCoreMoveCW(next, face);
26
+ }
27
+ return next;
28
+ }
29
+ function applySingleCoreMoveCW(state, face) {
30
+ const centers = state.centers;
31
+ const perm = state.edgesPerm;
32
+ const orient = state.edgesOrient;
33
+ // Clone arrays for temporary storage
34
+ const prevPerm = [...perm];
35
+ const prevOrient = [...orient];
36
+ if (face === "U") {
37
+ // Center
38
+ centers[0] = (centers[0] + 1) % 3;
39
+ // Edges cycle: 0 -> 1 -> 2 -> 0 (UL -> UR -> UB -> UL)
40
+ // No orientation flips for U
41
+ perm[1] = prevPerm[0];
42
+ perm[2] = prevPerm[1];
43
+ perm[0] = prevPerm[2];
44
+ orient[1] = prevOrient[0];
45
+ orient[2] = prevOrient[1];
46
+ orient[0] = prevOrient[2];
47
+ }
48
+ else if (face === "L") {
49
+ // Center
50
+ centers[1] = (centers[1] + 1) % 3;
51
+ // Edges cycle: 0 -> 4 -> 3 -> 0 (UL -> LB -> LR -> UL)
52
+ // Flips: UL(0) flips, LB(4) flips, LR(3) does not flip
53
+ perm[4] = prevPerm[0];
54
+ perm[3] = prevPerm[4];
55
+ perm[0] = prevPerm[3];
56
+ orient[4] = (prevOrient[0] + 1) % 2;
57
+ orient[3] = (prevOrient[4] + 1) % 2;
58
+ orient[0] = prevOrient[3];
59
+ }
60
+ else if (face === "R") {
61
+ // Center
62
+ centers[2] = (centers[2] + 1) % 3;
63
+ // Edges cycle: 1 -> 3 -> 5 -> 1 (UR -> LR -> RB -> UR)
64
+ // Flips: UR(1) flips, LR(3) flips, RB(5) does not flip
65
+ perm[3] = prevPerm[1];
66
+ perm[5] = prevPerm[3];
67
+ perm[1] = prevPerm[5];
68
+ orient[3] = (prevOrient[1] + 1) % 2;
69
+ orient[5] = (prevOrient[3] + 1) % 2;
70
+ orient[1] = prevOrient[5];
71
+ }
72
+ else if (face === "B") {
73
+ // Center
74
+ centers[3] = (centers[3] + 1) % 3;
75
+ // Edges cycle: 2 -> 5 -> 4 -> 2 (UB -> RB -> LB -> UB)
76
+ // Flips: UB(2) flips, RB(5) flips, LB(4) does not flip
77
+ perm[5] = prevPerm[2];
78
+ perm[4] = prevPerm[5];
79
+ perm[2] = prevPerm[4];
80
+ orient[5] = (prevOrient[2] + 1) % 2;
81
+ orient[4] = (prevOrient[5] + 1) % 2;
82
+ orient[2] = prevOrient[4];
83
+ }
84
+ }
85
+ export function applyPyraminxAlgorithm(state, moves) {
86
+ return moves.reduce((current, move) => applyPyraminxMove(current, move), state);
87
+ }
88
+ export function invertPyraminxAlgorithm(moves) {
89
+ return [...moves].reverse().map(invertPyraminxMove);
90
+ }
91
+ export function parsePyraminxAlgorithm(algorithm) {
92
+ const trimmed = algorithm.trim();
93
+ if (trimmed.length === 0) {
94
+ return [];
95
+ }
96
+ return trimmed.split(/\s+/).map(parsePyraminxMove);
97
+ }
98
+ export function formatPyraminxAlgorithm(moves) {
99
+ return moves.join(" ");
100
+ }
101
+ export function parsePyraminxMove(value) {
102
+ const baseMove = value.replace("'", "");
103
+ const isInverse = value.endsWith("'") || value.endsWith(""); // wait, standard validation
104
+ if (PYRAMINX_CORE_MOVES.includes(value) || PYRAMINX_TIPS.map(t => `${t}'`).includes(value) || PYRAMINX_TIPS.includes(value)) {
105
+ return value;
106
+ }
107
+ if (PYRAMINX_CORE_MOVES.map(m => `${m}'`).includes(value)) {
108
+ return value;
109
+ }
110
+ throw new Error(`Invalid Pyraminx move: ${value}`);
111
+ }
112
+ export function invertPyraminxMove(move) {
113
+ if (move.endsWith("'")) {
114
+ return move.slice(0, -1);
115
+ }
116
+ return `${move}'`;
117
+ }
@@ -0,0 +1,3 @@
1
+ import type { PyraminxRandomStateOptions, PyraminxState } from "./types.js";
2
+ export declare function generateRandomPyraminxState(options?: PyraminxRandomStateOptions): PyraminxState;
3
+ //# sourceMappingURL=random-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/random-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG5E,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAYnG"}
@@ -0,0 +1,53 @@
1
+ import { createRandomSource } from "../../random/index.js";
2
+ import { isAllowedRandomPyraminxState, permutationParity } from "./validation.js";
3
+ export function generateRandomPyraminxState(options = {}) {
4
+ const random = createRandomSource(options.seed);
5
+ const rejectTrivial = options.rejectTrivial ?? true;
6
+ for (let attempt = 0; attempt < 100; attempt += 1) {
7
+ const state = createLegalRandomState(random);
8
+ if (!rejectTrivial || isAllowedRandomPyraminxState(state)) {
9
+ return state;
10
+ }
11
+ }
12
+ throw new Error("Unable to generate a non-trivial random Pyraminx state.");
13
+ }
14
+ function createLegalRandomState(random) {
15
+ // 4 random centers
16
+ const centers = Array.from({ length: 4 }, () => random.nextInt(3));
17
+ // 4 random tips
18
+ const tips = Array.from({ length: 4 }, () => random.nextInt(3));
19
+ // 6 edges permutation
20
+ const edgesPerm = shuffledRange(6, random);
21
+ // Ensure even parity
22
+ if (permutationParity(edgesPerm) !== 0) {
23
+ // Swap the first two elements to flip parity
24
+ const temp = edgesPerm[0];
25
+ edgesPerm[0] = edgesPerm[1];
26
+ edgesPerm[1] = temp;
27
+ }
28
+ // 6 edges orientation (sum must be even)
29
+ const edgesOrient = Array(6).fill(0);
30
+ let sumOrient = 0;
31
+ for (let i = 0; i < 5; i++) {
32
+ const val = random.nextInt(2);
33
+ edgesOrient[i] = val;
34
+ sumOrient += val;
35
+ }
36
+ edgesOrient[5] = sumOrient % 2 === 0 ? 0 : 1;
37
+ return {
38
+ centers,
39
+ edgesPerm,
40
+ edgesOrient,
41
+ tips
42
+ };
43
+ }
44
+ function shuffledRange(length, random) {
45
+ const values = Array.from({ length }, (_, index) => index);
46
+ for (let index = values.length - 1; index > 0; index -= 1) {
47
+ const swapIndex = random.nextInt(index + 1);
48
+ const temporary = values[index];
49
+ values[index] = values[swapIndex];
50
+ values[swapIndex] = temporary;
51
+ }
52
+ return values;
53
+ }
@@ -0,0 +1,6 @@
1
+ import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
2
+ export declare const pyraminxScrambleGenerator: ScrambleGenerator;
3
+ export declare function generatePyraminxScramble(options?: ScrambleOptions & {
4
+ skipValidation?: boolean;
5
+ }): Promise<ScrambleResult>;
6
+ //# sourceMappingURL=scrambler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO9F,eAAO,MAAM,yBAAyB,EAAE,iBAYvC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
@@ -0,0 +1,56 @@
1
+ import { generateRandomPyraminxState } from "./random-state.js";
2
+ import { createSolvedPyraminxState } from "./state.js";
3
+ import { applyPyraminxAlgorithm, invertPyraminxAlgorithm } from "./moves.js";
4
+ import { solvePyraminx } from "./solver.js";
5
+ export const pyraminxScrambleGenerator = {
6
+ info: {
7
+ eventId: "pyrso",
8
+ name: "Pyraminx",
9
+ puzzle: "pyraminx",
10
+ quality: "random-state",
11
+ generator: "pyraminx-ida-star",
12
+ description: "Random-state Pyraminx scramble generated by an optimal bidirectional BFS solver."
13
+ },
14
+ generate(options = {}) {
15
+ return generatePyraminxScramble(options);
16
+ }
17
+ };
18
+ export async function generatePyraminxScramble(options = {}) {
19
+ const state = generateRandomPyraminxState(options);
20
+ // Solve the core edges and centers
21
+ const solution = solvePyraminx(state);
22
+ const scrambleMoves = invertPyraminxAlgorithm(solution);
23
+ // Append tips to scrambleMoves
24
+ const finalMoves = [...scrambleMoves];
25
+ const tipsNotation = ["u", "l", "r", "b"];
26
+ for (let i = 0; i < 4; i++) {
27
+ const tipVal = state.tips[i];
28
+ if (tipVal === 1) {
29
+ finalMoves.push(tipsNotation[i]);
30
+ }
31
+ else if (tipVal === 2) {
32
+ finalMoves.push(`${tipsNotation[i]}'`);
33
+ }
34
+ }
35
+ if (!options.skipValidation) {
36
+ const scrambledState = applyPyraminxAlgorithm(createSolvedPyraminxState(), finalMoves);
37
+ if (scrambledState.edgesPerm.toString() !== state.edgesPerm.toString() ||
38
+ scrambledState.edgesOrient.toString() !== state.edgesOrient.toString() ||
39
+ scrambledState.centers.toString() !== state.centers.toString() ||
40
+ scrambledState.tips.toString() !== state.tips.toString()) {
41
+ throw new Error("Generated Pyraminx scramble does not reproduce the target random state.");
42
+ }
43
+ }
44
+ return {
45
+ eventId: "pyrso",
46
+ scramble: finalMoves.join(" "),
47
+ moves: finalMoves,
48
+ quality: "random-state",
49
+ generator: "pyraminx-ida-star",
50
+ metadata: {
51
+ state,
52
+ solutionMoves: solution,
53
+ solutionDepth: solution.length
54
+ }
55
+ };
56
+ }
@@ -0,0 +1,10 @@
1
+ import type { PyraminxState, PyraminxMove } from "./types.js";
2
+ export declare function getPermutationIndex(perm: readonly number[]): number;
3
+ export declare function getPermutationFromIndex(index: number, n: number): number[];
4
+ export declare function getOrientationIndex(orient: readonly number[]): number;
5
+ export declare function getOrientationFromIndex(index: number): number[];
6
+ export declare function getCentersIndex(centers: readonly number[]): number;
7
+ export declare function getCentersFromIndex(index: number): number[];
8
+ export declare function getStateIndex(state: PyraminxState): number;
9
+ export declare function solvePyraminx(state: PyraminxState): PyraminxMove[];
10
+ //# sourceMappingURL=solver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/solver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAWnE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAY1E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMrE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAY/D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAM1D;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,EAAE,CA8DlE"}