@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,21 @@
1
+ {
2
+ "version": 1,
3
+ "files": {
4
+ "permutationTable": {
5
+ "file": "permutation-table.bin",
6
+ "entries": 45360,
7
+ "checksum": 1683412725
8
+ },
9
+ "orientationTable": {
10
+ "file": "orientation-table.bin",
11
+ "entries": 6561,
12
+ "checksum": 1566738619
13
+ },
14
+ "distances": {
15
+ "file": "distances.bin",
16
+ "entries": 1837080,
17
+ "checksum": 2959532459,
18
+ "maxDepth": 11
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ export declare function loadGeneratedCube2SolverTables(): Promise<{
2
+ permutationTable: Uint16Array;
3
+ orientationTable: Uint16Array;
4
+ distances: Uint8Array;
5
+ }>;
6
+ //# sourceMappingURL=generated-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-assets.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/generated-assets.ts"],"names":[],"mappings":"AAYA,wBAAsB,8BAA8B,IAAI,OAAO,CAAC;IAC9D,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAeD"}
@@ -0,0 +1,25 @@
1
+ import { getCachedBrowserTables } from "./browser-loader.js";
2
+ let cachedTables;
3
+ function isBrowser() {
4
+ return typeof self !== "undefined";
5
+ }
6
+ export async function loadGeneratedCube2SolverTables() {
7
+ if (isBrowser()) {
8
+ const browserTables = getCachedBrowserTables();
9
+ if (browserTables) {
10
+ return browserTables;
11
+ }
12
+ throw new Error("2x2 solver tables are not loaded. " +
13
+ "In browser environments, call `initializeScrambler(baseUrl)` " +
14
+ "before generating scrambles.");
15
+ }
16
+ cachedTables ??= await loadNodeTables();
17
+ return cachedTables;
18
+ }
19
+ async function loadNodeTables() {
20
+ const loader = await import(
21
+ /* webpackIgnore: true */
22
+ /* @vite-ignore */
23
+ "./node-loader.js");
24
+ return loader.readGeneratedCube2SolverTables();
25
+ }
@@ -0,0 +1,3 @@
1
+ export { solveCube2State } from "./search.js";
2
+ export type { Cube2Solution } from "./search.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { solveCube2State } from "./search.js";
@@ -0,0 +1,6 @@
1
+ export declare function readGeneratedCube2SolverTables(): {
2
+ permutationTable: Uint16Array;
3
+ orientationTable: Uint16Array;
4
+ distances: Uint8Array;
5
+ };
6
+ //# sourceMappingURL=node-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/node-loader.ts"],"names":[],"mappings":"AAgBA,wBAAgB,8BAA8B,IAAI;IAChD,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,SAAS,EAAE,UAAU,CAAC;CACvB,CAmBA"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { CUBE2_SOLVER_TABLE_METADATA } from "./table-metadata.js";
5
+ const GENERATED_DIRECTORY = "puzzles/cube2/solver/generated";
6
+ export function readGeneratedCube2SolverTables() {
7
+ const assetDirectory = resolveGeneratedAssetDirectory();
8
+ const manifest = JSON.parse(readFileSync(path.join(assetDirectory, "manifest.json"), "utf8"));
9
+ if (manifest.version !== 1) {
10
+ throw new Error(`Unsupported cube2 solver table manifest version: ${manifest.version}`);
11
+ }
12
+ const permutationTable = readUint16Table(assetDirectory, manifest.files.permutationTable, CUBE2_SOLVER_TABLE_METADATA.permutationTable.checksum);
13
+ const orientationTable = readUint16Table(assetDirectory, manifest.files.orientationTable, CUBE2_SOLVER_TABLE_METADATA.orientationTable.checksum);
14
+ const distances = readUint8Table(assetDirectory, manifest.files.distances, CUBE2_SOLVER_TABLE_METADATA.distances.checksum);
15
+ return {
16
+ permutationTable,
17
+ orientationTable,
18
+ distances
19
+ };
20
+ }
21
+ function readUint16Table(assetDirectory, entry, expectedChecksum) {
22
+ const buffer = readFileSync(path.join(assetDirectory, entry.file));
23
+ if (buffer.length !== entry.entries * 2) {
24
+ throw new Error(`Invalid byte size for ${entry.file}`);
25
+ }
26
+ const values = new Uint16Array(entry.entries);
27
+ for (let index = 0; index < values.length; index += 1) {
28
+ values[index] = buffer.readUInt16LE(index * 2);
29
+ }
30
+ assertChecksum(entry.file, checksum(values), expectedChecksum);
31
+ return values;
32
+ }
33
+ function readUint8Table(assetDirectory, entry, expectedChecksum) {
34
+ const buffer = readFileSync(path.join(assetDirectory, entry.file));
35
+ if (buffer.length !== entry.entries) {
36
+ throw new Error(`Invalid byte size for ${entry.file}`);
37
+ }
38
+ const values = new Uint8Array(buffer);
39
+ assertChecksum(entry.file, checksum(values), expectedChecksum);
40
+ return values;
41
+ }
42
+ function resolveGeneratedAssetDirectory() {
43
+ const envDirectory = process.env.CUBINGCENTER_SCRAMBLER_TABLES_DIR;
44
+ if (envDirectory && existsSync(path.join(envDirectory, "manifest.json"))) {
45
+ return envDirectory;
46
+ }
47
+ for (const candidate of getAssetDirectoryCandidates()) {
48
+ if (existsSync(path.join(candidate, "manifest.json"))) {
49
+ return candidate;
50
+ }
51
+ }
52
+ throw new Error("Unable to find generated 2x2 solver tables. Run pnpm cube2:tables.");
53
+ }
54
+ function getAssetDirectoryCandidates() {
55
+ const cwd = process.cwd();
56
+ const candidates = [
57
+ path.join(cwd, "src", GENERATED_DIRECTORY),
58
+ path.join(cwd, "dist", GENERATED_DIRECTORY),
59
+ path.join(cwd, "dist-cjs", GENERATED_DIRECTORY)
60
+ ];
61
+ try {
62
+ const requireFromCwd = createRequire(path.join(cwd, "package.json"));
63
+ const packageEntry = requireFromCwd.resolve("@cubingcenter/scrambler");
64
+ candidates.push(path.join(path.dirname(packageEntry), GENERATED_DIRECTORY));
65
+ }
66
+ catch {
67
+ // Source-tree usage is covered by the cwd candidates.
68
+ }
69
+ return candidates;
70
+ }
71
+ function assertChecksum(file, actual, expected) {
72
+ if (actual !== expected) {
73
+ throw new Error(`Checksum mismatch for ${file}: expected ${expected}, received ${actual}.`);
74
+ }
75
+ }
76
+ function checksum(values) {
77
+ let hash = 0x811c9dc5;
78
+ for (let index = 0; index < values.length; index += 1) {
79
+ hash ^= values[index];
80
+ hash = Math.imul(hash, 0x01000193);
81
+ }
82
+ return hash >>> 0;
83
+ }
@@ -0,0 +1,8 @@
1
+ import type { Cube2Move, Cube2State } from "../types.js";
2
+ export interface Cube2Solution {
3
+ moves: Cube2Move[];
4
+ depth: number;
5
+ state: Cube2State;
6
+ }
7
+ export declare function solveCube2State(state: Cube2State): Promise<Cube2Solution>;
8
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CA6D/E"}
@@ -0,0 +1,50 @@
1
+ import { createSolvedCube2State } from "../state.js";
2
+ import { encodeOrientation, encodePermutation, ensureTablesLoaded, PERMUTATION_TABLE, ORIENTATION_TABLE, DISTANCES, ORIENTATION_COUNT, BFS_MOVES, MOVE_COUNT } from "./tables.js";
3
+ export async function solveCube2State(state) {
4
+ await ensureTablesLoaded();
5
+ if (state.corners.permutation[6] !== 6 || state.corners.orientation[6] !== 0) {
6
+ throw new Error("The 2x2 solver requires the DBL corner (index 6) to be solved " +
7
+ "as the frame of reference. Please normalize the state before solving.");
8
+ }
9
+ const permTable = PERMUTATION_TABLE;
10
+ const orientTable = ORIENTATION_TABLE;
11
+ const distances = DISTANCES;
12
+ let permIndex = encodePermutation(state.corners.permutation);
13
+ let orientIndex = encodeOrientation(state.corners.orientation);
14
+ const moves = [];
15
+ // High-performance branchless inlined lookup
16
+ const initialCombined = permIndex * ORIENTATION_COUNT + orientIndex;
17
+ let distance = (distances[initialCombined >> 1] >> ((initialCombined & 1) << 2)) & 0x0f;
18
+ if (distance === 0) {
19
+ return { moves, depth: 0, state: createSolvedCube2State() };
20
+ }
21
+ while (distance > 0) {
22
+ let foundNext = false;
23
+ const permOffset = permIndex * MOVE_COUNT;
24
+ const orientOffset = orientIndex * MOVE_COUNT;
25
+ const nextDistance = distance - 1;
26
+ for (let m = 0; m < BFS_MOVES.length; m++) {
27
+ const nextPerm = permTable[permOffset + m];
28
+ const nextOrient = orientTable[orientOffset + m];
29
+ // High-performance branchless inlined lookup
30
+ const combined = nextPerm * ORIENTATION_COUNT + nextOrient;
31
+ const nextDist = (distances[combined >> 1] >> ((combined & 1) << 2)) & 0x0f;
32
+ if (nextDist === nextDistance) {
33
+ moves.push(BFS_MOVES[m]);
34
+ permIndex = nextPerm;
35
+ orientIndex = nextOrient;
36
+ distance = nextDistance;
37
+ foundNext = true;
38
+ break;
39
+ }
40
+ }
41
+ if (!foundNext) {
42
+ throw new Error("BFS distance table corrupted or unreachable state.");
43
+ }
44
+ }
45
+ return {
46
+ moves,
47
+ depth: moves.length,
48
+ state: createSolvedCube2State()
49
+ };
50
+ }
@@ -0,0 +1,16 @@
1
+ export declare const CUBE2_SOLVER_TABLE_METADATA: {
2
+ readonly permutationTable: {
3
+ readonly entries: 45360;
4
+ readonly checksum: 1683412725;
5
+ };
6
+ readonly orientationTable: {
7
+ readonly entries: 6561;
8
+ readonly checksum: 1566738619;
9
+ };
10
+ readonly distances: {
11
+ readonly entries: 1837080;
12
+ readonly checksum: 2959532459;
13
+ readonly maxDepth: 11;
14
+ };
15
+ };
16
+ //# sourceMappingURL=table-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-metadata.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/table-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;CAc9B,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const CUBE2_SOLVER_TABLE_METADATA = {
2
+ permutationTable: {
3
+ entries: 45360,
4
+ checksum: 1683412725
5
+ },
6
+ orientationTable: {
7
+ entries: 6561,
8
+ checksum: 1566738619
9
+ },
10
+ distances: {
11
+ entries: 1837080,
12
+ checksum: 2959532459,
13
+ maxDepth: 11
14
+ }
15
+ };
@@ -0,0 +1,14 @@
1
+ export declare const PERMUTATION_COUNT = 5040;
2
+ export declare const ORIENTATION_COUNT = 729;
3
+ export declare const MOVE_COUNT = 9;
4
+ export declare function encodePermutation(permutation: readonly number[]): number;
5
+ export declare function encodeOrientation(orientation: readonly number[]): number;
6
+ export declare let PERMUTATION_TABLE: Uint16Array | null;
7
+ export declare let ORIENTATION_TABLE: Uint16Array | null;
8
+ export declare let DISTANCES: Uint8Array | null;
9
+ export declare function ensureTablesLoaded(): Promise<void>;
10
+ export declare function getDistance(permIndex: number, orientIndex: number): number;
11
+ export declare function getPermutationTransition(move: number, permIndex: number): number;
12
+ export declare function getOrientationTransition(move: number, orientIndex: number): number;
13
+ export declare const BFS_MOVES: readonly string[];
14
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/tables.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,UAAU,IAAI,CAAC;AAM5B,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAexE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAWxE;AAeD,eAAO,IAAI,iBAAiB,EAAE,WAAW,GAAG,IAAW,CAAC;AACxD,eAAO,IAAI,iBAAiB,EAAE,WAAW,GAAG,IAAW,CAAC;AACxD,eAAO,IAAI,SAAS,EAAE,UAAU,GAAG,IAAW,CAAC;AAE/C,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUxD;AAMD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAO1E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlF;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAItC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { loadGeneratedCube2SolverTables } from "./generated-assets.js";
2
+ export const PERMUTATION_COUNT = 5040;
3
+ export const ORIENTATION_COUNT = 729;
4
+ export const MOVE_COUNT = 9;
5
+ // ---------------------------------------------------------------------------
6
+ // Coordinate encoding / decoding
7
+ // ---------------------------------------------------------------------------
8
+ export function encodePermutation(permutation) {
9
+ const perm7 = permutation.filter((_, i) => i !== 6);
10
+ const mapped = perm7.map((x) => (x > 6 ? x - 1 : x));
11
+ let index = 0;
12
+ const available = [0, 1, 2, 3, 4, 5, 6];
13
+ for (let position = 0; position < 7; position += 1) {
14
+ const value = mapped[position];
15
+ const selected = available.indexOf(value);
16
+ index += selected * factorialSmall(6 - position);
17
+ available.splice(selected, 1);
18
+ }
19
+ return index;
20
+ }
21
+ export function encodeOrientation(orientation) {
22
+ const orient7 = orientation.filter((_, i) => i !== 6);
23
+ let index = 0;
24
+ let multiplier = 1;
25
+ for (let position = 5; position >= 0; position -= 1) {
26
+ index += orient7[position] * multiplier;
27
+ multiplier *= 3;
28
+ }
29
+ return index;
30
+ }
31
+ function factorialSmall(n) {
32
+ let result = 1;
33
+ for (let i = 2; i <= n; i += 1) {
34
+ result *= i;
35
+ }
36
+ return result;
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Table loading
40
+ // ---------------------------------------------------------------------------
41
+ let tablesLoaded = false;
42
+ export let PERMUTATION_TABLE = null;
43
+ export let ORIENTATION_TABLE = null;
44
+ export let DISTANCES = null;
45
+ export async function ensureTablesLoaded() {
46
+ if (tablesLoaded) {
47
+ return;
48
+ }
49
+ const tables = await loadGeneratedCube2SolverTables();
50
+ PERMUTATION_TABLE = tables.permutationTable;
51
+ ORIENTATION_TABLE = tables.orientationTable;
52
+ DISTANCES = tables.distances;
53
+ tablesLoaded = true;
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Public API
57
+ // ---------------------------------------------------------------------------
58
+ export function getDistance(permIndex, orientIndex) {
59
+ if (!DISTANCES) {
60
+ throw new Error("Cube2 solver tables not loaded. Call ensureTablesLoaded() first.");
61
+ }
62
+ const combined = permIndex * ORIENTATION_COUNT + orientIndex;
63
+ const byteValue = DISTANCES[combined >> 1];
64
+ return (combined & 1) === 0 ? (byteValue & 0x0f) : (byteValue >> 4);
65
+ }
66
+ export function getPermutationTransition(move, permIndex) {
67
+ if (!PERMUTATION_TABLE) {
68
+ throw new Error("Cube2 solver tables not loaded. Call ensureTablesLoaded() first.");
69
+ }
70
+ return PERMUTATION_TABLE[permIndex * MOVE_COUNT + move];
71
+ }
72
+ export function getOrientationTransition(move, orientIndex) {
73
+ if (!ORIENTATION_TABLE) {
74
+ throw new Error("Cube2 solver tables not loaded. Call ensureTablesLoaded() first.");
75
+ }
76
+ return ORIENTATION_TABLE[orientIndex * MOVE_COUNT + move];
77
+ }
78
+ export const BFS_MOVES = [
79
+ "U", "U2", "U'",
80
+ "R", "R2", "R'",
81
+ "F", "F2", "F'"
82
+ ];
@@ -0,0 +1,6 @@
1
+ import type { Cube2State } from "./types.js";
2
+ export declare function createSolvedCube2State(): Cube2State;
3
+ export declare function cloneCube2State(state: Cube2State): Cube2State;
4
+ export declare function cube2StatesEqual(left: Cube2State, right: Cube2State): boolean;
5
+ export declare function isSolvedCube2State(state: Cube2State): boolean;
6
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,sBAAsB,IAAI,UAAU,CAOnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAO7D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAK7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,30 @@
1
+ import { CORNER_COUNT } from "./types.js";
2
+ export function createSolvedCube2State() {
3
+ return {
4
+ corners: {
5
+ permutation: range(CORNER_COUNT),
6
+ orientation: Array(CORNER_COUNT).fill(0)
7
+ }
8
+ };
9
+ }
10
+ export function cloneCube2State(state) {
11
+ return {
12
+ corners: {
13
+ permutation: [...state.corners.permutation],
14
+ orientation: [...state.corners.orientation]
15
+ }
16
+ };
17
+ }
18
+ export function cube2StatesEqual(left, right) {
19
+ return (arraysEqual(left.corners.permutation, right.corners.permutation) &&
20
+ arraysEqual(left.corners.orientation, right.corners.orientation));
21
+ }
22
+ export function isSolvedCube2State(state) {
23
+ return cube2StatesEqual(state, createSolvedCube2State());
24
+ }
25
+ function range(length) {
26
+ return Array.from({ length }, (_, index) => index);
27
+ }
28
+ function arraysEqual(left, right) {
29
+ return left.length === right.length && left.every((value, index) => value === right[index]);
30
+ }
@@ -0,0 +1,23 @@
1
+ export declare const CORNER_COUNT = 8;
2
+ export type Cube2FaceMove = "U" | "D" | "R" | "L" | "F" | "B";
3
+ export type Cube2Face = "U" | "R" | "F" | "D" | "L" | "B";
4
+ export type Cube2Sticker = Cube2Face;
5
+ export type Cube2MoveSuffix = "" | "2" | "'";
6
+ export type Cube2Move = `${Cube2FaceMove}${Cube2MoveSuffix}`;
7
+ export interface Cube2State {
8
+ corners: {
9
+ permutation: number[];
10
+ orientation: number[];
11
+ };
12
+ }
13
+ export interface Cube2ValidationResult {
14
+ valid: boolean;
15
+ errors: string[];
16
+ }
17
+ export interface Cube2RandomStateOptions {
18
+ seed?: string | number;
19
+ rejectTrivial?: boolean;
20
+ }
21
+ export type Cube2Facelets = Record<Cube2Face, Cube2Sticker[]>;
22
+ export declare const CUBE2_MOVES: readonly Cube2Move[];
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AACrC,MAAM,MAAM,eAAe,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,GAAG,aAAa,GAAG,eAAe,EAAE,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;AAE9D,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAmB3C,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const CORNER_COUNT = 8;
2
+ export const CUBE2_MOVES = [
3
+ "U",
4
+ "U2",
5
+ "U'",
6
+ "D",
7
+ "D2",
8
+ "D'",
9
+ "R",
10
+ "R2",
11
+ "R'",
12
+ "L",
13
+ "L2",
14
+ "L'",
15
+ "F",
16
+ "F2",
17
+ "F'",
18
+ "B",
19
+ "B2",
20
+ "B'"
21
+ ];
@@ -0,0 +1,6 @@
1
+ import type { Cube2State, Cube2ValidationResult } from "./types.js";
2
+ export declare function validateCube2State(state: Cube2State): Cube2ValidationResult;
3
+ export declare function isOneMoveFromSolvedCube2State(state: Cube2State): boolean;
4
+ export declare function isAllowedRandomCube2State(state: Cube2State): 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/cube2/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CAkB3E;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,72 @@
1
+ import { CUBE2_MOVES, CORNER_COUNT } from "./types.js";
2
+ import { applyCube2Move } from "./moves.js";
3
+ import { createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
4
+ export function validateCube2State(state) {
5
+ const errors = [
6
+ ...validatePermutation("corner", state.corners.permutation, CORNER_COUNT),
7
+ ...validateOrientations("corner", state.corners.orientation, CORNER_COUNT, 3)
8
+ ];
9
+ if (errors.length === 0) {
10
+ const cornerOrientation = sum(state.corners.orientation) % 3;
11
+ if (cornerOrientation !== 0) {
12
+ errors.push("Corner orientation sum must be divisible by 3.");
13
+ }
14
+ }
15
+ return {
16
+ valid: errors.length === 0,
17
+ errors
18
+ };
19
+ }
20
+ export function isOneMoveFromSolvedCube2State(state) {
21
+ const solved = createSolvedCube2State();
22
+ return CUBE2_MOVES.some((move) => cube2StatesEqual(applyCube2Move(solved, move), state));
23
+ }
24
+ export function isAllowedRandomCube2State(state) {
25
+ return validateCube2State(state).valid &&
26
+ !isSolvedCube2State(state) &&
27
+ !isOneMoveFromSolvedCube2State(state);
28
+ }
29
+ export function permutationParity(permutation) {
30
+ let inversions = 0;
31
+ for (let left = 0; left < permutation.length; left += 1) {
32
+ for (let right = left + 1; right < permutation.length; right += 1) {
33
+ if (permutation[left] > permutation[right]) {
34
+ inversions += 1;
35
+ }
36
+ }
37
+ }
38
+ return (inversions % 2);
39
+ }
40
+ function validatePermutation(label, permutation, length) {
41
+ const errors = [];
42
+ const seen = new Set();
43
+ if (permutation.length !== length) {
44
+ errors.push(`${label} permutation must contain ${length} values.`);
45
+ }
46
+ for (const value of permutation) {
47
+ if (!Number.isInteger(value) || value < 0 || value >= length) {
48
+ errors.push(`${label} permutation contains out-of-range value: ${value}.`);
49
+ continue;
50
+ }
51
+ if (seen.has(value)) {
52
+ errors.push(`${label} permutation contains duplicate value: ${value}.`);
53
+ }
54
+ seen.add(value);
55
+ }
56
+ return errors;
57
+ }
58
+ function validateOrientations(label, orientations, length, modulo) {
59
+ const errors = [];
60
+ if (orientations.length !== length) {
61
+ errors.push(`${label} orientation must contain ${length} values.`);
62
+ }
63
+ for (const value of orientations) {
64
+ if (!Number.isInteger(value) || value < 0 || value >= modulo) {
65
+ errors.push(`${label} orientation contains out-of-range value: ${value}.`);
66
+ }
67
+ }
68
+ return errors;
69
+ }
70
+ function sum(values) {
71
+ return values.reduce((total, value) => total + value, 0);
72
+ }
@@ -0,0 +1,5 @@
1
+ import type { Cube3Face, Cube3Facelets, Cube3State } from "./types.js";
2
+ export declare function toCube3Facelets(state: Cube3State): Cube3Facelets;
3
+ export declare function formatCube3Facelets(facelets: Cube3Facelets): string;
4
+ export declare function getCube3FaceOrder(): readonly Cube3Face[];
5
+ //# sourceMappingURL=facelets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facelets.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/facelets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AA0DrF,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CA8BhE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,IAAI,SAAS,SAAS,EAAE,CAExD"}