@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,89 @@
1
+ const FACE_ORDER = ["U", "R", "F", "D", "L", "B"];
2
+ const CORNER_PIECE_STICKERS = [
3
+ ["U", "R", "F"],
4
+ ["U", "F", "L"],
5
+ ["U", "L", "B"],
6
+ ["U", "B", "R"],
7
+ ["D", "F", "R"],
8
+ ["D", "L", "F"],
9
+ ["D", "B", "L"],
10
+ ["D", "R", "B"]
11
+ ];
12
+ const CORNER_POSITION_SLOTS = [
13
+ [["U", 8], ["R", 0], ["F", 2]],
14
+ [["U", 6], ["F", 0], ["L", 2]],
15
+ [["U", 0], ["L", 0], ["B", 2]],
16
+ [["U", 2], ["B", 0], ["R", 2]],
17
+ [["D", 2], ["F", 8], ["R", 6]],
18
+ [["D", 0], ["L", 8], ["F", 6]],
19
+ [["D", 6], ["B", 8], ["L", 6]],
20
+ [["D", 8], ["R", 8], ["B", 6]]
21
+ ];
22
+ const EDGE_PIECE_STICKERS = [
23
+ ["U", "R"],
24
+ ["U", "F"],
25
+ ["U", "L"],
26
+ ["U", "B"],
27
+ ["D", "R"],
28
+ ["D", "F"],
29
+ ["D", "L"],
30
+ ["D", "B"],
31
+ ["F", "R"],
32
+ ["F", "L"],
33
+ ["B", "L"],
34
+ ["B", "R"]
35
+ ];
36
+ const EDGE_POSITION_SLOTS = [
37
+ [["U", 5], ["R", 1]],
38
+ [["U", 7], ["F", 1]],
39
+ [["U", 3], ["L", 1]],
40
+ [["U", 1], ["B", 1]],
41
+ [["D", 5], ["R", 7]],
42
+ [["D", 1], ["F", 7]],
43
+ [["D", 3], ["L", 7]],
44
+ [["D", 7], ["B", 7]],
45
+ [["F", 5], ["R", 3]],
46
+ [["F", 3], ["L", 5]],
47
+ [["B", 5], ["L", 3]],
48
+ [["B", 3], ["R", 5]]
49
+ ];
50
+ export function toCube3Facelets(state) {
51
+ const facelets = createEmptyFacelets();
52
+ for (const face of FACE_ORDER) {
53
+ facelets[face][4] = face;
54
+ }
55
+ for (let position = 0; position < CORNER_POSITION_SLOTS.length; position += 1) {
56
+ const piece = state.corners.permutation[position];
57
+ const orientation = state.corners.orientation[position];
58
+ placeOrientedStickers(facelets, CORNER_POSITION_SLOTS[position], CORNER_PIECE_STICKERS[piece], orientation);
59
+ }
60
+ for (let position = 0; position < EDGE_POSITION_SLOTS.length; position += 1) {
61
+ const piece = state.edges.permutation[position];
62
+ const orientation = state.edges.orientation[position];
63
+ placeOrientedStickers(facelets, EDGE_POSITION_SLOTS[position], EDGE_PIECE_STICKERS[piece], orientation);
64
+ }
65
+ return facelets;
66
+ }
67
+ export function formatCube3Facelets(facelets) {
68
+ return FACE_ORDER.map((face) => facelets[face].join("")).join("");
69
+ }
70
+ export function getCube3FaceOrder() {
71
+ return FACE_ORDER;
72
+ }
73
+ function createEmptyFacelets() {
74
+ return {
75
+ U: Array(9).fill("U"),
76
+ R: Array(9).fill("R"),
77
+ F: Array(9).fill("F"),
78
+ D: Array(9).fill("D"),
79
+ L: Array(9).fill("L"),
80
+ B: Array(9).fill("B")
81
+ };
82
+ }
83
+ function placeOrientedStickers(facelets, slots, stickers, orientation) {
84
+ for (let index = 0; index < slots.length; index += 1) {
85
+ const [face, stickerIndex] = slots[index];
86
+ const sticker = stickers[(index - orientation + stickers.length) % stickers.length];
87
+ facelets[face][stickerIndex] = sticker;
88
+ }
89
+ }
@@ -0,0 +1,10 @@
1
+ export { CUBE3_MOVES, CORNER_COUNT, EDGE_COUNT } from "./types.js";
2
+ export { applyCube3Algorithm, applyCube3Move, formatCube3Algorithm, invertCube3Algorithm, invertCube3Move, parseCube3Algorithm, parseCube3Move } from "./moves.js";
3
+ export { cloneCube3State, createSolvedCube3State, cube3StatesEqual, isSolvedCube3State } from "./state.js";
4
+ export { isAllowedRandomCube3State, isOneMoveFromSolvedCube3State, permutationParity, validateCube3State } from "./validation.js";
5
+ export { generateRandomCube3State } from "./random-state.js";
6
+ export { cube3ScrambleGenerator, generateCube3Scramble } from "./scrambler.js";
7
+ export { formatCube3Facelets, getCube3FaceOrder, toCube3Facelets } from "./facelets.js";
8
+ export * as solver from "./solver/index.js";
9
+ export type { Cube3Face, Cube3Facelets, Cube3Move, Cube3FaceMove, Cube3MoveSuffix, Cube3RandomStateOptions, Cube3Sticker, Cube3State, Cube3ValidationResult } from "./types.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { CUBE3_MOVES, CORNER_COUNT, EDGE_COUNT } from "./types.js";
2
+ export { applyCube3Algorithm, applyCube3Move, formatCube3Algorithm, invertCube3Algorithm, invertCube3Move, parseCube3Algorithm, parseCube3Move } from "./moves.js";
3
+ export { cloneCube3State, createSolvedCube3State, cube3StatesEqual, isSolvedCube3State } from "./state.js";
4
+ export { isAllowedRandomCube3State, isOneMoveFromSolvedCube3State, permutationParity, validateCube3State } from "./validation.js";
5
+ export { generateRandomCube3State } from "./random-state.js";
6
+ export { cube3ScrambleGenerator, generateCube3Scramble } from "./scrambler.js";
7
+ export { formatCube3Facelets, getCube3FaceOrder, toCube3Facelets } from "./facelets.js";
8
+ export * as solver from "./solver/index.js";
@@ -0,0 +1,9 @@
1
+ import type { Cube3Move, Cube3State } from "./types.js";
2
+ export declare function applyCube3Move(state: Cube3State, move: Cube3Move): Cube3State;
3
+ export declare function applyCube3Algorithm(state: Cube3State, moves: readonly Cube3Move[]): Cube3State;
4
+ export declare function invertCube3Algorithm(moves: readonly Cube3Move[]): Cube3Move[];
5
+ export declare function parseCube3Algorithm(algorithm: string): Cube3Move[];
6
+ export declare function formatCube3Algorithm(moves: readonly Cube3Move[]): string;
7
+ export declare function parseCube3Move(value: string): Cube3Move;
8
+ export declare function invertCube3Move(move: Cube3Move): Cube3Move;
9
+ //# sourceMappingURL=moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/moves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,SAAS,EAAmB,UAAU,EAAE,MAAM,YAAY,CAAC;AAyCxF,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAS7E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAE9F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAE7E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAoFlE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAExE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAMvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAQ1D"}
@@ -0,0 +1,210 @@
1
+ import { CUBE3_MOVES } from "./types.js";
2
+ import { cloneCube3State } from "./state.js";
3
+ const FACE_MOVE_TABLES = {
4
+ U: {
5
+ corners: { permutation: [3, 0, 1, 2, 4, 5, 6, 7], orientation: [0, 0, 0, 0, 0, 0, 0, 0] },
6
+ edges: { permutation: [3, 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11], orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }
7
+ },
8
+ D: {
9
+ corners: { permutation: [0, 1, 2, 3, 5, 6, 7, 4], orientation: [0, 0, 0, 0, 0, 0, 0, 0] },
10
+ edges: { permutation: [0, 1, 2, 3, 5, 6, 7, 4, 8, 9, 10, 11], orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }
11
+ },
12
+ R: {
13
+ corners: { permutation: [4, 1, 2, 0, 7, 5, 6, 3], orientation: [2, 0, 0, 1, 1, 0, 0, 2] },
14
+ edges: { permutation: [8, 1, 2, 3, 11, 5, 6, 7, 4, 9, 10, 0], orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }
15
+ },
16
+ L: {
17
+ corners: { permutation: [0, 2, 6, 3, 4, 1, 5, 7], orientation: [0, 1, 2, 0, 0, 2, 1, 0] },
18
+ edges: { permutation: [0, 1, 10, 3, 4, 5, 9, 7, 8, 2, 6, 11], orientation: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }
19
+ },
20
+ F: {
21
+ corners: { permutation: [1, 5, 2, 3, 0, 4, 6, 7], orientation: [1, 2, 0, 0, 2, 1, 0, 0] },
22
+ edges: { permutation: [0, 9, 2, 3, 4, 8, 6, 7, 1, 5, 10, 11], orientation: [0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0] }
23
+ },
24
+ B: {
25
+ corners: { permutation: [0, 1, 3, 7, 4, 5, 2, 6], orientation: [0, 0, 1, 2, 0, 0, 2, 1] },
26
+ edges: { permutation: [0, 1, 2, 11, 4, 5, 6, 10, 8, 9, 3, 7], orientation: [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1] }
27
+ }
28
+ };
29
+ export function applyCube3Move(state, move) {
30
+ const { face, turns } = parseMoveParts(move);
31
+ let next = cloneCube3State(state);
32
+ for (let index = 0; index < turns; index += 1) {
33
+ next = applyFaceMove(next, FACE_MOVE_TABLES[face]);
34
+ }
35
+ return next;
36
+ }
37
+ export function applyCube3Algorithm(state, moves) {
38
+ return moves.reduce((current, move) => applyCube3Move(current, move), state);
39
+ }
40
+ export function invertCube3Algorithm(moves) {
41
+ return [...moves].reverse().map(invertCube3Move);
42
+ }
43
+ export function parseCube3Algorithm(algorithm) {
44
+ const trimmed = algorithm.trim();
45
+ if (trimmed.length === 0) {
46
+ return [];
47
+ }
48
+ const faces = { U: 'U', D: 'D', R: 'R', L: 'L', F: 'F', B: 'B' };
49
+ const rotateX = (times) => {
50
+ for (let i = 0; i < times; i++) {
51
+ const tempU = faces.U, tempF = faces.F, tempD = faces.D, tempB = faces.B;
52
+ faces.U = tempF;
53
+ faces.F = tempD;
54
+ faces.D = tempB;
55
+ faces.B = tempU;
56
+ }
57
+ };
58
+ const rotateY = (times) => {
59
+ for (let i = 0; i < times; i++) {
60
+ const tempF = faces.F, tempL = faces.L, tempB = faces.B, tempR = faces.R;
61
+ faces.F = tempR;
62
+ faces.R = tempB;
63
+ faces.B = tempL;
64
+ faces.L = tempF;
65
+ }
66
+ };
67
+ const rotateZ = (times) => {
68
+ for (let i = 0; i < times; i++) {
69
+ const tempU = faces.U, tempR = faces.R, tempD = faces.D, tempL = faces.L;
70
+ faces.U = tempL;
71
+ faces.L = tempD;
72
+ faces.D = tempR;
73
+ faces.R = tempU;
74
+ }
75
+ };
76
+ const result = [];
77
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
78
+ for (const token of tokens) {
79
+ const base = token[0];
80
+ if (!base)
81
+ continue;
82
+ let isWide = false;
83
+ let isPrime = false;
84
+ let isDouble = false;
85
+ let moveName = base;
86
+ if (token.length > 1) {
87
+ if (token.includes('w')) {
88
+ isWide = true;
89
+ moveName = base.toUpperCase();
90
+ }
91
+ if (token.includes("'"))
92
+ isPrime = true;
93
+ if (token.includes("2"))
94
+ isDouble = true;
95
+ }
96
+ if (base >= 'a' && base <= 'z' && base !== 'x' && base !== 'y' && base !== 'z') {
97
+ isWide = true;
98
+ moveName = base.toUpperCase();
99
+ }
100
+ const suffix = isDouble ? "2" : isPrime ? "'" : "";
101
+ const oppSuffix = isDouble ? "2" : isPrime ? "" : "'";
102
+ const times = isDouble ? 2 : isPrime ? 3 : 1;
103
+ const emit = (f, suff) => result.push(`${faces[f]}${suff}`);
104
+ switch (moveName) {
105
+ case 'U':
106
+ case 'D':
107
+ case 'R':
108
+ case 'L':
109
+ case 'F':
110
+ case 'B':
111
+ if (isWide) {
112
+ if (moveName === 'R') {
113
+ emit('R', suffix);
114
+ emit('L', oppSuffix);
115
+ rotateX(times);
116
+ }
117
+ else if (moveName === 'L') {
118
+ emit('L', suffix);
119
+ emit('R', oppSuffix);
120
+ rotateX((4 - times) % 4);
121
+ }
122
+ else if (moveName === 'U') {
123
+ emit('U', suffix);
124
+ emit('D', oppSuffix);
125
+ rotateY(times);
126
+ }
127
+ else if (moveName === 'D') {
128
+ emit('D', suffix);
129
+ emit('U', oppSuffix);
130
+ rotateY((4 - times) % 4);
131
+ }
132
+ else if (moveName === 'F') {
133
+ emit('F', suffix);
134
+ emit('B', oppSuffix);
135
+ rotateZ(times);
136
+ }
137
+ else if (moveName === 'B') {
138
+ emit('B', suffix);
139
+ emit('F', oppSuffix);
140
+ rotateZ((4 - times) % 4);
141
+ }
142
+ }
143
+ else {
144
+ emit(moveName, suffix);
145
+ }
146
+ break;
147
+ case 'M':
148
+ emit('L', suffix);
149
+ emit('R', oppSuffix);
150
+ rotateX((4 - times) % 4);
151
+ break;
152
+ case 'E':
153
+ emit('D', suffix);
154
+ emit('U', oppSuffix);
155
+ rotateY((4 - times) % 4);
156
+ break;
157
+ case 'S':
158
+ emit('F', suffix);
159
+ emit('B', oppSuffix);
160
+ rotateZ(times);
161
+ break;
162
+ case 'x':
163
+ rotateX(times);
164
+ break;
165
+ case 'y':
166
+ rotateY(times);
167
+ break;
168
+ case 'z':
169
+ rotateZ(times);
170
+ break;
171
+ default:
172
+ throw new Error(`Invalid 3x3 move: ${token}`);
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ export function formatCube3Algorithm(moves) {
178
+ return moves.join(" ");
179
+ }
180
+ export function parseCube3Move(value) {
181
+ if (CUBE3_MOVES.includes(value)) {
182
+ return value;
183
+ }
184
+ throw new Error(`Invalid 3x3 move: ${value}`);
185
+ }
186
+ export function invertCube3Move(move) {
187
+ const { face, suffix } = parseMoveParts(move);
188
+ if (suffix === "2") {
189
+ return move;
190
+ }
191
+ return `${face}${suffix === "'" ? "" : "'"}`;
192
+ }
193
+ function applyFaceMove(state, table) {
194
+ return {
195
+ corners: {
196
+ permutation: table.corners.permutation.map((source) => state.corners.permutation[source]),
197
+ orientation: table.corners.permutation.map((source, target) => ((state.corners.orientation[source] + table.corners.orientation[target]) % 3))
198
+ },
199
+ edges: {
200
+ permutation: table.edges.permutation.map((source) => state.edges.permutation[source]),
201
+ orientation: table.edges.permutation.map((source, target) => ((state.edges.orientation[source] + table.edges.orientation[target]) % 2))
202
+ }
203
+ };
204
+ }
205
+ function parseMoveParts(move) {
206
+ const face = move[0];
207
+ const suffix = move.slice(1);
208
+ const turns = suffix === "2" ? 2 : suffix === "'" ? 3 : 1;
209
+ return { face, suffix, turns };
210
+ }
@@ -0,0 +1,3 @@
1
+ import type { Cube3RandomStateOptions, Cube3State } from "./types.js";
2
+ export declare function generateRandomCube3State(options?: Cube3RandomStateOptions): Cube3State;
3
+ //# sourceMappingURL=random-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/random-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAItE,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAiB1F"}
@@ -0,0 +1,59 @@
1
+ import { createRandomSource } from "../../random/index.js";
2
+ import { CORNER_COUNT, EDGE_COUNT } from "./types.js";
3
+ import { isAllowedRandomCube3State, permutationParity } from "./validation.js";
4
+ import { generateSubsetCube3State } from "./subset-state.js";
5
+ export function generateRandomCube3State(options = {}) {
6
+ const random = createRandomSource(options.seed);
7
+ const rejectTrivial = options.rejectTrivial ?? true;
8
+ if (options.subset) {
9
+ return generateSubsetCube3State(options.subset, random);
10
+ }
11
+ for (let attempt = 0; attempt < 100; attempt += 1) {
12
+ const state = createLegalRandomState(random);
13
+ if (!rejectTrivial || isAllowedRandomCube3State(state)) {
14
+ return state;
15
+ }
16
+ }
17
+ throw new Error("Unable to generate a non-trivial random 3x3 state.");
18
+ }
19
+ function createLegalRandomState(random) {
20
+ const cornerPermutation = shuffledRange(CORNER_COUNT, random);
21
+ const edgePermutation = shuffledRange(EDGE_COUNT, random);
22
+ if (permutationParity(cornerPermutation) !== permutationParity(edgePermutation)) {
23
+ swap(edgePermutation, 0, 1);
24
+ }
25
+ return {
26
+ corners: {
27
+ permutation: cornerPermutation,
28
+ orientation: randomOrientations(CORNER_COUNT, 3, random)
29
+ },
30
+ edges: {
31
+ permutation: edgePermutation,
32
+ orientation: randomOrientations(EDGE_COUNT, 2, random)
33
+ }
34
+ };
35
+ }
36
+ function shuffledRange(length, random) {
37
+ const values = Array.from({ length }, (_, index) => index);
38
+ for (let index = values.length - 1; index > 0; index -= 1) {
39
+ const swapIndex = random.nextInt(index + 1);
40
+ swap(values, index, swapIndex);
41
+ }
42
+ return values;
43
+ }
44
+ function randomOrientations(length, modulo, random) {
45
+ const orientations = Array(length).fill(0);
46
+ let total = 0;
47
+ for (let index = 0; index < length - 1; index += 1) {
48
+ const orientation = random.nextInt(modulo);
49
+ orientations[index] = orientation;
50
+ total += orientation;
51
+ }
52
+ orientations[length - 1] = (modulo - (total % modulo)) % modulo;
53
+ return orientations;
54
+ }
55
+ function swap(values, left, right) {
56
+ const temporary = values[left];
57
+ values[left] = values[right];
58
+ values[right] = temporary;
59
+ }
@@ -0,0 +1,6 @@
1
+ import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
2
+ export declare const cube3ScrambleGenerator: ScrambleGenerator;
3
+ export declare function generateCube3Scramble(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/cube3/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAW9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CA+CzB"}
@@ -0,0 +1,59 @@
1
+ import { applyCube3Algorithm, formatCube3Algorithm, invertCube3Algorithm } from "./moves.js";
2
+ import { generateRandomCube3State } from "./random-state.js";
3
+ import { createSolvedCube3State, cube3StatesEqual, isSolvedCube3State } from "./state.js";
4
+ import { formatCube3Facelets, toCube3Facelets } from "./facelets.js";
5
+ import { solveCube3State } from "./solver/index.js";
6
+ export const cube3ScrambleGenerator = {
7
+ info: {
8
+ eventId: "333",
9
+ name: "3x3x3 Cube",
10
+ puzzle: "cube-3x3",
11
+ quality: "random-state",
12
+ generator: "cube3-two-phase",
13
+ description: "Random-state 3x3 scramble generated by the CubingCenter two-phase solver."
14
+ },
15
+ generate(options = {}) {
16
+ return generateCube3Scramble(options);
17
+ }
18
+ };
19
+ export async function generateCube3Scramble(options = {}) {
20
+ const state = generateRandomCube3State(options);
21
+ const solution = await solveCube3State(state);
22
+ const scrambleMoves = invertCube3Algorithm(solution.moves);
23
+ if (!options.skipValidation) {
24
+ const scrambledState = applyCube3Algorithm(createSolvedCube3State(), scrambleMoves);
25
+ if (!cube3StatesEqual(scrambledState, state)) {
26
+ throw new Error("Generated 3x3 scramble does not reproduce the target random state.");
27
+ }
28
+ if (!isSolvedCube3State(solution.state)) {
29
+ throw new Error("Generated 3x3 solution does not solve the target random state.");
30
+ }
31
+ if (scrambleMoves.length < 2) {
32
+ throw new Error("Generated 3x3 scramble is too short.");
33
+ }
34
+ }
35
+ const facelets = toCube3Facelets(state);
36
+ const result = {
37
+ eventId: "333",
38
+ scramble: formatCube3Algorithm(scrambleMoves),
39
+ moves: scrambleMoves,
40
+ quality: "random-state",
41
+ generator: "cube3-two-phase",
42
+ metadata: {
43
+ generator: "cube3-two-phase",
44
+ generatorVersion: "1.0.0",
45
+ faceletString: formatCube3Facelets(facelets),
46
+ state: JSON.parse(JSON.stringify(state)),
47
+ solutionMoves: solution.moves,
48
+ solutionDepth: solution.depth,
49
+ phase1Depth: solution.phase1.depth,
50
+ phase2Depth: solution.phase2.depth,
51
+ visitedNodes: solution.visitedNodes,
52
+ ...options.metadata
53
+ }
54
+ };
55
+ if (options.seed !== undefined) {
56
+ result.seed = options.seed;
57
+ }
58
+ return result;
59
+ }
@@ -0,0 +1,5 @@
1
+ import type { Cube3SolverTables } from "./tables.js";
2
+ export declare function getCachedBrowserTables(): Cube3SolverTables | undefined;
3
+ export declare function clearCachedBrowserTables(): void;
4
+ export declare function loadBrowserTables(baseUrl?: string): Promise<Cube3SolverTables>;
5
+ //# sourceMappingURL=browser-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/browser-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAqCrB,wBAAgB,sBAAsB,IAAI,iBAAiB,GAAG,SAAS,CAEtE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0CpF"}
@@ -0,0 +1,134 @@
1
+ let browserTables;
2
+ function resolveBaseUrl(provided) {
3
+ if (provided) {
4
+ return provided.replace(/\/$/, "");
5
+ }
6
+ if (typeof document !== "undefined") {
7
+ const script = document.currentScript;
8
+ if (script?.src) {
9
+ const base = new URL(".", script.src).href;
10
+ return base.replace(/\/$/, "");
11
+ }
12
+ }
13
+ return ".";
14
+ }
15
+ export function getCachedBrowserTables() {
16
+ return browserTables;
17
+ }
18
+ export function clearCachedBrowserTables() {
19
+ browserTables = undefined;
20
+ }
21
+ export async function loadBrowserTables(baseUrl) {
22
+ if (browserTables) {
23
+ return browserTables;
24
+ }
25
+ const resolvedBase = resolveBaseUrl(baseUrl);
26
+ const manifest = await fetchManifest(resolvedBase);
27
+ browserTables = {
28
+ phase1Moves: manifest.phase1Moves,
29
+ phase2Moves: manifest.phase2Moves,
30
+ moveTables: {
31
+ cornerOrientation: await fetchMoveTable(resolvedBase, manifest.moveTables.cornerOrientation),
32
+ edgeOrientation: await fetchMoveTable(resolvedBase, manifest.moveTables.edgeOrientation),
33
+ udSlice: await fetchMoveTable(resolvedBase, manifest.moveTables.udSlice),
34
+ cornerPermutation: await fetchMoveTable(resolvedBase, manifest.moveTables.cornerPermutation),
35
+ udEdgePermutation: await fetchMoveTable(resolvedBase, manifest.moveTables.udEdgePermutation),
36
+ slicePermutation: await fetchMoveTable(resolvedBase, manifest.moveTables.slicePermutation)
37
+ },
38
+ pruningTables: {
39
+ cornerOrientation: await fetchPruningTable(resolvedBase, manifest.pruningTables.cornerOrientation),
40
+ edgeOrientation: await fetchPruningTable(resolvedBase, manifest.pruningTables.edgeOrientation),
41
+ udSlice: await fetchPruningTable(resolvedBase, manifest.pruningTables.udSlice),
42
+ cornerOrientationEdgeOrientation: await fetchPruningTable(resolvedBase, manifest.pruningTables.cornerOrientationEdgeOrientation),
43
+ cornerPermutation: await fetchPruningTable(resolvedBase, manifest.pruningTables.cornerPermutation),
44
+ udEdgePermutation: await fetchPruningTable(resolvedBase, manifest.pruningTables.udEdgePermutation),
45
+ slicePermutation: await fetchPruningTable(resolvedBase, manifest.pruningTables.slicePermutation),
46
+ cornerPermutationSlicePermutation: await fetchPruningTable(resolvedBase, manifest.pruningTables.cornerPermutationSlicePermutation),
47
+ udEdgePermutationSlicePermutation: await fetchPruningTable(resolvedBase, manifest.pruningTables.udEdgePermutationSlicePermutation)
48
+ }
49
+ };
50
+ return browserTables;
51
+ }
52
+ const CACHE_NAME = "cubingcenter-scrambler-tables-v1";
53
+ async function cachedFetch(url) {
54
+ // Try Cache API first
55
+ if (typeof caches !== "undefined") {
56
+ try {
57
+ const cache = await caches.open(CACHE_NAME);
58
+ const cached = await cache.match(url);
59
+ if (cached) {
60
+ return cached.arrayBuffer();
61
+ }
62
+ const response = await fetch(url);
63
+ if (response.ok) {
64
+ // Clone before reading so we can store the clone
65
+ await cache.put(url, response.clone());
66
+ }
67
+ return response.arrayBuffer();
68
+ }
69
+ catch {
70
+ // Cache API failed (e.g. quota exceeded, private mode) — fall through
71
+ }
72
+ }
73
+ // Fallback: plain fetch
74
+ const response = await fetch(url);
75
+ return response.arrayBuffer();
76
+ }
77
+ async function fetchManifest(baseUrl) {
78
+ const url = `${baseUrl}/puzzles/cube3/solver/generated/manifest.json`;
79
+ const response = await fetch(url);
80
+ if (!response.ok) {
81
+ throw new Error(`Failed to load solver table manifest from ${url}: ${response.status} ${response.statusText}`);
82
+ }
83
+ const manifest = await response.json();
84
+ if (manifest.version !== 1) {
85
+ throw new Error(`Unsupported 3x3 solver table manifest version: ${manifest.version}`);
86
+ }
87
+ return manifest;
88
+ }
89
+ async function fetchMoveTable(baseUrl, entry) {
90
+ const url = `${baseUrl}/puzzles/cube3/solver/generated/${entry.file}`;
91
+ const buffer = await cachedFetch(url);
92
+ const expectedBytes = entry.range * entry.moves.length * 4;
93
+ if (buffer.byteLength !== expectedBytes) {
94
+ throw new Error(`Invalid byte size for ${entry.coordinate} move table.`);
95
+ }
96
+ const values = new Int32Array(entry.range * entry.moves.length);
97
+ const view = new DataView(buffer);
98
+ for (let index = 0; index < values.length; index += 1) {
99
+ values[index] = view.getInt32(index * 4, true);
100
+ }
101
+ return {
102
+ coordinate: entry.coordinate,
103
+ moves: entry.moves,
104
+ range: entry.range,
105
+ solvedCoordinate: entry.solvedCoordinate,
106
+ values,
107
+ checksum: checksum(values)
108
+ };
109
+ }
110
+ async function fetchPruningTable(baseUrl, entry) {
111
+ const url = `${baseUrl}/puzzles/cube3/solver/generated/${entry.file}`;
112
+ const buffer = await cachedFetch(url);
113
+ const expectedBytes = Math.ceil(entry.range / 2);
114
+ if (buffer.byteLength !== expectedBytes) {
115
+ throw new Error(`Invalid byte size for ${entry.coordinate} pruning table.`);
116
+ }
117
+ const values = new Uint8Array(buffer);
118
+ return {
119
+ coordinate: entry.coordinate,
120
+ moves: entry.moves,
121
+ range: entry.range,
122
+ values,
123
+ checksum: checksum(values),
124
+ maxDepth: entry.maxDepth ?? 0
125
+ };
126
+ }
127
+ function checksum(values) {
128
+ let hash = 0x811c9dc5;
129
+ for (let index = 0; index < values.length; index += 1) {
130
+ hash ^= values[index];
131
+ hash = Math.imul(hash, 0x01000193);
132
+ }
133
+ return hash >>> 0;
134
+ }
@@ -0,0 +1,31 @@
1
+ import type { ScrambleOptions, ScrambleResult } from "../../../core/types.js";
2
+ /**
3
+ * Web Worker pool for browser environments.
4
+ *
5
+ * Each worker loads solver tables independently (~10 MB per worker).
6
+ * Best suited for batch generation on client devices with 2+ cores.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * const pool = new Cube3BrowserWorkerPool();
11
+ * const results = await pool.generateBatch(50, (i) => `seed-${i}`);
12
+ * pool.terminate();
13
+ * ```
14
+ */
15
+ export declare class Cube3BrowserWorkerPool {
16
+ private workers;
17
+ private available;
18
+ private pending;
19
+ private queue;
20
+ private nextId;
21
+ private terminated;
22
+ constructor(size?: number);
23
+ generate(options?: ScrambleOptions & {
24
+ skipValidation?: boolean;
25
+ }): Promise<ScrambleResult>;
26
+ generateBatch(count: number, deriveSeed: (index: number) => string | number | undefined): Promise<ScrambleResult[]>;
27
+ terminate(): void;
28
+ private handleResponse;
29
+ private handleError;
30
+ }
31
+ //# sourceMappingURL=browser-worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-worker-pool.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/browser-worker-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAiC9E;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAS;gBAGzB,IAAI,GAAE,MAA2D;IA2BnE,QAAQ,CACN,OAAO,GAAE,eAAe,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GAC3D,OAAO,CAAC,cAAc,CAAC;IA0B1B,aAAa,CACX,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,GACzD,OAAO,CAAC,cAAc,EAAE,CAAC;IAQ5B,SAAS,IAAI,IAAI;IAajB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,WAAW;CAIpB"}