@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,279 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cube3Phase2SearchError = void 0;
4
+ exports.solveCube3Phase2 = solveCube3Phase2;
5
+ exports.solveCube3State = solveCube3State;
6
+ exports.encodeCube3Phase2Coordinates = encodeCube3Phase2Coordinates;
7
+ exports.isCube3Phase2Solved = isCube3Phase2Solved;
8
+ exports.applyCube3Phase2Moves = applyCube3Phase2Moves;
9
+ const moves_js_1 = require("../moves.js");
10
+ const state_js_1 = require("../state.js");
11
+ const coordinates_js_1 = require("./coordinates.js");
12
+ const phase1_js_1 = require("./phase1.js");
13
+ const tables_js_1 = require("./tables.js");
14
+ const search_utils_js_1 = require("./search-utils.js");
15
+ class Cube3Phase2SearchError extends Error {
16
+ visitedNodes;
17
+ constructor(message, visitedNodes) {
18
+ super(message);
19
+ this.name = "Cube3Phase2SearchError";
20
+ this.visitedNodes = visitedNodes;
21
+ }
22
+ }
23
+ exports.Cube3Phase2SearchError = Cube3Phase2SearchError;
24
+ const PHASE2_VALID_MOVES = Array.from({ length: 7 }, (_, prevPlusOne) => Array.from({ length: 7 }, (_, prevPrevPlusOne) => {
25
+ const valid = [];
26
+ const prevFace = prevPlusOne - 1;
27
+ const prevPrevFace = prevPrevPlusOne - 1;
28
+ for (let moveIndex = 0; moveIndex < tables_js_1.CUBE3_PHASE2_MOVES.length; moveIndex += 1) {
29
+ const face = (0, search_utils_js_1.getMoveFaceByIndex)(moveIndex, tables_js_1.CUBE3_PHASE2_MOVES);
30
+ if (!(0, search_utils_js_1.shouldSkipCube3SearchMove)(face, prevFace, prevPrevFace)) {
31
+ valid.push(moveIndex);
32
+ }
33
+ }
34
+ return valid;
35
+ }));
36
+ async function solveCube3Phase2(state, options = {}) {
37
+ if ((0, state_js_1.isSolvedCube3State)(state)) {
38
+ const coordinates = encodeCube3Phase2Coordinates(state);
39
+ return {
40
+ moves: [],
41
+ depth: 0,
42
+ state,
43
+ coordinates,
44
+ visitedNodes: 0
45
+ };
46
+ }
47
+ const phase1Tables = await (0, tables_js_1.loadCube3Phase1Tables)();
48
+ if (!(0, phase1_js_1.isCube3Phase1Solved)(state, phase1Tables)) {
49
+ throw new Cube3Phase2SearchError("3x3 Phase 2 requires a state already in G1.", 0);
50
+ }
51
+ const tables = options.tables ?? await (0, tables_js_1.loadCube3Phase2Tables)();
52
+ const maxDepth = options.maxDepth ?? 18;
53
+ const start = encodeCube3Phase2Coordinates(state);
54
+ const deadline = options.timeoutMs === undefined ? undefined : performance.now() + options.timeoutMs;
55
+ const context = {
56
+ tables,
57
+ deadline,
58
+ visitedNodes: 0,
59
+ timedOut: false
60
+ };
61
+ const spRange = tables.moveTables.slicePermutation.range;
62
+ const cpspTable = tables.pruningTables.cornerPermutationSlicePermutation.values;
63
+ const epspTable = tables.pruningTables.udEdgePermutationSlicePermutation.values;
64
+ const combinedCPIndex = start.cornerPermutation * spRange + start.slicePermutation;
65
+ const combinedEPIndex = start.udEdgePermutation * spRange + start.slicePermutation;
66
+ const cpDist = (cpspTable[combinedCPIndex >> 1] >> ((combinedCPIndex & 1) << 2)) & 0x0f;
67
+ const epDist = (epspTable[combinedEPIndex >> 1] >> ((combinedEPIndex & 1) << 2)) & 0x0f;
68
+ const minDepth = cpDist > epDist ? cpDist : epDist;
69
+ const initialPreviousFace = options.previousFace ?? -1;
70
+ const initialPreviousPreviousFace = options.previousPreviousFace ?? -1;
71
+ for (let depth = minDepth; depth <= maxDepth; depth += 1) {
72
+ const path = [];
73
+ const solved = searchPhase2(start.cornerPermutation, start.udEdgePermutation, start.slicePermutation, initialPreviousFace, initialPreviousPreviousFace, depth, path, context);
74
+ if (solved) {
75
+ const nextState = applyCube3Phase2Moves(state, path);
76
+ const coordinates = encodeCube3Phase2Coordinates(nextState);
77
+ return {
78
+ moves: path,
79
+ depth: path.length,
80
+ state: nextState,
81
+ coordinates,
82
+ visitedNodes: context.visitedNodes
83
+ };
84
+ }
85
+ if (context.timedOut) {
86
+ throw new Cube3Phase2SearchError(`3x3 Phase 2 search timed out after ${options.timeoutMs}ms.`, context.visitedNodes);
87
+ }
88
+ }
89
+ throw new Cube3Phase2SearchError(`3x3 Phase 2 solution not found within depth ${maxDepth}.`, context.visitedNodes);
90
+ }
91
+ async function solveCube3State(state, options = {}) {
92
+ const phase1 = await (0, phase1_js_1.solveCube3Phase1)(state, options.phase1);
93
+ let previousFace = -1;
94
+ let previousPreviousFace = -1;
95
+ if (phase1.moves.length > 0) {
96
+ const lastMove = phase1.moves[phase1.moves.length - 1];
97
+ previousFace = (0, search_utils_js_1.getMoveFace)(lastMove);
98
+ if (phase1.moves.length > 1) {
99
+ const prevMove = phase1.moves[phase1.moves.length - 2];
100
+ previousPreviousFace = (0, search_utils_js_1.getMoveFace)(prevMove);
101
+ }
102
+ }
103
+ const phase2Options = {
104
+ ...options.phase2,
105
+ previousFace,
106
+ previousPreviousFace
107
+ };
108
+ const phase2 = await solveCube3Phase2(phase1.state, phase2Options);
109
+ const moves = [...phase1.moves, ...phase2.moves];
110
+ return {
111
+ phase1,
112
+ phase2,
113
+ moves,
114
+ depth: moves.length,
115
+ state: phase2.state,
116
+ visitedNodes: phase1.visitedNodes + phase2.visitedNodes
117
+ };
118
+ }
119
+ function encodeCube3Phase2Coordinates(state) {
120
+ return {
121
+ cornerPermutation: encodeCornerPermutationForPhase2(state),
122
+ udEdgePermutation: (0, coordinates_js_1.encodeUdEdgePermutation)(state),
123
+ slicePermutation: (0, coordinates_js_1.encodeSlicePermutation)(state)
124
+ };
125
+ }
126
+ function isCube3Phase2Solved(input) {
127
+ const coordinates = isCube3StateLike(input)
128
+ ? encodeCube3Phase2Coordinates(input)
129
+ : input;
130
+ return coordinates.cornerPermutation === 0 &&
131
+ coordinates.udEdgePermutation === 0 &&
132
+ coordinates.slicePermutation === 0;
133
+ }
134
+ function applyCube3Phase2Moves(state, moves) {
135
+ return (0, moves_js_1.applyCube3Algorithm)(state, moves);
136
+ }
137
+ const PHASE2_MOVE_FACES = tables_js_1.CUBE3_PHASE2_MOVES.map((move) => {
138
+ const char = move[0];
139
+ return char === "U" ? 0 : char === "D" ? 1 : char === "R" ? 2 : char === "L" ? 3 : char === "F" ? 4 : 5;
140
+ });
141
+ function searchPhase2(cornerPermutation, udEdgePermutation, slicePermutation, previousFace, previousPreviousFace, remainingDepth, path, context) {
142
+ context.visitedNodes += 1;
143
+ if (context.deadline !== undefined && (context.visitedNodes & 1023) === 0 && performance.now() > context.deadline) {
144
+ context.timedOut = true;
145
+ return false;
146
+ }
147
+ if (remainingDepth === 0) {
148
+ return cornerPermutation === 0 &&
149
+ udEdgePermutation === 0 &&
150
+ slicePermutation === 0;
151
+ }
152
+ const moveCount = context.tables.phase2Moves.length;
153
+ const validMoves = PHASE2_VALID_MOVES[previousFace + 1][previousPreviousFace + 1];
154
+ const cpTable = context.tables.moveTables.cornerPermutation.values;
155
+ const epTable = context.tables.moveTables.udEdgePermutation.values;
156
+ const spTable = context.tables.moveTables.slicePermutation.values;
157
+ const spRange = context.tables.moveTables.slicePermutation.range;
158
+ const cpspTable = context.tables.pruningTables.cornerPermutationSlicePermutation.values;
159
+ const epspTable = context.tables.pruningTables.udEdgePermutationSlicePermutation.values;
160
+ const cpOffset = cornerPermutation * moveCount;
161
+ const epOffset = udEdgePermutation * moveCount;
162
+ const spOffset = slicePermutation * moveCount;
163
+ for (let i = 0; i < validMoves.length; i += 1) {
164
+ const moveIndex = validMoves[i];
165
+ const nextCornerPermutation = cpTable[cpOffset + moveIndex];
166
+ const nextUdEdgePermutation = epTable[epOffset + moveIndex];
167
+ const nextSlicePermutation = spTable[spOffset + moveIndex];
168
+ const combinedCPIndex = nextCornerPermutation * spRange + nextSlicePermutation;
169
+ const combinedEPIndex = nextUdEdgePermutation * spRange + nextSlicePermutation;
170
+ const cpDist = (cpspTable[combinedCPIndex >> 1] >> ((combinedCPIndex & 1) << 2)) & 0x0f;
171
+ const epDist = (epspTable[combinedEPIndex >> 1] >> ((combinedEPIndex & 1) << 2)) & 0x0f;
172
+ const nextLowerBound = cpDist > epDist ? cpDist : epDist;
173
+ if (nextLowerBound > remainingDepth - 1) {
174
+ continue;
175
+ }
176
+ const face = PHASE2_MOVE_FACES[moveIndex];
177
+ path.push(context.tables.phase2Moves[moveIndex]);
178
+ if (searchPhase2(nextCornerPermutation, nextUdEdgePermutation, nextSlicePermutation, face, previousFace, remainingDepth - 1, path, context)) {
179
+ return true;
180
+ }
181
+ path.pop();
182
+ if (context.timedOut) {
183
+ return false;
184
+ }
185
+ }
186
+ return false;
187
+ }
188
+ function phase2LowerBound(coordinates, tables) {
189
+ const combinedCPIndex = coordinates.cornerPermutation * tables.moveTables.slicePermutation.range +
190
+ coordinates.slicePermutation;
191
+ const combinedEPIndex = coordinates.udEdgePermutation * tables.moveTables.slicePermutation.range +
192
+ coordinates.slicePermutation;
193
+ const cpspTable = tables.pruningTables.cornerPermutationSlicePermutation.values;
194
+ const epspTable = tables.pruningTables.udEdgePermutationSlicePermutation.values;
195
+ const cp = (cpspTable[combinedCPIndex >> 1] >> ((combinedCPIndex & 1) << 2)) & 0x0f;
196
+ const ep = (epspTable[combinedEPIndex >> 1] >> ((combinedEPIndex & 1) << 2)) & 0x0f;
197
+ return cp > ep ? cp : ep;
198
+ }
199
+ function encodeCornerPermutationForPhase2(state) {
200
+ return (0, coordinates_js_1.encodePermutation)(state.corners.permutation);
201
+ }
202
+ function isCube3StateLike(input) {
203
+ return "corners" in input && "edges" in input;
204
+ }
205
+ const PHASE1_VALID_MOVES = Array.from({ length: 7 }, (_, prevPlusOne) => Array.from({ length: 7 }, (_, prevPrevPlusOne) => {
206
+ const valid = [];
207
+ const prevFace = prevPlusOne - 1;
208
+ const prevPrevFace = prevPrevPlusOne - 1;
209
+ for (let moveIndex = 0; moveIndex < tables_js_1.CUBE3_PHASE1_MOVES.length; moveIndex += 1) {
210
+ const face = (0, search_utils_js_1.getMoveFaceByIndex)(moveIndex, tables_js_1.CUBE3_PHASE1_MOVES);
211
+ if (!(0, search_utils_js_1.shouldSkipCube3SearchMove)(face, prevFace, prevPrevFace)) {
212
+ valid.push(moveIndex);
213
+ }
214
+ }
215
+ return valid;
216
+ }));
217
+ function searchPhase1Interleaved(cornerOrientation, edgeOrientation, udSlice, previousFace, previousPreviousFace, remainingDepth, path, context) {
218
+ context.visitedNodes += 1;
219
+ if (context.deadline !== undefined && (context.visitedNodes & 1023) === 0 && performance.now() > context.deadline) {
220
+ context.timedOut = true;
221
+ return false;
222
+ }
223
+ if (remainingDepth === 0) {
224
+ const g1State = applyCube3Phase2Moves(context.originalState, path);
225
+ const start2 = encodeCube3Phase2Coordinates(g1State);
226
+ const maxPhase2Depth = 6;
227
+ const phase2Context = {
228
+ tables: context.phase2Tables,
229
+ deadline: context.deadline,
230
+ visitedNodes: 0,
231
+ timedOut: false
232
+ };
233
+ for (let d2 = 0; d2 <= maxPhase2Depth; d2 += 1) {
234
+ const path2 = [];
235
+ const solved2 = searchPhase2(start2.cornerPermutation, start2.udEdgePermutation, start2.slicePermutation, -1, -1, d2, path2, phase2Context);
236
+ if (solved2) {
237
+ context.finalPhase1Moves = [...path];
238
+ context.finalPhase2Moves = path2;
239
+ context.visitedNodes += phase2Context.visitedNodes;
240
+ return true;
241
+ }
242
+ }
243
+ context.visitedNodes += phase2Context.visitedNodes;
244
+ return false;
245
+ }
246
+ const moveCount = context.phase1Tables.phase1Moves.length;
247
+ const validMoves = PHASE1_VALID_MOVES[previousFace + 1][previousPreviousFace + 1];
248
+ const coTable = context.phase1Tables.moveTables.cornerOrientation.values;
249
+ const eoTable = context.phase1Tables.moveTables.edgeOrientation.values;
250
+ const udTable = context.phase1Tables.moveTables.udSlice.values;
251
+ const coeoTable = context.phase1Tables.pruningTables.cornerOrientationEdgeOrientation.values;
252
+ const udPruningTable = context.phase1Tables.pruningTables.udSlice.values;
253
+ const coOffset = cornerOrientation * moveCount;
254
+ const eoOffset = edgeOrientation * moveCount;
255
+ const udOffset = udSlice * moveCount;
256
+ for (let i = 0; i < validMoves.length; i += 1) {
257
+ const moveIndex = validMoves[i];
258
+ const nextCornerOrientation = coTable[coOffset + moveIndex];
259
+ const nextEdgeOrientation = eoTable[eoOffset + moveIndex];
260
+ const nextUdSlice = udTable[udOffset + moveIndex];
261
+ const combinedIndex = (nextCornerOrientation << 11) + nextEdgeOrientation;
262
+ const coeo = (coeoTable[combinedIndex >> 1] >> ((combinedIndex & 1) << 2)) & 0x0f;
263
+ const udSliceDist = (udPruningTable[nextUdSlice >> 1] >> ((nextUdSlice & 1) << 2)) & 0x0f;
264
+ const nextLowerBound = coeo > udSliceDist ? coeo : udSliceDist;
265
+ if (nextLowerBound > remainingDepth - 1) {
266
+ continue;
267
+ }
268
+ const face = (0, search_utils_js_1.getMoveFaceByIndex)(moveIndex, context.phase1Tables.phase1Moves);
269
+ path.push(context.phase1Tables.phase1Moves[moveIndex]);
270
+ if (searchPhase1Interleaved(nextCornerOrientation, nextEdgeOrientation, nextUdSlice, face, previousFace, remainingDepth - 1, path, context)) {
271
+ return true;
272
+ }
273
+ path.pop();
274
+ if (context.timedOut) {
275
+ return false;
276
+ }
277
+ }
278
+ return false;
279
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ARE_OPPOSITE_FACES = void 0;
4
+ exports.getMoveFace = getMoveFace;
5
+ exports.getMoveFaceByIndex = getMoveFaceByIndex;
6
+ exports.areOppositeFaces = areOppositeFaces;
7
+ exports.shouldSkipCube3SearchMove = shouldSkipCube3SearchMove;
8
+ exports.lookupMoveTableByIndex = lookupMoveTableByIndex;
9
+ // Face indices: U=0, D=1, R=2, L=3, F=4, B=5
10
+ const FACE_INDEX_BY_CHAR = {
11
+ U: 0,
12
+ D: 1,
13
+ R: 2,
14
+ L: 3,
15
+ F: 4,
16
+ B: 5
17
+ };
18
+ function getMoveFace(move) {
19
+ return FACE_INDEX_BY_CHAR[move[0]];
20
+ }
21
+ function getMoveFaceByIndex(moveIndex, moves) {
22
+ return FACE_INDEX_BY_CHAR[moves[moveIndex][0]];
23
+ }
24
+ exports.ARE_OPPOSITE_FACES = [
25
+ false, true, false, false, false, false,
26
+ true, false, false, false, false, false,
27
+ false, false, false, true, false, false,
28
+ false, false, true, false, false, false,
29
+ false, false, false, false, false, true,
30
+ false, false, false, false, true, false
31
+ ];
32
+ function areOppositeFaces(left, right) {
33
+ return exports.ARE_OPPOSITE_FACES[left * 6 + right];
34
+ }
35
+ function shouldSkipCube3SearchMove(face, previousFace, previousPreviousFace) {
36
+ if (previousFace === undefined || previousFace === -1) {
37
+ return false;
38
+ }
39
+ if (face === previousFace) {
40
+ return true;
41
+ }
42
+ if (previousPreviousFace === face && areOppositeFaces(face, previousFace)) {
43
+ return true;
44
+ }
45
+ return areOppositeFaces(face, previousFace) && face < previousFace;
46
+ }
47
+ function lookupMoveTableByIndex(values, coordinate, moveIndex, moveCount) {
48
+ return values[coordinate * moveCount + moveIndex];
49
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CUBE3_SOLVER_TABLE_METADATA = void 0;
4
+ exports.CUBE3_SOLVER_TABLE_METADATA = {
5
+ moveTables: {
6
+ cornerOrientation: { range: 2187, moves: 18, solvedCoordinate: 0, checksum: 404550471 },
7
+ edgeOrientation: { range: 2048, moves: 18, solvedCoordinate: 0, checksum: 2992539525 },
8
+ udSlice: { range: 495, moves: 18, solvedCoordinate: 494, checksum: 4272096359 },
9
+ cornerPermutation: { range: 40320, moves: 10, solvedCoordinate: 0, checksum: 3774927605 },
10
+ udEdgePermutation: { range: 40320, moves: 10, solvedCoordinate: 0, checksum: 400302421 },
11
+ slicePermutation: { range: 24, moves: 10, solvedCoordinate: 0, checksum: 3510358217 }
12
+ },
13
+ pruningTables: {
14
+ cornerOrientation: { range: 2187, moves: 18, checksum: 1708398310, maxDepth: 6 },
15
+ edgeOrientation: { range: 2048, moves: 18, checksum: 1305811170, maxDepth: 7 },
16
+ udSlice: { range: 495, moves: 18, checksum: 1205412689, maxDepth: 5 },
17
+ cornerOrientationEdgeOrientation: { range: 4478976, moves: 18, checksum: 3003139252, maxDepth: 9 },
18
+ cornerPermutation: { range: 40320, moves: 10, checksum: 2124468218, maxDepth: 13 },
19
+ udEdgePermutation: { range: 40320, moves: 10, checksum: 3536968007, maxDepth: 8 },
20
+ slicePermutation: { range: 24, moves: 10, checksum: 2803408469, maxDepth: 4 },
21
+ cornerPermutationSlicePermutation: { range: 967680, moves: 10, checksum: 4187188769, maxDepth: 14 },
22
+ udEdgePermutationSlicePermutation: { range: 967680, moves: 10, checksum: 2840452350, maxDepth: 12 }
23
+ }
24
+ };
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CUBE3_PHASE2_MOVES = exports.CUBE3_PHASE1_MOVES = void 0;
4
+ exports.loadCube3SolverTables = loadCube3SolverTables;
5
+ exports.loadCube3Phase1Tables = loadCube3Phase1Tables;
6
+ exports.loadCube3Phase2Tables = loadCube3Phase2Tables;
7
+ exports.generateCube3Phase1Tables = generateCube3Phase1Tables;
8
+ exports.generateCube3SolverTables = generateCube3SolverTables;
9
+ exports.generateCube3Phase2Tables = generateCube3Phase2Tables;
10
+ exports.generateCube3MoveTable = generateCube3MoveTable;
11
+ exports.generateCube3PruningTable = generateCube3PruningTable;
12
+ exports.generateCube3CombinedPruningTable = generateCube3CombinedPruningTable;
13
+ exports.lookupCube3MoveTable = lookupCube3MoveTable;
14
+ exports.checksum = checksum;
15
+ const types_js_1 = require("../types.js");
16
+ const coordinates_js_1 = require("./coordinates.js");
17
+ const state_js_1 = require("../state.js");
18
+ const generated_assets_js_1 = require("./generated-assets.js");
19
+ exports.CUBE3_PHASE1_MOVES = types_js_1.CUBE3_MOVES;
20
+ exports.CUBE3_PHASE2_MOVES = [
21
+ "U",
22
+ "U2",
23
+ "U'",
24
+ "D",
25
+ "D2",
26
+ "D'",
27
+ "R2",
28
+ "L2",
29
+ "F2",
30
+ "B2"
31
+ ];
32
+ let cachedTables;
33
+ let cachedPhase1Tables;
34
+ let cachedPhase2Tables;
35
+ async function loadCube3SolverTables() {
36
+ cachedTables ??= await (0, generated_assets_js_1.loadGeneratedCube3SolverTables)();
37
+ return cachedTables;
38
+ }
39
+ async function loadCube3Phase1Tables() {
40
+ cachedPhase1Tables ??= await (0, generated_assets_js_1.loadGeneratedCube3Phase1Tables)();
41
+ return cachedPhase1Tables;
42
+ }
43
+ async function loadCube3Phase2Tables() {
44
+ cachedPhase2Tables ??= await (0, generated_assets_js_1.loadGeneratedCube3Phase2Tables)();
45
+ return cachedPhase2Tables;
46
+ }
47
+ function generateCube3Phase1Tables() {
48
+ const cornerOrientation = generateCube3MoveTable("cornerOrientation", coordinates_js_1.CUBE3_COORDINATE_RANGES.cornerOrientation, exports.CUBE3_PHASE1_MOVES);
49
+ const edgeOrientation = generateCube3MoveTable("edgeOrientation", coordinates_js_1.CUBE3_COORDINATE_RANGES.edgeOrientation, exports.CUBE3_PHASE1_MOVES);
50
+ const udSlice = generateCube3MoveTable("udSlice", coordinates_js_1.CUBE3_COORDINATE_RANGES.udSlice, exports.CUBE3_PHASE1_MOVES);
51
+ return {
52
+ phase1Moves: exports.CUBE3_PHASE1_MOVES,
53
+ moveTables: {
54
+ cornerOrientation,
55
+ edgeOrientation,
56
+ udSlice
57
+ },
58
+ pruningTables: {
59
+ cornerOrientation: generateCube3PruningTable(cornerOrientation),
60
+ edgeOrientation: generateCube3PruningTable(edgeOrientation),
61
+ udSlice: generateCube3PruningTable(udSlice),
62
+ cornerOrientationEdgeOrientation: generateCube3CombinedPruningTable(cornerOrientation, edgeOrientation)
63
+ }
64
+ };
65
+ }
66
+ function generateCube3SolverTables() {
67
+ const phase1Tables = generateCube3Phase1Tables();
68
+ const phase2Tables = generateCube3Phase2Tables();
69
+ return {
70
+ phase1Moves: exports.CUBE3_PHASE1_MOVES,
71
+ phase2Moves: exports.CUBE3_PHASE2_MOVES,
72
+ moveTables: {
73
+ cornerOrientation: phase1Tables.moveTables.cornerOrientation,
74
+ edgeOrientation: phase1Tables.moveTables.edgeOrientation,
75
+ udSlice: phase1Tables.moveTables.udSlice,
76
+ cornerPermutation: phase2Tables.moveTables.cornerPermutation,
77
+ udEdgePermutation: phase2Tables.moveTables.udEdgePermutation,
78
+ slicePermutation: phase2Tables.moveTables.slicePermutation
79
+ },
80
+ pruningTables: {
81
+ cornerOrientation: phase1Tables.pruningTables.cornerOrientation,
82
+ edgeOrientation: phase1Tables.pruningTables.edgeOrientation,
83
+ udSlice: phase1Tables.pruningTables.udSlice,
84
+ cornerOrientationEdgeOrientation: phase1Tables.pruningTables.cornerOrientationEdgeOrientation,
85
+ cornerPermutation: phase2Tables.pruningTables.cornerPermutation,
86
+ udEdgePermutation: phase2Tables.pruningTables.udEdgePermutation,
87
+ slicePermutation: phase2Tables.pruningTables.slicePermutation,
88
+ cornerPermutationSlicePermutation: phase2Tables.pruningTables.cornerPermutationSlicePermutation,
89
+ udEdgePermutationSlicePermutation: phase2Tables.pruningTables.udEdgePermutationSlicePermutation
90
+ }
91
+ };
92
+ }
93
+ function generateCube3Phase2Tables() {
94
+ const cornerPermutation = generateCube3MoveTable("cornerPermutation", coordinates_js_1.CUBE3_COORDINATE_RANGES.cornerPermutation, exports.CUBE3_PHASE2_MOVES);
95
+ const udEdgePermutation = generateCube3MoveTable("udEdgePermutation", coordinates_js_1.CUBE3_COORDINATE_RANGES.udEdgePermutation, exports.CUBE3_PHASE2_MOVES);
96
+ const slicePermutation = generateCube3MoveTable("slicePermutation", coordinates_js_1.CUBE3_COORDINATE_RANGES.slicePermutation, exports.CUBE3_PHASE2_MOVES);
97
+ return {
98
+ phase2Moves: exports.CUBE3_PHASE2_MOVES,
99
+ moveTables: {
100
+ cornerPermutation,
101
+ udEdgePermutation,
102
+ slicePermutation
103
+ },
104
+ pruningTables: {
105
+ cornerPermutation: generateCube3PruningTable(cornerPermutation),
106
+ udEdgePermutation: generateCube3PruningTable(udEdgePermutation),
107
+ slicePermutation: generateCube3PruningTable(slicePermutation),
108
+ cornerPermutationSlicePermutation: generateCube3CombinedPruningTable(cornerPermutation, slicePermutation),
109
+ udEdgePermutationSlicePermutation: generateCube3CombinedPruningTable(udEdgePermutation, slicePermutation)
110
+ }
111
+ };
112
+ }
113
+ function generateCube3MoveTable(coordinate, range, moves) {
114
+ const values = new Int32Array(range * moves.length);
115
+ for (let value = 0; value < range; value += 1) {
116
+ for (let moveIndex = 0; moveIndex < moves.length; moveIndex += 1) {
117
+ values[value * moves.length + moveIndex] = (0, coordinates_js_1.moveCoordinate)(coordinate, value, moves[moveIndex]);
118
+ }
119
+ }
120
+ return {
121
+ coordinate,
122
+ moves,
123
+ range,
124
+ solvedCoordinate: (0, coordinates_js_1.encodeCube3Coordinates)((0, state_js_1.createSolvedCube3State)())[coordinate],
125
+ values,
126
+ checksum: checksum(values)
127
+ };
128
+ }
129
+ function generateCube3PruningTable(moveTable) {
130
+ const values = new Uint8Array(moveTable.range);
131
+ values.fill(255);
132
+ values[moveTable.solvedCoordinate] = 0;
133
+ const queue = new Int32Array(moveTable.range);
134
+ let read = 0;
135
+ let write = 1;
136
+ queue[0] = moveTable.solvedCoordinate;
137
+ let maxDepth = 0;
138
+ while (read < write) {
139
+ const current = queue[read];
140
+ read += 1;
141
+ const nextDepth = values[current] + 1;
142
+ for (let moveIndex = 0; moveIndex < moveTable.moves.length; moveIndex += 1) {
143
+ const next = moveTable.values[current * moveTable.moves.length + moveIndex];
144
+ if (values[next] !== 255) {
145
+ continue;
146
+ }
147
+ values[next] = nextDepth;
148
+ maxDepth = Math.max(maxDepth, nextDepth);
149
+ queue[write] = next;
150
+ write += 1;
151
+ }
152
+ }
153
+ return {
154
+ coordinate: moveTable.coordinate,
155
+ moves: moveTable.moves,
156
+ range: moveTable.range,
157
+ values,
158
+ checksum: checksum(values),
159
+ maxDepth
160
+ };
161
+ }
162
+ function generateCube3CombinedPruningTable(tableA, tableB) {
163
+ const combinedRange = tableA.range * tableB.range;
164
+ const values = new Uint8Array(combinedRange);
165
+ values.fill(255);
166
+ const solvedCoordinate = tableA.solvedCoordinate * tableB.range + tableB.solvedCoordinate;
167
+ values[solvedCoordinate] = 0;
168
+ const queue = new Int32Array(combinedRange);
169
+ let read = 0;
170
+ let write = 1;
171
+ queue[0] = solvedCoordinate;
172
+ let maxDepth = 0;
173
+ while (read < write) {
174
+ const current = queue[read];
175
+ read += 1;
176
+ const nextDepth = values[current] + 1;
177
+ const currentA = Math.floor(current / tableB.range);
178
+ const currentB = current % tableB.range;
179
+ for (let moveIndex = 0; moveIndex < tableA.moves.length; moveIndex += 1) {
180
+ const nextA = tableA.values[currentA * tableA.moves.length + moveIndex];
181
+ const nextB = tableB.values[currentB * tableB.moves.length + moveIndex];
182
+ const next = nextA * tableB.range + nextB;
183
+ if (values[next] !== 255) {
184
+ continue;
185
+ }
186
+ values[next] = nextDepth;
187
+ maxDepth = Math.max(maxDepth, nextDepth);
188
+ queue[write] = next;
189
+ write += 1;
190
+ }
191
+ }
192
+ const combinedName = `${tableA.coordinate}${tableB.coordinate.charAt(0).toUpperCase() + tableB.coordinate.slice(1)}`;
193
+ return {
194
+ coordinate: combinedName,
195
+ moves: tableA.moves,
196
+ range: combinedRange,
197
+ values,
198
+ checksum: checksum(values),
199
+ maxDepth
200
+ };
201
+ }
202
+ function lookupCube3MoveTable(table, coordinate, move) {
203
+ const moveIndex = table.moves.indexOf(move);
204
+ if (moveIndex === -1) {
205
+ throw new RangeError(`Move ${move} is not part of ${table.coordinate} table.`);
206
+ }
207
+ return table.values[coordinate * table.moves.length + moveIndex];
208
+ }
209
+ function checksum(values) {
210
+ let hash = 0x811c9dc5;
211
+ for (let index = 0; index < values.length; index += 1) {
212
+ hash ^= values[index];
213
+ hash = Math.imul(hash, 0x01000193);
214
+ }
215
+ return hash >>> 0;
216
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSolvedCube3State = createSolvedCube3State;
4
+ exports.cloneCube3State = cloneCube3State;
5
+ exports.cube3StatesEqual = cube3StatesEqual;
6
+ exports.isSolvedCube3State = isSolvedCube3State;
7
+ const types_js_1 = require("./types.js");
8
+ function createSolvedCube3State() {
9
+ return {
10
+ corners: {
11
+ permutation: range(types_js_1.CORNER_COUNT),
12
+ orientation: Array(types_js_1.CORNER_COUNT).fill(0)
13
+ },
14
+ edges: {
15
+ permutation: range(types_js_1.EDGE_COUNT),
16
+ orientation: Array(types_js_1.EDGE_COUNT).fill(0)
17
+ }
18
+ };
19
+ }
20
+ function cloneCube3State(state) {
21
+ return {
22
+ corners: {
23
+ permutation: [...state.corners.permutation],
24
+ orientation: [...state.corners.orientation]
25
+ },
26
+ edges: {
27
+ permutation: [...state.edges.permutation],
28
+ orientation: [...state.edges.orientation]
29
+ }
30
+ };
31
+ }
32
+ function cube3StatesEqual(left, right) {
33
+ return (arraysEqual(left.corners.permutation, right.corners.permutation) &&
34
+ arraysEqual(left.corners.orientation, right.corners.orientation) &&
35
+ arraysEqual(left.edges.permutation, right.edges.permutation) &&
36
+ arraysEqual(left.edges.orientation, right.edges.orientation));
37
+ }
38
+ function isSolvedCube3State(state) {
39
+ return cube3StatesEqual(state, createSolvedCube3State());
40
+ }
41
+ function range(length) {
42
+ return Array.from({ length }, (_, index) => index);
43
+ }
44
+ function arraysEqual(left, right) {
45
+ return left.length === right.length && left.every((value, index) => value === right[index]);
46
+ }