@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,22 @@
1
+ export const CORNER_COUNT = 8;
2
+ export const EDGE_COUNT = 12;
3
+ export const CUBE3_MOVES = [
4
+ "U",
5
+ "U2",
6
+ "U'",
7
+ "D",
8
+ "D2",
9
+ "D'",
10
+ "R",
11
+ "R2",
12
+ "R'",
13
+ "L",
14
+ "L2",
15
+ "L'",
16
+ "F",
17
+ "F2",
18
+ "F'",
19
+ "B",
20
+ "B2",
21
+ "B'"
22
+ ];
@@ -0,0 +1,6 @@
1
+ import type { Cube3State, Cube3ValidationResult } from "./types.js";
2
+ export declare function validateCube3State(state: Cube3State): Cube3ValidationResult;
3
+ export declare function isOneMoveFromSolvedCube3State(state: Cube3State): boolean;
4
+ export declare function isAllowedRandomCube3State(state: Cube3State): boolean;
5
+ export declare function permutationParity(permutation: readonly number[]): 0 | 1;
6
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CA+B3E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAYvE"}
@@ -0,0 +1,83 @@
1
+ import { CUBE3_MOVES, CORNER_COUNT, EDGE_COUNT } from "./types.js";
2
+ import { applyCube3Move } from "./moves.js";
3
+ import { createSolvedCube3State, cube3StatesEqual, isSolvedCube3State } from "./state.js";
4
+ export function validateCube3State(state) {
5
+ const errors = [
6
+ ...validatePermutation("corner", state.corners.permutation, CORNER_COUNT),
7
+ ...validatePermutation("edge", state.edges.permutation, EDGE_COUNT),
8
+ ...validateOrientations("corner", state.corners.orientation, CORNER_COUNT, 3),
9
+ ...validateOrientations("edge", state.edges.orientation, EDGE_COUNT, 2)
10
+ ];
11
+ if (errors.length === 0) {
12
+ const cornerOrientation = sum(state.corners.orientation) % 3;
13
+ const edgeOrientation = sum(state.edges.orientation) % 2;
14
+ const cornerParity = permutationParity(state.corners.permutation);
15
+ const edgeParity = permutationParity(state.edges.permutation);
16
+ if (cornerOrientation !== 0) {
17
+ errors.push("Corner orientation sum must be divisible by 3.");
18
+ }
19
+ if (edgeOrientation !== 0) {
20
+ errors.push("Edge orientation sum must be divisible by 2.");
21
+ }
22
+ if (cornerParity !== edgeParity) {
23
+ errors.push("Corner and edge permutation parity must match.");
24
+ }
25
+ }
26
+ return {
27
+ valid: errors.length === 0,
28
+ errors
29
+ };
30
+ }
31
+ export function isOneMoveFromSolvedCube3State(state) {
32
+ const solved = createSolvedCube3State();
33
+ return CUBE3_MOVES.some((move) => cube3StatesEqual(applyCube3Move(solved, move), state));
34
+ }
35
+ export function isAllowedRandomCube3State(state) {
36
+ return validateCube3State(state).valid &&
37
+ !isSolvedCube3State(state) &&
38
+ !isOneMoveFromSolvedCube3State(state);
39
+ }
40
+ export function permutationParity(permutation) {
41
+ let inversions = 0;
42
+ for (let left = 0; left < permutation.length; left += 1) {
43
+ for (let right = left + 1; right < permutation.length; right += 1) {
44
+ if (permutation[left] > permutation[right]) {
45
+ inversions += 1;
46
+ }
47
+ }
48
+ }
49
+ return (inversions % 2);
50
+ }
51
+ function validatePermutation(label, permutation, length) {
52
+ const errors = [];
53
+ const seen = new Set();
54
+ if (permutation.length !== length) {
55
+ errors.push(`${label} permutation must contain ${length} values.`);
56
+ }
57
+ for (const value of permutation) {
58
+ if (!Number.isInteger(value) || value < 0 || value >= length) {
59
+ errors.push(`${label} permutation contains out-of-range value: ${value}.`);
60
+ continue;
61
+ }
62
+ if (seen.has(value)) {
63
+ errors.push(`${label} permutation contains duplicate value: ${value}.`);
64
+ }
65
+ seen.add(value);
66
+ }
67
+ return errors;
68
+ }
69
+ function validateOrientations(label, orientations, length, modulo) {
70
+ const errors = [];
71
+ if (orientations.length !== length) {
72
+ errors.push(`${label} orientation must contain ${length} values.`);
73
+ }
74
+ for (const value of orientations) {
75
+ if (!Number.isInteger(value) || value < 0 || value >= modulo) {
76
+ errors.push(`${label} orientation contains out-of-range value: ${value}.`);
77
+ }
78
+ }
79
+ return errors;
80
+ }
81
+ function sum(values) {
82
+ return values.reduce((total, value) => total + value, 0);
83
+ }
@@ -0,0 +1,5 @@
1
+ import type { Cube4Face, Cube4Facelets, Cube4State } from "./types.js";
2
+ export declare function toCube4Facelets(state: Cube4State): Cube4Facelets;
3
+ export declare function formatCube4Facelets(facelets: Cube4Facelets): string;
4
+ export declare function getCube4FaceOrder(): readonly Cube4Face[];
5
+ //# sourceMappingURL=facelets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facelets.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/facelets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AAmGrF,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAuDhE;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAEnE;AAMD,wBAAgB,iBAAiB,IAAI,SAAS,SAAS,EAAE,CAExD"}
@@ -0,0 +1,135 @@
1
+ import { CORNER_COUNT, WING_COUNT, CENTER_COUNT } from "./types.js";
2
+ const FACE_ORDER = ["U", "R", "F", "D", "L", "B"];
3
+ const FACE_LETTERS = FACE_ORDER;
4
+ const CENTER_SLOTS = [5, 6, 9, 10];
5
+ // ---------------------------------------------------------------------------
6
+ // Corner piece sticker colors (by piece identity 0-7, same as 3x3)
7
+ // ---------------------------------------------------------------------------
8
+ const CORNER_PIECE_STICKERS = [
9
+ ["U", "R", "F"], // 0 = URF
10
+ ["U", "F", "L"], // 1 = UFL
11
+ ["U", "L", "B"], // 2 = ULB
12
+ ["U", "B", "R"], // 3 = UBR
13
+ ["D", "F", "R"], // 4 = DFR
14
+ ["D", "L", "F"], // 5 = DLF
15
+ ["D", "B", "L"], // 6 = DBL
16
+ ["D", "R", "B"], // 7 = DRB
17
+ ];
18
+ const CORNER_POSITION_SLOTS = [
19
+ [["U", 15], ["R", 0], ["F", 3]], // 0 = URF
20
+ [["U", 12], ["F", 0], ["L", 3]], // 1 = UFL
21
+ [["U", 0], ["L", 0], ["B", 3]], // 2 = ULB
22
+ [["U", 3], ["B", 0], ["R", 3]], // 3 = UBR
23
+ [["D", 3], ["F", 15], ["R", 12]], // 4 = DFR
24
+ [["D", 0], ["L", 15], ["F", 12]], // 5 = DLF
25
+ [["D", 12], ["B", 15], ["L", 12]], // 6 = DBL
26
+ [["D", 15], ["R", 15], ["B", 12]], // 7 = DRB
27
+ ];
28
+ // ---------------------------------------------------------------------------
29
+ // Wing piece color pairs (by wing identity 0-23)
30
+ // Wings 2k and 2k+1 share the same colors (they form a 3x3-edge pair).
31
+ // ---------------------------------------------------------------------------
32
+ const WING_PIECE_COLORS = [
33
+ ["U", "R"], ["U", "R"], // 0, 1 UR pair
34
+ ["U", "F"], ["U", "F"], // 2, 3 UF pair
35
+ ["U", "L"], ["U", "L"], // 4, 5 UL pair
36
+ ["U", "B"], ["U", "B"], // 6, 7 UB pair
37
+ ["D", "R"], ["D", "R"], // 8, 9 DR pair
38
+ ["D", "F"], ["D", "F"], // 10, 11 DF pair
39
+ ["D", "L"], ["D", "L"], // 12, 13 DL pair
40
+ ["D", "B"], ["D", "B"], // 14, 15 DB pair
41
+ ["F", "R"], ["F", "R"], // 16, 17 FR pair
42
+ ["F", "L"], ["F", "L"], // 18, 19 FL pair
43
+ ["B", "L"], ["B", "L"], // 20, 21 BL pair
44
+ ["B", "R"], ["B", "R"], // 22, 23 BR pair
45
+ ];
46
+ const WING_POSITION_SLOTS = [
47
+ [["U", 11], ["R", 1]], // 0 URf
48
+ [["U", 7], ["R", 2]], // 1 URb
49
+ [["U", 14], ["F", 2]], // 2 UFr
50
+ [["U", 13], ["F", 1]], // 3 UFl
51
+ [["U", 8], ["L", 2]], // 4 ULf
52
+ [["U", 4], ["L", 1]], // 5 ULb
53
+ [["U", 1], ["B", 2]], // 6 UBl
54
+ [["U", 2], ["B", 1]], // 7 UBr
55
+ [["D", 7], ["R", 13]], // 8 DRf
56
+ [["D", 11], ["R", 14]], // 9 DRb
57
+ [["D", 2], ["F", 14]], // 10 DFr
58
+ [["D", 1], ["F", 13]], // 11 DFl
59
+ [["D", 4], ["L", 14]], // 12 DLf
60
+ [["D", 8], ["L", 13]], // 13 DLb
61
+ [["D", 13], ["B", 14]], // 14 DBl
62
+ [["D", 14], ["B", 13]], // 15 DBr
63
+ [["F", 7], ["R", 4]], // 16 FRu
64
+ [["F", 11], ["R", 8]], // 17 FRd
65
+ [["F", 4], ["L", 7]], // 18 FLu
66
+ [["F", 8], ["L", 11]], // 19 FLd
67
+ [["B", 7], ["L", 4]], // 20 BLu
68
+ [["B", 11], ["L", 8]], // 21 BLd
69
+ [["B", 4], ["R", 7]], // 22 BRu
70
+ [["B", 8], ["R", 11]], // 23 BRd
71
+ ];
72
+ // ---------------------------------------------------------------------------
73
+ // toCube4Facelets
74
+ // ---------------------------------------------------------------------------
75
+ export function toCube4Facelets(state) {
76
+ const f = {
77
+ U: Array(16).fill("U"),
78
+ R: Array(16).fill("R"),
79
+ F: Array(16).fill("F"),
80
+ D: Array(16).fill("D"),
81
+ L: Array(16).fill("L"),
82
+ B: Array(16).fill("B"),
83
+ };
84
+ // Centers
85
+ for (let i = 0; i < CENTER_COUNT; i++) {
86
+ const face = FACE_LETTERS[Math.floor(i / 4)];
87
+ const slot = CENTER_SLOTS[i % 4];
88
+ f[face][slot] = FACE_LETTERS[state.centers[i]];
89
+ }
90
+ // Corners
91
+ for (let pos = 0; pos < CORNER_COUNT; pos++) {
92
+ const piece = state.cp[pos];
93
+ const ori = state.co[pos];
94
+ const slots = CORNER_POSITION_SLOTS[pos];
95
+ const stickers = CORNER_PIECE_STICKERS[piece];
96
+ for (let i = 0; i < slots.length; i++) {
97
+ const [face, idx] = slots[i];
98
+ f[face][idx] = stickers[(i - ori + stickers.length) % stickers.length];
99
+ }
100
+ }
101
+ // Wings: Recover orientation mathematically using XOR orbit parity!
102
+ // A wing is physically flipped if its chiral group (Left/Right) differs from the slot's chiral group.
103
+ const RIGHT_GROUP = new Set([1, 2, 4, 6, 8, 11, 13, 15, 16, 19, 20, 23]);
104
+ for (let pos = 0; pos < WING_COUNT; pos++) {
105
+ const piece = state.wp[pos];
106
+ const slots = WING_POSITION_SLOTS[pos];
107
+ const colors = WING_PIECE_COLORS[piece];
108
+ const [f0, i0] = slots[0];
109
+ const [f1, i1] = slots[1];
110
+ const wingIsRight = RIGHT_GROUP.has(piece);
111
+ const slotIsRight = RIGHT_GROUP.has(pos);
112
+ const isFlipped = wingIsRight !== slotIsRight;
113
+ if (isFlipped) {
114
+ f[f0][i0] = colors[1]; // Secondary color to primary slot sticker
115
+ f[f1][i1] = colors[0]; // Primary color to secondary slot sticker
116
+ }
117
+ else {
118
+ f[f0][i0] = colors[0]; // Primary color to primary slot sticker
119
+ f[f1][i1] = colors[1]; // Secondary color to secondary slot sticker
120
+ }
121
+ }
122
+ return f;
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // formatCube4Facelets
126
+ // ---------------------------------------------------------------------------
127
+ export function formatCube4Facelets(facelets) {
128
+ return FACE_ORDER.map((face) => facelets[face].join("")).join("");
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // getCube4FaceOrder
132
+ // ---------------------------------------------------------------------------
133
+ export function getCube4FaceOrder() {
134
+ return FACE_ORDER;
135
+ }
@@ -0,0 +1,7 @@
1
+ export { CORNER_COUNT, WING_COUNT, CENTER_COUNT, FACE_COUNT, CENTERS_PER_FACE, U, R, F, D, L, B, CUBE4_FACE_MOVES, CUBE4_ALL_MOVES, CUBE4_OUTER_MOVES } from "./types.js";
2
+ export type { Cube4Face, Cube4FaceMove, Cube4Move, Cube4MoveSuffix, Cube4State, Cube4Sticker, Cube4Facelets, Cube4RandomStateOptions } from "./types.js";
3
+ export { createSolvedCube4State, cloneCube4State, cube4StatesEqual, isSolvedCube4State, areCentersReduced, areWingsPaired } from "./state.js";
4
+ export { applyCube4Move, applyCube4Algorithm, invertCube4Move, invertCube4Algorithm, formatCube4Algorithm, parseCube4Algorithm, parseCube4Move, parseMove, FACE_MOVE_EFFECTS } from "./moves.js";
5
+ export { cube4ScrambleGenerator, generateCube4Scramble } from "./scrambler.js";
6
+ export { toCube4Facelets, formatCube4Facelets, getCube4FaceOrder } from "./facelets.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ // ---------------------------------------------------------------------------
2
+ // cube4 barrel exports
3
+ // ---------------------------------------------------------------------------
4
+ export { CORNER_COUNT, WING_COUNT, CENTER_COUNT, FACE_COUNT, CENTERS_PER_FACE, U, R, F, D, L, B, CUBE4_FACE_MOVES, CUBE4_ALL_MOVES, CUBE4_OUTER_MOVES } from "./types.js";
5
+ export { createSolvedCube4State, cloneCube4State, cube4StatesEqual, isSolvedCube4State, areCentersReduced, areWingsPaired } from "./state.js";
6
+ export { applyCube4Move, applyCube4Algorithm, invertCube4Move, invertCube4Algorithm, formatCube4Algorithm, parseCube4Algorithm, parseCube4Move, parseMove, FACE_MOVE_EFFECTS } from "./moves.js";
7
+ export { cube4ScrambleGenerator, generateCube4Scramble } from "./scrambler.js";
8
+ export { toCube4Facelets, formatCube4Facelets, getCube4FaceOrder } from "./facelets.js";
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 4x4 Move Definitions
3
+ *
4
+ * Each base move (CW quarter-turn) is defined by its effect on:
5
+ * - Corner permutation & orientation (same as 3x3 for outer moves; identity for wide-only slice)
6
+ * - Wing permutation (24 wings)
7
+ * - Center permutation (24 centers)
8
+ *
9
+ * Wide moves (Uw, Rw, etc.) = outer move + inner slice.
10
+ * We define outer moves and inner slices separately, then compose.
11
+ */
12
+ import type { Cube4FaceMove, Cube4Move, Cube4MoveSuffix, Cube4State } from "./types.js";
13
+ interface MoveEffect {
14
+ /** Corner permutation cycle(s). Identity positions omitted. */
15
+ cperm: readonly number[];
16
+ /** Corner orientation deltas (length = CORNER_COUNT). */
17
+ corient: readonly number[];
18
+ /** Wing permutation – full 24-element mapping (destination[i] = source index). */
19
+ wperm: readonly number[];
20
+ /** Center permutation – full 24-element mapping. */
21
+ ctperm: readonly number[];
22
+ }
23
+ declare const FACE_MOVE_EFFECTS: Record<Cube4FaceMove, MoveEffect>;
24
+ export declare function parseMove(move: Cube4Move): {
25
+ face: Cube4FaceMove;
26
+ suffix: Cube4MoveSuffix;
27
+ turns: number;
28
+ };
29
+ export declare function applyCube4Move(state: Cube4State, move: Cube4Move): Cube4State;
30
+ export declare function applyCube4Algorithm(state: Cube4State, moves: readonly Cube4Move[]): Cube4State;
31
+ export declare function invertCube4Move(move: Cube4Move): Cube4Move;
32
+ export declare function invertCube4Algorithm(moves: readonly Cube4Move[]): Cube4Move[];
33
+ export declare function formatCube4Algorithm(moves: readonly Cube4Move[]): string;
34
+ export declare function parseCube4Algorithm(algorithm: string): Cube4Move[];
35
+ export declare function parseCube4Move(value: string): Cube4Move;
36
+ export { FACE_MOVE_EFFECTS };
37
+ //# sourceMappingURL=moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/moves.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxF,UAAU,UAAU;IAClB,+DAA+D;IAC/D,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,yDAAyD;IACzD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,kFAAkF;IAClF,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,oDAAoD;IACpD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AA0KD,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,CAGxD,CAAC;AA0BF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAc1G;AAED,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,CAM9F;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAI1D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAE7E;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAIlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAMvD;AAMD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * 4x4 Move Definitions
3
+ *
4
+ * Each base move (CW quarter-turn) is defined by its effect on:
5
+ * - Corner permutation & orientation (same as 3x3 for outer moves; identity for wide-only slice)
6
+ * - Wing permutation (24 wings)
7
+ * - Center permutation (24 centers)
8
+ *
9
+ * Wide moves (Uw, Rw, etc.) = outer move + inner slice.
10
+ * We define outer moves and inner slices separately, then compose.
11
+ */
12
+ import { CORNER_COUNT, WING_COUNT, CENTER_COUNT, CUBE4_ALL_MOVES } from "./types.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Identity arrays
15
+ // ---------------------------------------------------------------------------
16
+ const ID_CP = [0, 1, 2, 3, 4, 5, 6, 7];
17
+ const ID_CO = [0, 0, 0, 0, 0, 0, 0, 0];
18
+ const ID_WP = Array.from({ length: 24 }, (_, i) => i);
19
+ const ID_CT = Array.from({ length: 24 }, (_, i) => i);
20
+ // ---------------------------------------------------------------------------
21
+ // Helper: apply cycles to an identity-initialized permutation array
22
+ // ---------------------------------------------------------------------------
23
+ function withCycles(base, ...cycles) {
24
+ const result = [...base];
25
+ for (const cycle of cycles) {
26
+ const last = result[cycle[cycle.length - 1]];
27
+ for (let i = cycle.length - 1; i > 0; i--) {
28
+ result[cycle[i]] = result[cycle[i - 1]];
29
+ }
30
+ result[cycle[0]] = last;
31
+ }
32
+ return result;
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Outer face moves (single outer layer)
36
+ // ---------------------------------------------------------------------------
37
+ /*
38
+ * Corner numbering: 0=URF 1=UFL 2=ULB 3=UBR 4=DFR 5=DLF 6=DBL 7=DRB
39
+ *
40
+ * Wing numbering (24 wings):
41
+ * Pair 0 (UR): 0=URf, 1=URb Pair 6 (DL): 12=DLf, 13=DLb
42
+ * Pair 1 (UF): 2=UFr, 3=UFl Pair 7 (DB): 14=DBl, 15=DBr
43
+ * Pair 2 (UL): 4=ULf, 5=ULb Pair 8 (FR): 16=FRu, 17=FRd
44
+ * Pair 3 (UB): 6=UBl, 7=UBr Pair 9 (FL): 18=FLu, 19=FLd
45
+ * Pair 4 (DR): 8=DRf, 9=DRb Pair 10 (BL): 20=BLu, 21=BLd
46
+ * Pair 5 (DF): 10=DFr, 11=DFl Pair 11 (BR): 22=BRu, 23=BRd
47
+ *
48
+ * Center numbering (inner 2×2 per face, reading order):
49
+ * U: 0,1,2,3 R: 4,5,6,7 F: 8,9,10,11
50
+ * D: 12,13,14,15 L: 16,17,18,19 B: 20,21,22,23
51
+ *
52
+ * Within a face, positions are:
53
+ * 0=top-left 1=top-right
54
+ * 2=bot-left 3=bot-right
55
+ * (as seen looking at the face from the outside)
56
+ */
57
+ const OUTER_U = {
58
+ cperm: [3, 0, 1, 2, 4, 5, 6, 7],
59
+ corient: [0, 0, 0, 0, 0, 0, 0, 0],
60
+ wperm: [7, 6, 1, 0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
61
+ ctperm: [2, 0, 3, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
62
+ };
63
+ const OUTER_D = {
64
+ cperm: [0, 1, 2, 3, 5, 6, 7, 4],
65
+ corient: [0, 0, 0, 0, 0, 0, 0, 0],
66
+ wperm: [0, 1, 2, 3, 4, 5, 6, 7, 11, 10, 12, 13, 14, 15, 9, 8, 16, 17, 18, 19, 20, 21, 22, 23],
67
+ ctperm: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 12, 15, 13, 16, 17, 18, 19, 20, 21, 22, 23],
68
+ };
69
+ const OUTER_R = {
70
+ cperm: [4, 1, 2, 0, 7, 5, 6, 3],
71
+ corient: [2, 0, 0, 1, 1, 0, 0, 2],
72
+ wperm: [17, 16, 2, 3, 4, 5, 6, 7, 23, 22, 10, 11, 12, 13, 14, 15, 8, 9, 18, 19, 20, 21, 0, 1],
73
+ ctperm: [0, 1, 2, 3, 6, 4, 7, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
74
+ };
75
+ const OUTER_L = {
76
+ cperm: [0, 2, 6, 3, 4, 1, 5, 7],
77
+ corient: [0, 1, 2, 0, 0, 2, 1, 0],
78
+ wperm: [0, 1, 2, 3, 20, 21, 6, 7, 8, 9, 10, 11, 18, 19, 14, 15, 16, 17, 5, 4, 13, 12, 22, 23],
79
+ ctperm: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 16, 19, 17, 20, 21, 22, 23],
80
+ };
81
+ const OUTER_F = {
82
+ cperm: [1, 5, 2, 3, 0, 4, 6, 7],
83
+ corient: [1, 2, 0, 0, 2, 1, 0, 0],
84
+ wperm: [0, 1, 18, 19, 4, 5, 6, 7, 8, 9, 16, 17, 12, 13, 14, 15, 3, 2, 11, 10, 20, 21, 22, 23],
85
+ ctperm: [0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 11, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
86
+ };
87
+ const OUTER_B = {
88
+ cperm: [0, 1, 3, 7, 4, 5, 2, 6],
89
+ corient: [0, 0, 1, 2, 0, 0, 2, 1],
90
+ wperm: [0, 1, 2, 3, 4, 5, 22, 23, 8, 9, 10, 11, 12, 13, 20, 21, 16, 17, 18, 19, 7, 6, 15, 14],
91
+ ctperm: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 20, 23, 21],
92
+ };
93
+ // ---------------------------------------------------------------------------
94
+ // Inner slices — derived from facelet simulation, verified x4=identity
95
+ // ---------------------------------------------------------------------------
96
+ const INNER_u = {
97
+ cperm: ID_CP, corient: ID_CO,
98
+ wperm: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 22, 17, 16, 19, 18, 21, 20, 23],
99
+ ctperm: [0, 1, 2, 3, 20, 21, 6, 7, 4, 5, 10, 11, 12, 13, 14, 15, 8, 9, 18, 19, 16, 17, 22, 23],
100
+ };
101
+ const INNER_d = {
102
+ cperm: ID_CP, corient: ID_CO,
103
+ wperm: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 18, 21, 20, 23, 22, 17],
104
+ ctperm: [0, 1, 2, 3, 4, 5, 10, 11, 8, 9, 18, 19, 12, 13, 14, 15, 16, 17, 22, 23, 20, 21, 6, 7],
105
+ };
106
+ const INNER_r = {
107
+ cperm: ID_CP, corient: ID_CO,
108
+ wperm: [0, 1, 10, 3, 4, 5, 6, 2, 8, 9, 15, 11, 12, 13, 14, 7, 16, 17, 18, 19, 20, 21, 22, 23],
109
+ ctperm: [0, 9, 2, 11, 4, 5, 6, 7, 8, 13, 10, 15, 12, 22, 14, 20, 16, 17, 18, 19, 3, 21, 1, 23],
110
+ };
111
+ const INNER_l = {
112
+ cperm: ID_CP, corient: ID_CO,
113
+ wperm: [0, 1, 2, 6, 4, 5, 14, 7, 8, 9, 10, 3, 12, 13, 11, 15, 16, 17, 18, 19, 20, 21, 22, 23],
114
+ ctperm: [23, 1, 21, 3, 4, 5, 6, 7, 0, 9, 2, 11, 8, 13, 10, 15, 16, 17, 18, 19, 20, 14, 22, 12],
115
+ };
116
+ const INNER_f = {
117
+ cperm: ID_CP, corient: ID_CO,
118
+ wperm: [4, 1, 2, 3, 12, 5, 6, 7, 0, 9, 10, 11, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
119
+ ctperm: [0, 1, 19, 17, 2, 5, 3, 7, 8, 9, 10, 11, 6, 4, 14, 15, 16, 12, 18, 13, 20, 21, 22, 23],
120
+ };
121
+ const INNER_b = {
122
+ cperm: ID_CP, corient: ID_CO,
123
+ wperm: [0, 9, 2, 3, 4, 1, 6, 7, 8, 13, 10, 11, 12, 5, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
124
+ ctperm: [5, 7, 2, 3, 4, 15, 6, 14, 8, 9, 10, 11, 12, 13, 16, 18, 1, 17, 0, 19, 20, 21, 22, 23],
125
+ };
126
+ // ---------------------------------------------------------------------------
127
+ // Compose two effects to create wide moves: Xw = outer_X then inner_x
128
+ // ---------------------------------------------------------------------------
129
+ function composeEffects(a, b) {
130
+ const cp = new Array(CORNER_COUNT);
131
+ const co = new Array(CORNER_COUNT);
132
+ const wp = new Array(WING_COUNT);
133
+ const ct = new Array(CENTER_COUNT);
134
+ for (let i = 0; i < CORNER_COUNT; i++) {
135
+ cp[i] = a.cperm[b.cperm[i]];
136
+ co[i] = (a.corient[b.cperm[i]] + b.corient[i]) % 3;
137
+ }
138
+ for (let i = 0; i < WING_COUNT; i++) {
139
+ wp[i] = a.wperm[b.wperm[i]];
140
+ }
141
+ for (let i = 0; i < CENTER_COUNT; i++) {
142
+ ct[i] = a.ctperm[b.ctperm[i]];
143
+ }
144
+ return { cperm: cp, corient: co, wperm: wp, ctperm: ct };
145
+ }
146
+ // Wide moves = outer + inner
147
+ const WIDE_Uw = composeEffects(OUTER_U, INNER_u);
148
+ const WIDE_Dw = composeEffects(OUTER_D, INNER_d);
149
+ const WIDE_Rw = composeEffects(OUTER_R, INNER_r);
150
+ const WIDE_Lw = composeEffects(OUTER_L, INNER_l);
151
+ const WIDE_Fw = composeEffects(OUTER_F, INNER_f);
152
+ const WIDE_Bw = composeEffects(OUTER_B, INNER_b);
153
+ // ---------------------------------------------------------------------------
154
+ // Lookup table: face-move name → MoveEffect (CW quarter turn)
155
+ // ---------------------------------------------------------------------------
156
+ const FACE_MOVE_EFFECTS = {
157
+ U: OUTER_U, D: OUTER_D, R: OUTER_R, L: OUTER_L, F: OUTER_F, B: OUTER_B,
158
+ Uw: WIDE_Uw, Dw: WIDE_Dw, Rw: WIDE_Rw, Lw: WIDE_Lw, Fw: WIDE_Fw, Bw: WIDE_Bw
159
+ };
160
+ // ---------------------------------------------------------------------------
161
+ // Apply a single move to a state
162
+ // ---------------------------------------------------------------------------
163
+ function applyEffect(state, effect) {
164
+ const cp = new Uint8Array(CORNER_COUNT);
165
+ const co = new Uint8Array(CORNER_COUNT);
166
+ const wp = new Uint8Array(WING_COUNT);
167
+ const centers = new Uint8Array(CENTER_COUNT);
168
+ for (let i = 0; i < CORNER_COUNT; i++) {
169
+ cp[i] = state.cp[effect.cperm[i]];
170
+ co[i] = (state.co[effect.cperm[i]] + effect.corient[i]) % 3;
171
+ }
172
+ for (let i = 0; i < WING_COUNT; i++) {
173
+ wp[i] = state.wp[effect.wperm[i]];
174
+ }
175
+ for (let i = 0; i < CENTER_COUNT; i++) {
176
+ centers[i] = state.centers[effect.ctperm[i]];
177
+ }
178
+ return { cp, co, wp, centers };
179
+ }
180
+ export function parseMove(move) {
181
+ let face;
182
+ let suffix;
183
+ if (move.length >= 2 && move[1] === "w") {
184
+ face = move.slice(0, 2);
185
+ suffix = move.slice(2);
186
+ }
187
+ else {
188
+ face = move[0];
189
+ suffix = move.slice(1);
190
+ }
191
+ const turns = suffix === "2" ? 2 : suffix === "'" ? 3 : 1;
192
+ return { face: face, suffix, turns };
193
+ }
194
+ export function applyCube4Move(state, move) {
195
+ const { face, turns } = parseMove(move);
196
+ const effect = FACE_MOVE_EFFECTS[face];
197
+ let current = state;
198
+ for (let i = 0; i < turns; i++) {
199
+ current = applyEffect(current, effect);
200
+ }
201
+ return current;
202
+ }
203
+ export function applyCube4Algorithm(state, moves) {
204
+ let current = state;
205
+ for (const move of moves) {
206
+ current = applyCube4Move(current, move);
207
+ }
208
+ return current;
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // Move inversion
212
+ // ---------------------------------------------------------------------------
213
+ export function invertCube4Move(move) {
214
+ const { face, suffix } = parseMove(move);
215
+ if (suffix === "2")
216
+ return move;
217
+ return `${face}${suffix === "'" ? "" : "'"}`;
218
+ }
219
+ export function invertCube4Algorithm(moves) {
220
+ return [...moves].reverse().map(invertCube4Move);
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Format / parse
224
+ // ---------------------------------------------------------------------------
225
+ export function formatCube4Algorithm(moves) {
226
+ return moves.join(" ");
227
+ }
228
+ export function parseCube4Algorithm(algorithm) {
229
+ const trimmed = algorithm.trim();
230
+ if (trimmed.length === 0)
231
+ return [];
232
+ return trimmed.split(/\s+/).map(parseCube4Move);
233
+ }
234
+ export function parseCube4Move(value) {
235
+ if (CUBE4_ALL_MOVES.includes(value)) {
236
+ return value;
237
+ }
238
+ throw new Error(`Invalid 4x4 move: ${value}`);
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // Export the raw effects for use by the reduction solver
242
+ // ---------------------------------------------------------------------------
243
+ export { FACE_MOVE_EFFECTS };
@@ -0,0 +1,4 @@
1
+ import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
2
+ export declare const cube4ScrambleGenerator: ScrambleGenerator;
3
+ export declare function generateCube4Scramble(options?: ScrambleOptions): Promise<ScrambleResult>;
4
+ //# sourceMappingURL=scrambler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAU9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BlG"}