@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,5 @@
1
+ import type { Cube3Phase1Tables, Cube3Phase2Tables, Cube3SolverTables } from "./tables.js";
2
+ export declare function loadGeneratedCube3SolverTables(): Promise<Cube3SolverTables>;
3
+ export declare function loadGeneratedCube3Phase1Tables(): Promise<Cube3Phase1Tables>;
4
+ export declare function loadGeneratedCube3Phase2Tables(): Promise<Cube3Phase2Tables>;
5
+ //# sourceMappingURL=generated-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-assets.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/generated-assets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AASrB,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAejF;AAWD,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiBjF;AAED,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAkBjF"}
@@ -0,0 +1,60 @@
1
+ import { getCachedBrowserTables } from "./browser-loader.js";
2
+ let cachedGeneratedTables;
3
+ function isBrowser() {
4
+ return typeof self !== "undefined";
5
+ }
6
+ export async function loadGeneratedCube3SolverTables() {
7
+ if (isBrowser()) {
8
+ const browserTables = getCachedBrowserTables();
9
+ if (browserTables) {
10
+ return browserTables;
11
+ }
12
+ throw new Error("3x3 solver tables are not loaded. " +
13
+ "In browser environments, call `initializeScrambler(baseUrl)` " +
14
+ "before generating scrambles.");
15
+ }
16
+ cachedGeneratedTables ??= await loadNodeTables();
17
+ return cachedGeneratedTables;
18
+ }
19
+ async function loadNodeTables() {
20
+ const loader = await import(
21
+ /* webpackIgnore: true */
22
+ /* @vite-ignore */
23
+ "./node-loader.js");
24
+ return loader.readGeneratedCube3SolverTables();
25
+ }
26
+ export async function loadGeneratedCube3Phase1Tables() {
27
+ const tables = await loadGeneratedCube3SolverTables();
28
+ return {
29
+ phase1Moves: tables.phase1Moves,
30
+ moveTables: {
31
+ cornerOrientation: tables.moveTables.cornerOrientation,
32
+ edgeOrientation: tables.moveTables.edgeOrientation,
33
+ udSlice: tables.moveTables.udSlice
34
+ },
35
+ pruningTables: {
36
+ cornerOrientation: tables.pruningTables.cornerOrientation,
37
+ edgeOrientation: tables.pruningTables.edgeOrientation,
38
+ udSlice: tables.pruningTables.udSlice,
39
+ cornerOrientationEdgeOrientation: tables.pruningTables.cornerOrientationEdgeOrientation
40
+ }
41
+ };
42
+ }
43
+ export async function loadGeneratedCube3Phase2Tables() {
44
+ const tables = await loadGeneratedCube3SolverTables();
45
+ return {
46
+ phase2Moves: tables.phase2Moves,
47
+ moveTables: {
48
+ cornerPermutation: tables.moveTables.cornerPermutation,
49
+ udEdgePermutation: tables.moveTables.udEdgePermutation,
50
+ slicePermutation: tables.moveTables.slicePermutation
51
+ },
52
+ pruningTables: {
53
+ cornerPermutation: tables.pruningTables.cornerPermutation,
54
+ udEdgePermutation: tables.pruningTables.udEdgePermutation,
55
+ slicePermutation: tables.pruningTables.slicePermutation,
56
+ cornerPermutationSlicePermutation: tables.pruningTables.cornerPermutationSlicePermutation,
57
+ udEdgePermutationSlicePermutation: tables.pruningTables.udEdgePermutationSlicePermutation
58
+ }
59
+ };
60
+ }
@@ -0,0 +1,10 @@
1
+ export { applyCube3Phase2Moves, encodeCube3Phase2Coordinates, isCube3Phase2Solved, solveCube3Phase2, solveCube3State, Cube3Phase2SearchError } from "./phase2.js";
2
+ export { applyCube3Phase1Moves, encodeCube3Phase1Coordinates, isCube3Phase1Solved, solveCube3Phase1, Cube3Phase1SearchError } from "./phase1.js";
3
+ export { CUBE3_COORDINATE_RANGES, createRepresentativeStateForCoordinate, decodeCornerOrientation, decodeEdgeOrientation, decodePermutation, decodeSlicePermutation, decodeUdEdgePermutation, decodeUdSlice, encodeCube3Coordinate, encodeCornerOrientation, encodeCube3Coordinates, encodeEdgeOrientation, encodePermutation, encodeSlicePermutation, encodeUdEdgePermutation, encodeUdSlice, moveCoordinate } from "./coordinates.js";
4
+ export { CUBE3_SOLVER_TABLE_METADATA } from "./table-metadata.js";
5
+ export { CUBE3_PHASE1_MOVES, CUBE3_PHASE2_MOVES, checksum, generateCube3Phase1Tables, generateCube3Phase2Tables, generateCube3MoveTable, generateCube3PruningTable, generateCube3SolverTables, loadCube3Phase1Tables, loadCube3Phase2Tables, loadCube3SolverTables, lookupCube3MoveTable } from "./tables.js";
6
+ export type { Cube3Phase2Coordinates, Cube3Phase2Options, Cube3Phase2Result, Cube3SolveOptions, Cube3SolveResult } from "./phase2.js";
7
+ export type { Cube3Phase1Coordinates, Cube3Phase1Options, Cube3Phase1Result } from "./phase1.js";
8
+ export type { Cube3CoordinateState } from "./coordinates.js";
9
+ export type { Cube3CoordinateName, Cube3Phase1Tables, Cube3Phase2Tables, Cube3MoveTable, Cube3PruningTable, Cube3SolverTables } from "./tables.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,sCAAsC,EACtC,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { applyCube3Phase2Moves, encodeCube3Phase2Coordinates, isCube3Phase2Solved, solveCube3Phase2, solveCube3State, Cube3Phase2SearchError } from "./phase2.js";
2
+ export { applyCube3Phase1Moves, encodeCube3Phase1Coordinates, isCube3Phase1Solved, solveCube3Phase1, Cube3Phase1SearchError } from "./phase1.js";
3
+ export { CUBE3_COORDINATE_RANGES, createRepresentativeStateForCoordinate, decodeCornerOrientation, decodeEdgeOrientation, decodePermutation, decodeSlicePermutation, decodeUdEdgePermutation, decodeUdSlice, encodeCube3Coordinate, encodeCornerOrientation, encodeCube3Coordinates, encodeEdgeOrientation, encodePermutation, encodeSlicePermutation, encodeUdEdgePermutation, encodeUdSlice, moveCoordinate } from "./coordinates.js";
4
+ export { CUBE3_SOLVER_TABLE_METADATA } from "./table-metadata.js";
5
+ export { CUBE3_PHASE1_MOVES, CUBE3_PHASE2_MOVES, checksum, generateCube3Phase1Tables, generateCube3Phase2Tables, generateCube3MoveTable, generateCube3PruningTable, generateCube3SolverTables, loadCube3Phase1Tables, loadCube3Phase2Tables, loadCube3SolverTables, lookupCube3MoveTable } from "./tables.js";
@@ -0,0 +1,3 @@
1
+ import type { Cube3SolverTables } from "./tables.js";
2
+ export declare function readGeneratedCube3SolverTables(): Cube3SolverTables;
3
+ //# sourceMappingURL=node-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/node-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAuBrB,wBAAgB,8BAA8B,IAAI,iBAAiB,CAoClE"}
@@ -0,0 +1,120 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ const GENERATED_DIRECTORY = "puzzles/cube3/solver/generated";
5
+ export function readGeneratedCube3SolverTables() {
6
+ const assetDirectory = resolveGeneratedAssetDirectory();
7
+ const manifest = readManifest(assetDirectory);
8
+ return {
9
+ phase1Moves: manifest.phase1Moves,
10
+ phase2Moves: manifest.phase2Moves,
11
+ moveTables: {
12
+ cornerOrientation: readMoveTable(assetDirectory, manifest.moveTables.cornerOrientation),
13
+ edgeOrientation: readMoveTable(assetDirectory, manifest.moveTables.edgeOrientation),
14
+ udSlice: readMoveTable(assetDirectory, manifest.moveTables.udSlice),
15
+ cornerPermutation: readMoveTable(assetDirectory, manifest.moveTables.cornerPermutation),
16
+ udEdgePermutation: readMoveTable(assetDirectory, manifest.moveTables.udEdgePermutation),
17
+ slicePermutation: readMoveTable(assetDirectory, manifest.moveTables.slicePermutation)
18
+ },
19
+ pruningTables: {
20
+ cornerOrientation: readPruningTable(assetDirectory, manifest.pruningTables.cornerOrientation),
21
+ edgeOrientation: readPruningTable(assetDirectory, manifest.pruningTables.edgeOrientation),
22
+ udSlice: readPruningTable(assetDirectory, manifest.pruningTables.udSlice),
23
+ cornerOrientationEdgeOrientation: readPruningTable(assetDirectory, manifest.pruningTables.cornerOrientationEdgeOrientation),
24
+ cornerPermutation: readPruningTable(assetDirectory, manifest.pruningTables.cornerPermutation),
25
+ udEdgePermutation: readPruningTable(assetDirectory, manifest.pruningTables.udEdgePermutation),
26
+ slicePermutation: readPruningTable(assetDirectory, manifest.pruningTables.slicePermutation),
27
+ cornerPermutationSlicePermutation: readPruningTable(assetDirectory, manifest.pruningTables.cornerPermutationSlicePermutation),
28
+ udEdgePermutationSlicePermutation: readPruningTable(assetDirectory, manifest.pruningTables.udEdgePermutationSlicePermutation)
29
+ }
30
+ };
31
+ }
32
+ function readManifest(assetDirectory) {
33
+ const manifestPath = path.join(assetDirectory, "manifest.json");
34
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
35
+ if (manifest.version !== 1) {
36
+ throw new Error(`Unsupported 3x3 solver table manifest version: ${manifest.version}`);
37
+ }
38
+ return manifest;
39
+ }
40
+ function readMoveTable(assetDirectory, entry) {
41
+ const buffer = readFileSync(path.join(assetDirectory, entry.file));
42
+ const expectedBytes = entry.range * entry.moves.length * 4;
43
+ if (buffer.length !== expectedBytes) {
44
+ throw new Error(`Invalid byte size for ${entry.coordinate} move table.`);
45
+ }
46
+ const values = new Int32Array(entry.range * entry.moves.length);
47
+ for (let index = 0; index < values.length; index += 1) {
48
+ values[index] = buffer.readInt32LE(index * 4);
49
+ }
50
+ const table = {
51
+ coordinate: entry.coordinate,
52
+ moves: entry.moves,
53
+ range: entry.range,
54
+ solvedCoordinate: entry.solvedCoordinate,
55
+ values,
56
+ checksum: checksum(values)
57
+ };
58
+ assertChecksum(table.coordinate, table.checksum, entry.checksum);
59
+ return table;
60
+ }
61
+ function readPruningTable(assetDirectory, entry) {
62
+ const buffer = readFileSync(path.join(assetDirectory, entry.file));
63
+ const expectedBytes = Math.ceil(entry.range / 2);
64
+ if (buffer.length !== expectedBytes) {
65
+ throw new Error(`Invalid byte size for ${entry.coordinate} pruning table.`);
66
+ }
67
+ const values = new Uint8Array(buffer);
68
+ const table = {
69
+ coordinate: entry.coordinate,
70
+ moves: entry.moves,
71
+ range: entry.range,
72
+ values,
73
+ checksum: checksum(values),
74
+ maxDepth: entry.maxDepth ?? 0
75
+ };
76
+ assertChecksum(table.coordinate, table.checksum, entry.checksum);
77
+ return table;
78
+ }
79
+ function resolveGeneratedAssetDirectory() {
80
+ const envDirectory = process.env.CUBINGCENTER_SCRAMBLER_TABLES_DIR;
81
+ if (envDirectory && existsSync(path.join(envDirectory, "manifest.json"))) {
82
+ return envDirectory;
83
+ }
84
+ for (const candidate of getAssetDirectoryCandidates()) {
85
+ if (existsSync(path.join(candidate, "manifest.json"))) {
86
+ return candidate;
87
+ }
88
+ }
89
+ throw new Error("Unable to find generated 3x3 solver tables. Run pnpm cube3:tables.");
90
+ }
91
+ function getAssetDirectoryCandidates() {
92
+ const cwd = process.cwd();
93
+ const candidates = [
94
+ path.join(cwd, "src", GENERATED_DIRECTORY),
95
+ path.join(cwd, "dist", GENERATED_DIRECTORY),
96
+ path.join(cwd, "dist-cjs", GENERATED_DIRECTORY)
97
+ ];
98
+ try {
99
+ const requireFromCwd = createRequire(path.join(cwd, "package.json"));
100
+ const packageEntry = requireFromCwd.resolve("@cubingcenter/scrambler");
101
+ candidates.push(path.join(path.dirname(packageEntry), GENERATED_DIRECTORY));
102
+ }
103
+ catch {
104
+ // Source-tree usage is covered by the cwd candidates.
105
+ }
106
+ return candidates;
107
+ }
108
+ function assertChecksum(coordinate, actual, expected) {
109
+ if (actual !== expected) {
110
+ throw new Error(`Checksum mismatch for ${coordinate}: expected ${expected}, received ${actual}.`);
111
+ }
112
+ }
113
+ function checksum(values) {
114
+ let hash = 0x811c9dc5;
115
+ for (let index = 0; index < values.length; index += 1) {
116
+ hash ^= values[index];
117
+ hash = Math.imul(hash, 0x01000193);
118
+ }
119
+ return hash >>> 0;
120
+ }
@@ -0,0 +1,28 @@
1
+ import type { Cube3Move, Cube3State } from "../types.js";
2
+ import type { Cube3Phase1Tables } from "./tables.js";
3
+ export interface Cube3Phase1Coordinates {
4
+ cornerOrientation: number;
5
+ edgeOrientation: number;
6
+ udSlice: number;
7
+ }
8
+ export interface Cube3Phase1Options {
9
+ maxDepth?: number;
10
+ timeoutMs?: number;
11
+ tables?: Cube3Phase1Tables;
12
+ }
13
+ export interface Cube3Phase1Result {
14
+ moves: Cube3Move[];
15
+ depth: number;
16
+ state: Cube3State;
17
+ coordinates: Cube3Phase1Coordinates;
18
+ visitedNodes: number;
19
+ }
20
+ export declare class Cube3Phase1SearchError extends Error {
21
+ readonly visitedNodes: number;
22
+ constructor(message: string, visitedNodes: number);
23
+ }
24
+ export declare function solveCube3Phase1(state: Cube3State, options?: Cube3Phase1Options): Promise<Cube3Phase1Result>;
25
+ export declare function encodeCube3Phase1Coordinates(state: Cube3State): Cube3Phase1Coordinates;
26
+ export declare function isCube3Phase1Solved(input: Cube3State | Cube3Phase1Coordinates, tables: Cube3Phase1Tables): boolean;
27
+ export declare function applyCube3Phase1Moves(state: Cube3State, moves: readonly Cube3Move[]): Cube3State;
28
+ //# sourceMappingURL=phase1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase1.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/phase1.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrD,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,sBAAsB,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAKlD;AA8BD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAoE5B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,UAAU,GAAG,sBAAsB,CAMtF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,GAAG,sBAAsB,EAC1C,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAQT;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,UAAU,CAEZ"}
@@ -0,0 +1,150 @@
1
+ import { applyCube3Algorithm } from "../moves.js";
2
+ import { encodeCornerOrientation, encodeEdgeOrientation, encodeUdSlice } from "./coordinates.js";
3
+ import { loadCube3Phase1Tables, CUBE3_PHASE1_MOVES } from "./tables.js";
4
+ import { getMoveFaceByIndex, shouldSkipCube3SearchMove } from "./search-utils.js";
5
+ export class Cube3Phase1SearchError extends Error {
6
+ visitedNodes;
7
+ constructor(message, visitedNodes) {
8
+ super(message);
9
+ this.name = "Cube3Phase1SearchError";
10
+ this.visitedNodes = visitedNodes;
11
+ }
12
+ }
13
+ const PHASE1_VALID_MOVES = Array.from({ length: 7 }, (_, prevPlusOne) => Array.from({ length: 7 }, (_, prevPrevPlusOne) => {
14
+ const valid = [];
15
+ const prevFace = prevPlusOne - 1;
16
+ const prevPrevFace = prevPrevPlusOne - 1;
17
+ for (let moveIndex = 0; moveIndex < CUBE3_PHASE1_MOVES.length; moveIndex += 1) {
18
+ const face = getMoveFaceByIndex(moveIndex, CUBE3_PHASE1_MOVES);
19
+ if (!shouldSkipCube3SearchMove(face, prevFace, prevPrevFace)) {
20
+ valid.push(moveIndex);
21
+ }
22
+ }
23
+ return valid;
24
+ }));
25
+ export async function solveCube3Phase1(state, options = {}) {
26
+ const tables = options.tables ?? await loadCube3Phase1Tables();
27
+ const maxDepth = options.maxDepth ?? 12;
28
+ const start = encodeCube3Phase1Coordinates(state);
29
+ const deadline = options.timeoutMs === undefined ? undefined : performance.now() + options.timeoutMs;
30
+ const context = {
31
+ tables,
32
+ maxDepth,
33
+ deadline,
34
+ visitedNodes: 0,
35
+ timedOut: false
36
+ };
37
+ if (await isCube3Phase1Solved(start, tables)) {
38
+ return {
39
+ moves: [],
40
+ depth: 0,
41
+ state,
42
+ coordinates: start,
43
+ visitedNodes: 0
44
+ };
45
+ }
46
+ const coeoTable = tables.pruningTables.cornerOrientationEdgeOrientation.values;
47
+ const udPruningTable = tables.pruningTables.udSlice.values;
48
+ const combinedIndex = (start.cornerOrientation << 11) + start.edgeOrientation;
49
+ const coeo = (coeoTable[combinedIndex >> 1] >> ((combinedIndex & 1) << 2)) & 0x0f;
50
+ const udSliceDist = (udPruningTable[start.udSlice >> 1] >> ((start.udSlice & 1) << 2)) & 0x0f;
51
+ const minDepth = coeo > udSliceDist ? coeo : udSliceDist;
52
+ for (let depth = minDepth; depth <= maxDepth; depth += 1) {
53
+ const path = [];
54
+ const solved = searchPhase1(start.cornerOrientation, start.edgeOrientation, start.udSlice, -1, -1, depth, path, context);
55
+ if (solved) {
56
+ const nextState = applyCube3Phase1Moves(state, path);
57
+ const coordinates = encodeCube3Phase1Coordinates(nextState);
58
+ return {
59
+ moves: path,
60
+ depth: path.length,
61
+ state: nextState,
62
+ coordinates,
63
+ visitedNodes: context.visitedNodes
64
+ };
65
+ }
66
+ if (context.timedOut) {
67
+ throw new Cube3Phase1SearchError(`3x3 Phase 1 search timed out after ${options.timeoutMs}ms.`, context.visitedNodes);
68
+ }
69
+ }
70
+ throw new Cube3Phase1SearchError(`3x3 Phase 1 solution not found within depth ${maxDepth}.`, context.visitedNodes);
71
+ }
72
+ export function encodeCube3Phase1Coordinates(state) {
73
+ return {
74
+ cornerOrientation: encodeCornerOrientation(state),
75
+ edgeOrientation: encodeEdgeOrientation(state),
76
+ udSlice: encodeUdSlice(state)
77
+ };
78
+ }
79
+ export function isCube3Phase1Solved(input, tables) {
80
+ const coordinates = isCube3StateLike(input)
81
+ ? encodeCube3Phase1Coordinates(input)
82
+ : input;
83
+ return coordinates.cornerOrientation === 0 &&
84
+ coordinates.edgeOrientation === 0 &&
85
+ coordinates.udSlice === tables.moveTables.udSlice.solvedCoordinate;
86
+ }
87
+ export function applyCube3Phase1Moves(state, moves) {
88
+ return applyCube3Algorithm(state, moves);
89
+ }
90
+ const PHASE1_MOVE_FACES = CUBE3_PHASE1_MOVES.map((move) => {
91
+ const char = move[0];
92
+ return char === "U" ? 0 : char === "D" ? 1 : char === "R" ? 2 : char === "L" ? 3 : char === "F" ? 4 : 5;
93
+ });
94
+ function searchPhase1(cornerOrientation, edgeOrientation, udSlice, previousFace, previousPreviousFace, remainingDepth, path, context) {
95
+ context.visitedNodes += 1;
96
+ if (context.deadline !== undefined && (context.visitedNodes & 1023) === 0 && performance.now() > context.deadline) {
97
+ context.timedOut = true;
98
+ return false;
99
+ }
100
+ if (remainingDepth === 0) {
101
+ return cornerOrientation === 0 &&
102
+ edgeOrientation === 0 &&
103
+ udSlice === context.tables.moveTables.udSlice.solvedCoordinate;
104
+ }
105
+ const moveCount = context.tables.phase1Moves.length;
106
+ const validMoves = PHASE1_VALID_MOVES[previousFace + 1][previousPreviousFace + 1];
107
+ const coTable = context.tables.moveTables.cornerOrientation.values;
108
+ const eoTable = context.tables.moveTables.edgeOrientation.values;
109
+ const udTable = context.tables.moveTables.udSlice.values;
110
+ const coeoTable = context.tables.pruningTables.cornerOrientationEdgeOrientation.values;
111
+ const udPruningTable = context.tables.pruningTables.udSlice.values;
112
+ const coOffset = cornerOrientation * moveCount;
113
+ const eoOffset = edgeOrientation * moveCount;
114
+ const udOffset = udSlice * moveCount;
115
+ for (let i = 0; i < validMoves.length; i += 1) {
116
+ const moveIndex = validMoves[i];
117
+ const nextCornerOrientation = coTable[coOffset + moveIndex];
118
+ const nextEdgeOrientation = eoTable[eoOffset + moveIndex];
119
+ const nextUdSlice = udTable[udOffset + moveIndex];
120
+ const combinedIndex = (nextCornerOrientation << 11) + nextEdgeOrientation;
121
+ const coeo = (coeoTable[combinedIndex >> 1] >> ((combinedIndex & 1) << 2)) & 0x0f;
122
+ const udSliceDist = (udPruningTable[nextUdSlice >> 1] >> ((nextUdSlice & 1) << 2)) & 0x0f;
123
+ const nextLowerBound = coeo > udSliceDist ? coeo : udSliceDist;
124
+ if (nextLowerBound > remainingDepth - 1) {
125
+ continue;
126
+ }
127
+ const face = PHASE1_MOVE_FACES[moveIndex];
128
+ path.push(context.tables.phase1Moves[moveIndex]);
129
+ if (searchPhase1(nextCornerOrientation, nextEdgeOrientation, nextUdSlice, face, previousFace, remainingDepth - 1, path, context)) {
130
+ return true;
131
+ }
132
+ path.pop();
133
+ if (context.timedOut) {
134
+ return false;
135
+ }
136
+ }
137
+ return false;
138
+ }
139
+ function phase1LowerBound(coordinates, tables) {
140
+ const combinedIndex = coordinates.cornerOrientation * tables.moveTables.edgeOrientation.range +
141
+ coordinates.edgeOrientation;
142
+ const coeoTable = tables.pruningTables.cornerOrientationEdgeOrientation.values;
143
+ const udPruningTable = tables.pruningTables.udSlice.values;
144
+ const coeo = (coeoTable[combinedIndex >> 1] >> ((combinedIndex & 1) << 2)) & 0x0f;
145
+ const udSlice = (udPruningTable[coordinates.udSlice >> 1] >> ((coordinates.udSlice & 1) << 2)) & 0x0f;
146
+ return coeo > udSlice ? coeo : udSlice;
147
+ }
148
+ function isCube3StateLike(input) {
149
+ return "corners" in input && "edges" in input;
150
+ }
@@ -0,0 +1,44 @@
1
+ import type { Cube3Move, Cube3State } from "../types.js";
2
+ import type { Cube3Phase1Options, Cube3Phase1Result } from "./phase1.js";
3
+ import type { Cube3Phase2Tables } from "./tables.js";
4
+ export interface Cube3Phase2Coordinates {
5
+ cornerPermutation: number;
6
+ udEdgePermutation: number;
7
+ slicePermutation: number;
8
+ }
9
+ export interface Cube3Phase2Options {
10
+ maxDepth?: number;
11
+ timeoutMs?: number;
12
+ tables?: Cube3Phase2Tables;
13
+ previousFace?: number;
14
+ previousPreviousFace?: number;
15
+ }
16
+ export interface Cube3Phase2Result {
17
+ moves: Cube3Move[];
18
+ depth: number;
19
+ state: Cube3State;
20
+ coordinates: Cube3Phase2Coordinates;
21
+ visitedNodes: number;
22
+ }
23
+ export interface Cube3SolveOptions {
24
+ phase1?: Cube3Phase1Options;
25
+ phase2?: Cube3Phase2Options;
26
+ }
27
+ export interface Cube3SolveResult {
28
+ phase1: Cube3Phase1Result;
29
+ phase2: Cube3Phase2Result;
30
+ moves: Cube3Move[];
31
+ depth: number;
32
+ state: Cube3State;
33
+ visitedNodes: number;
34
+ }
35
+ export declare class Cube3Phase2SearchError extends Error {
36
+ readonly visitedNodes: number;
37
+ constructor(message: string, visitedNodes: number);
38
+ }
39
+ export declare function solveCube3Phase2(state: Cube3State, options?: Cube3Phase2Options): Promise<Cube3Phase2Result>;
40
+ export declare function solveCube3State(state: Cube3State, options?: Cube3SolveOptions): Promise<Cube3SolveResult>;
41
+ export declare function encodeCube3Phase2Coordinates(state: Cube3State): Cube3Phase2Coordinates;
42
+ export declare function isCube3Phase2Solved(input: Cube3State | Cube3Phase2Coordinates): boolean;
43
+ export declare function applyCube3Phase2Moves(state: Cube3State, moves: readonly Cube3Move[]): Cube3State;
44
+ //# sourceMappingURL=phase2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase2.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/phase2.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAcrD,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,sBAAsB,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAKlD;AA6BD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA+E5B;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CA+B3B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,UAAU,GAAG,sBAAsB,CAMtF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,sBAAsB,GAAG,OAAO,CAQvF;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,UAAU,CAEZ"}