@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.
- package/README.md +169 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/run.d.ts +9 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +139 -0
- package/dist/core/api.d.ts +19 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/api.js +94 -0
- package/dist/core/errors.d.ts +21 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +34 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/registry.d.ts +10 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/types.d.ts +34 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/puzzles/clock/index.d.ts +2 -0
- package/dist/puzzles/clock/index.d.ts.map +1 -0
- package/dist/puzzles/clock/index.js +1 -0
- package/dist/puzzles/clock/scrambler.d.ts +4 -0
- package/dist/puzzles/clock/scrambler.d.ts.map +1 -0
- package/dist/puzzles/clock/scrambler.js +50 -0
- package/dist/puzzles/cube2/facelets.d.ts +5 -0
- package/dist/puzzles/cube2/facelets.d.ts.map +1 -0
- package/dist/puzzles/cube2/facelets.js +53 -0
- package/dist/puzzles/cube2/index.d.ts +10 -0
- package/dist/puzzles/cube2/index.d.ts.map +1 -0
- package/dist/puzzles/cube2/index.js +8 -0
- package/dist/puzzles/cube2/moves.d.ts +9 -0
- package/dist/puzzles/cube2/moves.d.ts.map +1 -0
- package/dist/puzzles/cube2/moves.js +79 -0
- package/dist/puzzles/cube2/random-state.d.ts +3 -0
- package/dist/puzzles/cube2/random-state.d.ts.map +1 -0
- package/dist/puzzles/cube2/random-state.js +51 -0
- package/dist/puzzles/cube2/scrambler.d.ts +6 -0
- package/dist/puzzles/cube2/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube2/scrambler.js +54 -0
- package/dist/puzzles/cube2/solver/browser-loader.d.ts +12 -0
- package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/browser-loader.js +80 -0
- package/dist/puzzles/cube2/solver/generated/distances.bin +1 -0
- package/dist/puzzles/cube2/solver/generated/manifest.json +21 -0
- package/dist/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
- package/dist/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
- package/dist/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
- package/dist/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
- package/dist/puzzles/cube2/solver/generated-assets.d.ts +6 -0
- package/dist/puzzles/cube2/solver/generated-assets.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/generated-assets.js +25 -0
- package/dist/puzzles/cube2/solver/index.d.ts +3 -0
- package/dist/puzzles/cube2/solver/index.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/index.js +1 -0
- package/dist/puzzles/cube2/solver/node-loader.d.ts +6 -0
- package/dist/puzzles/cube2/solver/node-loader.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/node-loader.js +83 -0
- package/dist/puzzles/cube2/solver/search.d.ts +8 -0
- package/dist/puzzles/cube2/solver/search.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/search.js +50 -0
- package/dist/puzzles/cube2/solver/table-metadata.d.ts +16 -0
- package/dist/puzzles/cube2/solver/table-metadata.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/table-metadata.js +15 -0
- package/dist/puzzles/cube2/solver/tables.d.ts +14 -0
- package/dist/puzzles/cube2/solver/tables.d.ts.map +1 -0
- package/dist/puzzles/cube2/solver/tables.js +82 -0
- package/dist/puzzles/cube2/state.d.ts +6 -0
- package/dist/puzzles/cube2/state.d.ts.map +1 -0
- package/dist/puzzles/cube2/state.js +30 -0
- package/dist/puzzles/cube2/types.d.ts +23 -0
- package/dist/puzzles/cube2/types.d.ts.map +1 -0
- package/dist/puzzles/cube2/types.js +21 -0
- package/dist/puzzles/cube2/validation.d.ts +6 -0
- package/dist/puzzles/cube2/validation.d.ts.map +1 -0
- package/dist/puzzles/cube2/validation.js +72 -0
- package/dist/puzzles/cube3/facelets.d.ts +5 -0
- package/dist/puzzles/cube3/facelets.d.ts.map +1 -0
- package/dist/puzzles/cube3/facelets.js +89 -0
- package/dist/puzzles/cube3/index.d.ts +10 -0
- package/dist/puzzles/cube3/index.d.ts.map +1 -0
- package/dist/puzzles/cube3/index.js +8 -0
- package/dist/puzzles/cube3/moves.d.ts +9 -0
- package/dist/puzzles/cube3/moves.d.ts.map +1 -0
- package/dist/puzzles/cube3/moves.js +210 -0
- package/dist/puzzles/cube3/random-state.d.ts +3 -0
- package/dist/puzzles/cube3/random-state.d.ts.map +1 -0
- package/dist/puzzles/cube3/random-state.js +59 -0
- package/dist/puzzles/cube3/scrambler.d.ts +6 -0
- package/dist/puzzles/cube3/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube3/scrambler.js +59 -0
- package/dist/puzzles/cube3/solver/browser-loader.d.ts +5 -0
- package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/browser-loader.js +134 -0
- package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts +31 -0
- package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/browser-worker-pool.js +118 -0
- package/dist/puzzles/cube3/solver/browser-worker.d.ts +2 -0
- package/dist/puzzles/cube3/solver/browser-worker.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/browser-worker.js +71 -0
- package/dist/puzzles/cube3/solver/coordinates.d.ts +34 -0
- package/dist/puzzles/cube3/solver/coordinates.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/coordinates.js +266 -0
- package/dist/puzzles/cube3/solver/generated/manifest.json +404 -0
- package/dist/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
- package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
- package/dist/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
- package/dist/puzzles/cube3/solver/generated-assets.d.ts +5 -0
- package/dist/puzzles/cube3/solver/generated-assets.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/generated-assets.js +60 -0
- package/dist/puzzles/cube3/solver/index.d.ts +10 -0
- package/dist/puzzles/cube3/solver/index.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/index.js +5 -0
- package/dist/puzzles/cube3/solver/node-loader.d.ts +3 -0
- package/dist/puzzles/cube3/solver/node-loader.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/node-loader.js +120 -0
- package/dist/puzzles/cube3/solver/phase1.d.ts +28 -0
- package/dist/puzzles/cube3/solver/phase1.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/phase1.js +150 -0
- package/dist/puzzles/cube3/solver/phase2.d.ts +44 -0
- package/dist/puzzles/cube3/solver/phase2.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/phase2.js +270 -0
- package/dist/puzzles/cube3/solver/search-utils.d.ts +9 -0
- package/dist/puzzles/cube3/solver/search-utils.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/search-utils.js +41 -0
- package/dist/puzzles/cube3/solver/table-metadata.d.ts +97 -0
- package/dist/puzzles/cube3/solver/table-metadata.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/table-metadata.js +21 -0
- package/dist/puzzles/cube3/solver/tables.d.ts +72 -0
- package/dist/puzzles/cube3/solver/tables.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/tables.js +202 -0
- package/dist/puzzles/cube3/solver/worker-pool.d.ts +18 -0
- package/dist/puzzles/cube3/solver/worker-pool.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/worker-pool.js +116 -0
- package/dist/puzzles/cube3/solver/worker.d.ts +2 -0
- package/dist/puzzles/cube3/solver/worker.d.ts.map +1 -0
- package/dist/puzzles/cube3/solver/worker.js +73 -0
- package/dist/puzzles/cube3/state.d.ts +6 -0
- package/dist/puzzles/cube3/state.d.ts.map +1 -0
- package/dist/puzzles/cube3/state.js +40 -0
- package/dist/puzzles/cube3/subset-state.d.ts +4 -0
- package/dist/puzzles/cube3/subset-state.d.ts.map +1 -0
- package/dist/puzzles/cube3/subset-state.js +163 -0
- package/dist/puzzles/cube3/types.d.ts +29 -0
- package/dist/puzzles/cube3/types.d.ts.map +1 -0
- package/dist/puzzles/cube3/types.js +22 -0
- package/dist/puzzles/cube3/validation.d.ts +6 -0
- package/dist/puzzles/cube3/validation.d.ts.map +1 -0
- package/dist/puzzles/cube3/validation.js +83 -0
- package/dist/puzzles/cube4/facelets.d.ts +5 -0
- package/dist/puzzles/cube4/facelets.d.ts.map +1 -0
- package/dist/puzzles/cube4/facelets.js +135 -0
- package/dist/puzzles/cube4/index.d.ts +7 -0
- package/dist/puzzles/cube4/index.d.ts.map +1 -0
- package/dist/puzzles/cube4/index.js +8 -0
- package/dist/puzzles/cube4/moves.d.ts +37 -0
- package/dist/puzzles/cube4/moves.d.ts.map +1 -0
- package/dist/puzzles/cube4/moves.js +243 -0
- package/dist/puzzles/cube4/scrambler.d.ts +4 -0
- package/dist/puzzles/cube4/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube4/scrambler.js +98 -0
- package/dist/puzzles/cube4/state.d.ts +16 -0
- package/dist/puzzles/cube4/state.d.ts.map +1 -0
- package/dist/puzzles/cube4/state.js +84 -0
- package/dist/puzzles/cube4/types.d.ts +76 -0
- package/dist/puzzles/cube4/types.d.ts.map +1 -0
- package/dist/puzzles/cube4/types.js +62 -0
- package/dist/puzzles/cube5x5/index.d.ts +4 -0
- package/dist/puzzles/cube5x5/index.d.ts.map +1 -0
- package/dist/puzzles/cube5x5/index.js +2 -0
- package/dist/puzzles/cube5x5/scrambler.d.ts +4 -0
- package/dist/puzzles/cube5x5/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube5x5/scrambler.js +93 -0
- package/dist/puzzles/cube5x5/types.d.ts +4 -0
- package/dist/puzzles/cube5x5/types.d.ts.map +1 -0
- package/dist/puzzles/cube5x5/types.js +4 -0
- package/dist/puzzles/cube6x6/index.d.ts +4 -0
- package/dist/puzzles/cube6x6/index.d.ts.map +1 -0
- package/dist/puzzles/cube6x6/index.js +2 -0
- package/dist/puzzles/cube6x6/scrambler.d.ts +4 -0
- package/dist/puzzles/cube6x6/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube6x6/scrambler.js +105 -0
- package/dist/puzzles/cube6x6/types.d.ts +4 -0
- package/dist/puzzles/cube6x6/types.d.ts.map +1 -0
- package/dist/puzzles/cube6x6/types.js +8 -0
- package/dist/puzzles/cube7x7/index.d.ts +4 -0
- package/dist/puzzles/cube7x7/index.d.ts.map +1 -0
- package/dist/puzzles/cube7x7/index.js +2 -0
- package/dist/puzzles/cube7x7/scrambler.d.ts +4 -0
- package/dist/puzzles/cube7x7/scrambler.d.ts.map +1 -0
- package/dist/puzzles/cube7x7/scrambler.js +93 -0
- package/dist/puzzles/cube7x7/types.d.ts +4 -0
- package/dist/puzzles/cube7x7/types.d.ts.map +1 -0
- package/dist/puzzles/cube7x7/types.js +8 -0
- package/dist/puzzles/index.d.ts +10 -0
- package/dist/puzzles/index.d.ts.map +1 -0
- package/dist/puzzles/index.js +28 -0
- package/dist/puzzles/megaminx/index.d.ts +4 -0
- package/dist/puzzles/megaminx/index.d.ts.map +1 -0
- package/dist/puzzles/megaminx/index.js +2 -0
- package/dist/puzzles/megaminx/scrambler.d.ts +4 -0
- package/dist/puzzles/megaminx/scrambler.d.ts.map +1 -0
- package/dist/puzzles/megaminx/scrambler.js +56 -0
- package/dist/puzzles/megaminx/types.d.ts +6 -0
- package/dist/puzzles/megaminx/types.d.ts.map +1 -0
- package/dist/puzzles/megaminx/types.js +4 -0
- package/dist/puzzles/pyraminx/index.d.ts +9 -0
- package/dist/puzzles/pyraminx/index.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/index.js +7 -0
- package/dist/puzzles/pyraminx/moves.d.ts +9 -0
- package/dist/puzzles/pyraminx/moves.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/moves.js +117 -0
- package/dist/puzzles/pyraminx/random-state.d.ts +3 -0
- package/dist/puzzles/pyraminx/random-state.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/random-state.js +53 -0
- package/dist/puzzles/pyraminx/scrambler.d.ts +6 -0
- package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/scrambler.js +56 -0
- package/dist/puzzles/pyraminx/solver.d.ts +10 -0
- package/dist/puzzles/pyraminx/solver.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/solver.js +160 -0
- package/dist/puzzles/pyraminx/state.d.ts +6 -0
- package/dist/puzzles/pyraminx/state.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/state.js +32 -0
- package/dist/puzzles/pyraminx/types.d.ts +17 -0
- package/dist/puzzles/pyraminx/types.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/types.js +7 -0
- package/dist/puzzles/pyraminx/validation.d.ts +8 -0
- package/dist/puzzles/pyraminx/validation.d.ts.map +1 -0
- package/dist/puzzles/pyraminx/validation.js +79 -0
- package/dist/random/index.d.ts +3 -0
- package/dist/random/index.d.ts.map +1 -0
- package/dist/random/index.js +1 -0
- package/dist/random/prng.d.ts +7 -0
- package/dist/random/prng.d.ts.map +1 -0
- package/dist/random/prng.js +60 -0
- package/dist-cjs/cli/index.js +12 -0
- package/dist-cjs/cli/run.js +142 -0
- package/dist-cjs/core/api.js +102 -0
- package/dist-cjs/core/errors.js +42 -0
- package/dist-cjs/core/index.js +19 -0
- package/dist-cjs/core/registry.js +39 -0
- package/dist-cjs/core/types.js +2 -0
- package/dist-cjs/index.js +19 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/puzzles/clock/index.js +6 -0
- package/dist-cjs/puzzles/clock/scrambler.js +54 -0
- package/dist-cjs/puzzles/cube2/facelets.js +58 -0
- package/dist-cjs/puzzles/cube2/index.js +67 -0
- package/dist-cjs/puzzles/cube2/moves.js +88 -0
- package/dist-cjs/puzzles/cube2/random-state.js +54 -0
- package/dist-cjs/puzzles/cube2/scrambler.js +58 -0
- package/dist-cjs/puzzles/cube2/solver/browser-loader.js +85 -0
- package/dist-cjs/puzzles/cube2/solver/generated/distances.bin +1 -0
- package/dist-cjs/puzzles/cube2/solver/generated/manifest.json +21 -0
- package/dist-cjs/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
- package/dist-cjs/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
- package/dist-cjs/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
- package/dist-cjs/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
- package/dist-cjs/puzzles/cube2/solver/generated-assets.js +61 -0
- package/dist-cjs/puzzles/cube2/solver/index.js +5 -0
- package/dist-cjs/puzzles/cube2/solver/node-loader.js +89 -0
- package/dist-cjs/puzzles/cube2/solver/search.js +53 -0
- package/dist-cjs/puzzles/cube2/solver/table-metadata.js +18 -0
- package/dist-cjs/puzzles/cube2/solver/tables.js +91 -0
- package/dist-cjs/puzzles/cube2/state.js +36 -0
- package/dist-cjs/puzzles/cube2/types.js +24 -0
- package/dist-cjs/puzzles/cube2/validation.js +78 -0
- package/dist-cjs/puzzles/cube3/facelets.js +94 -0
- package/dist-cjs/puzzles/cube3/index.js +68 -0
- package/dist-cjs/puzzles/cube3/moves.js +219 -0
- package/dist-cjs/puzzles/cube3/random-state.js +62 -0
- package/dist-cjs/puzzles/cube3/scrambler.js +63 -0
- package/dist-cjs/puzzles/cube3/solver/browser-loader.js +139 -0
- package/dist-cjs/puzzles/cube3/solver/coordinates.js +285 -0
- package/dist-cjs/puzzles/cube3/solver/generated/manifest.json +404 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
- package/dist-cjs/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
- package/dist-cjs/puzzles/cube3/solver/generated-assets.js +98 -0
- package/dist-cjs/puzzles/cube3/solver/index.js +49 -0
- package/dist-cjs/puzzles/cube3/solver/node-loader.js +126 -0
- package/dist-cjs/puzzles/cube3/solver/phase1.js +158 -0
- package/dist-cjs/puzzles/cube3/solver/phase2.js +279 -0
- package/dist-cjs/puzzles/cube3/solver/search-utils.js +49 -0
- package/dist-cjs/puzzles/cube3/solver/table-metadata.js +24 -0
- package/dist-cjs/puzzles/cube3/solver/tables.js +216 -0
- package/dist-cjs/puzzles/cube3/state.js +46 -0
- package/dist-cjs/puzzles/cube3/subset-state.js +166 -0
- package/dist-cjs/puzzles/cube3/types.js +25 -0
- package/dist-cjs/puzzles/cube3/validation.js +89 -0
- package/dist-cjs/puzzles/cube4/facelets.js +140 -0
- package/dist-cjs/puzzles/cube4/index.js +45 -0
- package/dist-cjs/puzzles/cube4/moves.js +251 -0
- package/dist-cjs/puzzles/cube4/scrambler.js +135 -0
- package/dist-cjs/puzzles/cube4/state.js +92 -0
- package/dist-cjs/puzzles/cube4/types.js +65 -0
- package/dist-cjs/puzzles/cube5x5/index.js +9 -0
- package/dist-cjs/puzzles/cube5x5/scrambler.js +97 -0
- package/dist-cjs/puzzles/cube5x5/types.js +7 -0
- package/dist-cjs/puzzles/cube6x6/index.js +9 -0
- package/dist-cjs/puzzles/cube6x6/scrambler.js +109 -0
- package/dist-cjs/puzzles/cube6x6/types.js +11 -0
- package/dist-cjs/puzzles/cube7x7/index.js +9 -0
- package/dist-cjs/puzzles/cube7x7/scrambler.js +97 -0
- package/dist-cjs/puzzles/cube7x7/types.js +11 -0
- package/dist-cjs/puzzles/index.js +64 -0
- package/dist-cjs/puzzles/megaminx/index.js +11 -0
- package/dist-cjs/puzzles/megaminx/scrambler.js +60 -0
- package/dist-cjs/puzzles/megaminx/types.js +7 -0
- package/dist-cjs/puzzles/pyraminx/index.js +30 -0
- package/dist-cjs/puzzles/pyraminx/moves.js +126 -0
- package/dist-cjs/puzzles/pyraminx/random-state.js +56 -0
- package/dist-cjs/puzzles/pyraminx/scrambler.js +60 -0
- package/dist-cjs/puzzles/pyraminx/solver.js +170 -0
- package/dist-cjs/puzzles/pyraminx/state.js +38 -0
- package/dist-cjs/puzzles/pyraminx/types.js +10 -0
- package/dist-cjs/puzzles/pyraminx/validation.js +84 -0
- package/dist-cjs/random/index.js +5 -0
- package/dist-cjs/random/prng.js +63 -0
- package/docs/cubingcenter-integration.md +69 -0
- package/docs/development.md +44 -0
- package/docs/facelets.md +64 -0
- package/docs/getting-started.md +73 -0
- package/examples/cli-json.md +30 -0
- package/examples/commonjs.cjs +11 -0
- package/examples/esm.mjs +9 -0
- package/examples/timer-preview.mjs +29 -0
- package/package.json +53 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeneratorFailedError = exports.InvalidOptionsError = exports.InvalidCountError = exports.UnsupportedEventError = exports.ScramblerError = void 0;
|
|
4
|
+
class ScramblerError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = new.target.name;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.ScramblerError = ScramblerError;
|
|
11
|
+
class UnsupportedEventError extends ScramblerError {
|
|
12
|
+
eventId;
|
|
13
|
+
constructor(eventId) {
|
|
14
|
+
super(`Unsupported scramble event: ${eventId}`);
|
|
15
|
+
this.eventId = eventId;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.UnsupportedEventError = UnsupportedEventError;
|
|
19
|
+
class InvalidCountError extends ScramblerError {
|
|
20
|
+
count;
|
|
21
|
+
constructor(count) {
|
|
22
|
+
super(`Scramble count must be a positive integer. Received: ${count}`);
|
|
23
|
+
this.count = count;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.InvalidCountError = InvalidCountError;
|
|
27
|
+
class InvalidOptionsError extends ScramblerError {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.InvalidOptionsError = InvalidOptionsError;
|
|
33
|
+
class GeneratorFailedError extends ScramblerError {
|
|
34
|
+
eventId;
|
|
35
|
+
cause;
|
|
36
|
+
constructor(eventId, cause) {
|
|
37
|
+
super(`Scramble generator failed for event: ${eventId}`);
|
|
38
|
+
this.eventId = eventId;
|
|
39
|
+
this.cause = cause;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.GeneratorFailedError = GeneratorFailedError;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerScrambleGenerator = exports.initializeScrambler = exports.getSupportedEvents = exports.getEventInfo = exports.generateScrambles = exports.generateScramble = exports.defaultRegistry = exports.DefaultScramblerRegistry = exports.UnsupportedEventError = exports.ScramblerError = exports.InvalidOptionsError = exports.InvalidCountError = exports.GeneratorFailedError = void 0;
|
|
4
|
+
var errors_js_1 = require("./errors.js");
|
|
5
|
+
Object.defineProperty(exports, "GeneratorFailedError", { enumerable: true, get: function () { return errors_js_1.GeneratorFailedError; } });
|
|
6
|
+
Object.defineProperty(exports, "InvalidCountError", { enumerable: true, get: function () { return errors_js_1.InvalidCountError; } });
|
|
7
|
+
Object.defineProperty(exports, "InvalidOptionsError", { enumerable: true, get: function () { return errors_js_1.InvalidOptionsError; } });
|
|
8
|
+
Object.defineProperty(exports, "ScramblerError", { enumerable: true, get: function () { return errors_js_1.ScramblerError; } });
|
|
9
|
+
Object.defineProperty(exports, "UnsupportedEventError", { enumerable: true, get: function () { return errors_js_1.UnsupportedEventError; } });
|
|
10
|
+
var registry_js_1 = require("./registry.js");
|
|
11
|
+
Object.defineProperty(exports, "DefaultScramblerRegistry", { enumerable: true, get: function () { return registry_js_1.DefaultScramblerRegistry; } });
|
|
12
|
+
Object.defineProperty(exports, "defaultRegistry", { enumerable: true, get: function () { return registry_js_1.defaultRegistry; } });
|
|
13
|
+
var api_js_1 = require("./api.js");
|
|
14
|
+
Object.defineProperty(exports, "generateScramble", { enumerable: true, get: function () { return api_js_1.generateScramble; } });
|
|
15
|
+
Object.defineProperty(exports, "generateScrambles", { enumerable: true, get: function () { return api_js_1.generateScrambles; } });
|
|
16
|
+
Object.defineProperty(exports, "getEventInfo", { enumerable: true, get: function () { return api_js_1.getEventInfo; } });
|
|
17
|
+
Object.defineProperty(exports, "getSupportedEvents", { enumerable: true, get: function () { return api_js_1.getSupportedEvents; } });
|
|
18
|
+
Object.defineProperty(exports, "initializeScrambler", { enumerable: true, get: function () { return api_js_1.initializeScrambler; } });
|
|
19
|
+
Object.defineProperty(exports, "registerScrambleGenerator", { enumerable: true, get: function () { return api_js_1.registerScrambleGenerator; } });
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultRegistry = exports.DefaultScramblerRegistry = void 0;
|
|
4
|
+
const errors_js_1 = require("./errors.js");
|
|
5
|
+
class DefaultScramblerRegistry {
|
|
6
|
+
generators = new Map();
|
|
7
|
+
register(generator) {
|
|
8
|
+
validateGenerator(generator);
|
|
9
|
+
this.generators.set(generator.info.eventId, generator);
|
|
10
|
+
}
|
|
11
|
+
get(eventId) {
|
|
12
|
+
return this.generators.get(eventId);
|
|
13
|
+
}
|
|
14
|
+
has(eventId) {
|
|
15
|
+
return this.generators.has(eventId);
|
|
16
|
+
}
|
|
17
|
+
list() {
|
|
18
|
+
return Array.from(this.generators.values())
|
|
19
|
+
.map((generator) => ({ ...generator.info }))
|
|
20
|
+
.sort((left, right) => left.eventId.localeCompare(right.eventId));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.DefaultScramblerRegistry = DefaultScramblerRegistry;
|
|
24
|
+
exports.defaultRegistry = new DefaultScramblerRegistry();
|
|
25
|
+
function validateGenerator(generator) {
|
|
26
|
+
const { info } = generator;
|
|
27
|
+
if (!info.eventId.trim()) {
|
|
28
|
+
throw new errors_js_1.InvalidOptionsError("Scramble generator eventId cannot be empty.");
|
|
29
|
+
}
|
|
30
|
+
if (!info.name.trim()) {
|
|
31
|
+
throw new errors_js_1.InvalidOptionsError(`Scramble generator ${info.eventId} must have a name.`);
|
|
32
|
+
}
|
|
33
|
+
if (!info.puzzle.trim()) {
|
|
34
|
+
throw new errors_js_1.InvalidOptionsError(`Scramble generator ${info.eventId} must have a puzzle name.`);
|
|
35
|
+
}
|
|
36
|
+
if (!info.generator.trim()) {
|
|
37
|
+
throw new errors_js_1.InvalidOptionsError(`Scramble generator ${info.eventId} must have a generator id.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./core/index.js"), exports);
|
|
18
|
+
__exportStar(require("./puzzles/index.js"), exports);
|
|
19
|
+
__exportStar(require("./random/index.js"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateClockScramble = exports.clockScrambleGenerator = void 0;
|
|
4
|
+
var scrambler_js_1 = require("./scrambler.js");
|
|
5
|
+
Object.defineProperty(exports, "clockScrambleGenerator", { enumerable: true, get: function () { return scrambler_js_1.clockScrambleGenerator; } });
|
|
6
|
+
Object.defineProperty(exports, "generateClockScramble", { enumerable: true, get: function () { return scrambler_js_1.generateClockScramble; } });
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clockScrambleGenerator = void 0;
|
|
4
|
+
exports.generateClockScramble = generateClockScramble;
|
|
5
|
+
exports.clockScrambleGenerator = {
|
|
6
|
+
info: {
|
|
7
|
+
eventId: "clkwca",
|
|
8
|
+
name: "Clock",
|
|
9
|
+
puzzle: "clock",
|
|
10
|
+
quality: "random-state",
|
|
11
|
+
generator: "clock-random-moves",
|
|
12
|
+
description: "Generates standard WCA Clock scrambles."
|
|
13
|
+
},
|
|
14
|
+
generate(options = {}) {
|
|
15
|
+
return generateClockScramble(options);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
function getRandomTurns() {
|
|
19
|
+
const value = Math.floor(Math.random() * 12) - 5; // -5 to +6
|
|
20
|
+
if (value >= 0) {
|
|
21
|
+
return `${value}+`;
|
|
22
|
+
}
|
|
23
|
+
return `${Math.abs(value)}-`;
|
|
24
|
+
}
|
|
25
|
+
async function generateClockScramble(options = {}) {
|
|
26
|
+
const moves = [];
|
|
27
|
+
// Front face moves
|
|
28
|
+
const frontPins = ["UR", "DR", "DL", "UL", "U", "R", "D", "L", "ALL"];
|
|
29
|
+
for (const pin of frontPins) {
|
|
30
|
+
moves.push(`${pin}${getRandomTurns()}`);
|
|
31
|
+
}
|
|
32
|
+
// Flip
|
|
33
|
+
moves.push("y2");
|
|
34
|
+
// Back face moves
|
|
35
|
+
const backPins = ["U", "R", "D", "L", "ALL"];
|
|
36
|
+
for (const pin of backPins) {
|
|
37
|
+
moves.push(`${pin}${getRandomTurns()}`);
|
|
38
|
+
}
|
|
39
|
+
// Final pins state
|
|
40
|
+
const pins = ["UR", "DR", "DL", "UL"];
|
|
41
|
+
const finalPins = pins.filter(() => Math.random() < 0.5);
|
|
42
|
+
const finalPinsStr = finalPins.join(" ");
|
|
43
|
+
const scramble = [...moves, finalPinsStr].filter(Boolean).join(" ");
|
|
44
|
+
return {
|
|
45
|
+
eventId: "clkwca",
|
|
46
|
+
scramble,
|
|
47
|
+
moves, // For moves we return the steps without final pins as parsed moves, or just string array
|
|
48
|
+
quality: "random-state",
|
|
49
|
+
generator: "clock-random-moves",
|
|
50
|
+
metadata: {
|
|
51
|
+
finalPins
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCube2Facelets = toCube2Facelets;
|
|
4
|
+
exports.formatCube2Facelets = formatCube2Facelets;
|
|
5
|
+
exports.getCube2FaceOrder = getCube2FaceOrder;
|
|
6
|
+
const FACE_ORDER = ["U", "R", "F", "D", "L", "B"];
|
|
7
|
+
const CORNER_PIECE_STICKERS = [
|
|
8
|
+
["U", "R", "F"],
|
|
9
|
+
["U", "F", "L"],
|
|
10
|
+
["U", "L", "B"],
|
|
11
|
+
["U", "B", "R"],
|
|
12
|
+
["D", "F", "R"],
|
|
13
|
+
["D", "L", "F"],
|
|
14
|
+
["D", "B", "L"],
|
|
15
|
+
["D", "R", "B"]
|
|
16
|
+
];
|
|
17
|
+
const CORNER_POSITION_SLOTS = [
|
|
18
|
+
[["U", 3], ["R", 0], ["F", 1]],
|
|
19
|
+
[["U", 2], ["F", 0], ["L", 1]],
|
|
20
|
+
[["U", 0], ["L", 0], ["B", 1]],
|
|
21
|
+
[["U", 1], ["B", 0], ["R", 1]],
|
|
22
|
+
[["D", 1], ["F", 3], ["R", 2]],
|
|
23
|
+
[["D", 0], ["L", 3], ["F", 2]],
|
|
24
|
+
[["D", 2], ["B", 3], ["L", 2]],
|
|
25
|
+
[["D", 3], ["R", 3], ["B", 2]]
|
|
26
|
+
];
|
|
27
|
+
function toCube2Facelets(state) {
|
|
28
|
+
const facelets = createEmptyFacelets();
|
|
29
|
+
for (let position = 0; position < CORNER_POSITION_SLOTS.length; position += 1) {
|
|
30
|
+
const piece = state.corners.permutation[position];
|
|
31
|
+
const orientation = state.corners.orientation[position];
|
|
32
|
+
placeOrientedStickers(facelets, CORNER_POSITION_SLOTS[position], CORNER_PIECE_STICKERS[piece], orientation);
|
|
33
|
+
}
|
|
34
|
+
return facelets;
|
|
35
|
+
}
|
|
36
|
+
function formatCube2Facelets(facelets) {
|
|
37
|
+
return FACE_ORDER.map((face) => facelets[face].join("")).join("");
|
|
38
|
+
}
|
|
39
|
+
function getCube2FaceOrder() {
|
|
40
|
+
return FACE_ORDER;
|
|
41
|
+
}
|
|
42
|
+
function createEmptyFacelets() {
|
|
43
|
+
return {
|
|
44
|
+
U: Array(4).fill("U"),
|
|
45
|
+
R: Array(4).fill("R"),
|
|
46
|
+
F: Array(4).fill("F"),
|
|
47
|
+
D: Array(4).fill("D"),
|
|
48
|
+
L: Array(4).fill("L"),
|
|
49
|
+
B: Array(4).fill("B")
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function placeOrientedStickers(facelets, slots, stickers, orientation) {
|
|
53
|
+
for (let index = 0; index < slots.length; index += 1) {
|
|
54
|
+
const [face, stickerIndex] = slots[index];
|
|
55
|
+
const sticker = stickers[(index - orientation + stickers.length) % stickers.length];
|
|
56
|
+
facelets[face][stickerIndex] = sticker;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.solver = exports.toCube2Facelets = exports.getCube2FaceOrder = exports.formatCube2Facelets = exports.generateCube2Scramble = exports.cube2ScrambleGenerator = exports.generateRandomCube2State = exports.validateCube2State = exports.permutationParity = exports.isOneMoveFromSolvedCube2State = exports.isAllowedRandomCube2State = exports.isSolvedCube2State = exports.cube2StatesEqual = exports.createSolvedCube2State = exports.cloneCube2State = exports.parseCube2Move = exports.parseCube2Algorithm = exports.invertCube2Move = exports.invertCube2Algorithm = exports.formatCube2Algorithm = exports.applyCube2Move = exports.applyCube2Algorithm = exports.CORNER_COUNT = exports.CUBE2_MOVES = void 0;
|
|
37
|
+
var types_js_1 = require("./types.js");
|
|
38
|
+
Object.defineProperty(exports, "CUBE2_MOVES", { enumerable: true, get: function () { return types_js_1.CUBE2_MOVES; } });
|
|
39
|
+
Object.defineProperty(exports, "CORNER_COUNT", { enumerable: true, get: function () { return types_js_1.CORNER_COUNT; } });
|
|
40
|
+
var moves_js_1 = require("./moves.js");
|
|
41
|
+
Object.defineProperty(exports, "applyCube2Algorithm", { enumerable: true, get: function () { return moves_js_1.applyCube2Algorithm; } });
|
|
42
|
+
Object.defineProperty(exports, "applyCube2Move", { enumerable: true, get: function () { return moves_js_1.applyCube2Move; } });
|
|
43
|
+
Object.defineProperty(exports, "formatCube2Algorithm", { enumerable: true, get: function () { return moves_js_1.formatCube2Algorithm; } });
|
|
44
|
+
Object.defineProperty(exports, "invertCube2Algorithm", { enumerable: true, get: function () { return moves_js_1.invertCube2Algorithm; } });
|
|
45
|
+
Object.defineProperty(exports, "invertCube2Move", { enumerable: true, get: function () { return moves_js_1.invertCube2Move; } });
|
|
46
|
+
Object.defineProperty(exports, "parseCube2Algorithm", { enumerable: true, get: function () { return moves_js_1.parseCube2Algorithm; } });
|
|
47
|
+
Object.defineProperty(exports, "parseCube2Move", { enumerable: true, get: function () { return moves_js_1.parseCube2Move; } });
|
|
48
|
+
var state_js_1 = require("./state.js");
|
|
49
|
+
Object.defineProperty(exports, "cloneCube2State", { enumerable: true, get: function () { return state_js_1.cloneCube2State; } });
|
|
50
|
+
Object.defineProperty(exports, "createSolvedCube2State", { enumerable: true, get: function () { return state_js_1.createSolvedCube2State; } });
|
|
51
|
+
Object.defineProperty(exports, "cube2StatesEqual", { enumerable: true, get: function () { return state_js_1.cube2StatesEqual; } });
|
|
52
|
+
Object.defineProperty(exports, "isSolvedCube2State", { enumerable: true, get: function () { return state_js_1.isSolvedCube2State; } });
|
|
53
|
+
var validation_js_1 = require("./validation.js");
|
|
54
|
+
Object.defineProperty(exports, "isAllowedRandomCube2State", { enumerable: true, get: function () { return validation_js_1.isAllowedRandomCube2State; } });
|
|
55
|
+
Object.defineProperty(exports, "isOneMoveFromSolvedCube2State", { enumerable: true, get: function () { return validation_js_1.isOneMoveFromSolvedCube2State; } });
|
|
56
|
+
Object.defineProperty(exports, "permutationParity", { enumerable: true, get: function () { return validation_js_1.permutationParity; } });
|
|
57
|
+
Object.defineProperty(exports, "validateCube2State", { enumerable: true, get: function () { return validation_js_1.validateCube2State; } });
|
|
58
|
+
var random_state_js_1 = require("./random-state.js");
|
|
59
|
+
Object.defineProperty(exports, "generateRandomCube2State", { enumerable: true, get: function () { return random_state_js_1.generateRandomCube2State; } });
|
|
60
|
+
var scrambler_js_1 = require("./scrambler.js");
|
|
61
|
+
Object.defineProperty(exports, "cube2ScrambleGenerator", { enumerable: true, get: function () { return scrambler_js_1.cube2ScrambleGenerator; } });
|
|
62
|
+
Object.defineProperty(exports, "generateCube2Scramble", { enumerable: true, get: function () { return scrambler_js_1.generateCube2Scramble; } });
|
|
63
|
+
var facelets_js_1 = require("./facelets.js");
|
|
64
|
+
Object.defineProperty(exports, "formatCube2Facelets", { enumerable: true, get: function () { return facelets_js_1.formatCube2Facelets; } });
|
|
65
|
+
Object.defineProperty(exports, "getCube2FaceOrder", { enumerable: true, get: function () { return facelets_js_1.getCube2FaceOrder; } });
|
|
66
|
+
Object.defineProperty(exports, "toCube2Facelets", { enumerable: true, get: function () { return facelets_js_1.toCube2Facelets; } });
|
|
67
|
+
exports.solver = __importStar(require("./solver/index.js"));
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyCube2Move = applyCube2Move;
|
|
4
|
+
exports.applyCube2Algorithm = applyCube2Algorithm;
|
|
5
|
+
exports.invertCube2Algorithm = invertCube2Algorithm;
|
|
6
|
+
exports.parseCube2Algorithm = parseCube2Algorithm;
|
|
7
|
+
exports.formatCube2Algorithm = formatCube2Algorithm;
|
|
8
|
+
exports.parseCube2Move = parseCube2Move;
|
|
9
|
+
exports.invertCube2Move = invertCube2Move;
|
|
10
|
+
const types_js_1 = require("./types.js");
|
|
11
|
+
const state_js_1 = require("./state.js");
|
|
12
|
+
const FACE_MOVE_TABLES = {
|
|
13
|
+
U: {
|
|
14
|
+
permutation: [3, 0, 1, 2, 4, 5, 6, 7],
|
|
15
|
+
orientation: [0, 0, 0, 0, 0, 0, 0, 0]
|
|
16
|
+
},
|
|
17
|
+
D: {
|
|
18
|
+
permutation: [0, 1, 2, 3, 5, 6, 7, 4],
|
|
19
|
+
orientation: [0, 0, 0, 0, 0, 0, 0, 0]
|
|
20
|
+
},
|
|
21
|
+
R: {
|
|
22
|
+
permutation: [4, 1, 2, 0, 7, 5, 6, 3],
|
|
23
|
+
orientation: [2, 0, 0, 1, 1, 0, 0, 2]
|
|
24
|
+
},
|
|
25
|
+
L: {
|
|
26
|
+
permutation: [0, 2, 6, 3, 4, 1, 5, 7],
|
|
27
|
+
orientation: [0, 1, 2, 0, 0, 2, 1, 0]
|
|
28
|
+
},
|
|
29
|
+
F: {
|
|
30
|
+
permutation: [1, 5, 2, 3, 0, 4, 6, 7],
|
|
31
|
+
orientation: [1, 2, 0, 0, 2, 1, 0, 0]
|
|
32
|
+
},
|
|
33
|
+
B: {
|
|
34
|
+
permutation: [0, 1, 3, 7, 4, 5, 2, 6],
|
|
35
|
+
orientation: [0, 0, 1, 2, 0, 0, 2, 1]
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function applyCube2Move(state, move) {
|
|
39
|
+
const { face, turns } = parseMoveParts(move);
|
|
40
|
+
let next = (0, state_js_1.cloneCube2State)(state);
|
|
41
|
+
for (let index = 0; index < turns; index += 1) {
|
|
42
|
+
next = applyFaceMove(next, FACE_MOVE_TABLES[face]);
|
|
43
|
+
}
|
|
44
|
+
return next;
|
|
45
|
+
}
|
|
46
|
+
function applyCube2Algorithm(state, moves) {
|
|
47
|
+
return moves.reduce((current, move) => applyCube2Move(current, move), state);
|
|
48
|
+
}
|
|
49
|
+
function invertCube2Algorithm(moves) {
|
|
50
|
+
return [...moves].reverse().map(invertCube2Move);
|
|
51
|
+
}
|
|
52
|
+
function parseCube2Algorithm(algorithm) {
|
|
53
|
+
const trimmed = algorithm.trim();
|
|
54
|
+
if (trimmed.length === 0) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
return trimmed.split(/\s+/).map(parseCube2Move);
|
|
58
|
+
}
|
|
59
|
+
function formatCube2Algorithm(moves) {
|
|
60
|
+
return moves.join(" ");
|
|
61
|
+
}
|
|
62
|
+
function parseCube2Move(value) {
|
|
63
|
+
if (types_js_1.CUBE2_MOVES.includes(value)) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Invalid 2x2 move: ${value}`);
|
|
67
|
+
}
|
|
68
|
+
function invertCube2Move(move) {
|
|
69
|
+
const { face, suffix } = parseMoveParts(move);
|
|
70
|
+
if (suffix === "2") {
|
|
71
|
+
return move;
|
|
72
|
+
}
|
|
73
|
+
return `${face}${suffix === "'" ? "" : "'"}`;
|
|
74
|
+
}
|
|
75
|
+
function applyFaceMove(state, table) {
|
|
76
|
+
return {
|
|
77
|
+
corners: {
|
|
78
|
+
permutation: table.permutation.map((source) => state.corners.permutation[source]),
|
|
79
|
+
orientation: table.permutation.map((source, target) => ((state.corners.orientation[source] + table.orientation[target]) % 3))
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseMoveParts(move) {
|
|
84
|
+
const face = move[0];
|
|
85
|
+
const suffix = move.slice(1);
|
|
86
|
+
const turns = suffix === "2" ? 2 : suffix === "'" ? 3 : 1;
|
|
87
|
+
return { face, suffix, turns };
|
|
88
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRandomCube2State = generateRandomCube2State;
|
|
4
|
+
const index_js_1 = require("../../random/index.js");
|
|
5
|
+
const types_js_1 = require("./types.js");
|
|
6
|
+
const validation_js_1 = require("./validation.js");
|
|
7
|
+
function generateRandomCube2State(options = {}) {
|
|
8
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
9
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
10
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
11
|
+
const state = createLegalRandomState(random);
|
|
12
|
+
if (!rejectTrivial || (0, validation_js_1.isAllowedRandomCube2State)(state)) {
|
|
13
|
+
return state;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
throw new Error("Unable to generate a non-trivial random 2x2 state.");
|
|
17
|
+
}
|
|
18
|
+
function createLegalRandomState(random) {
|
|
19
|
+
const perm7 = shuffledRange(types_js_1.CORNER_COUNT - 1, random);
|
|
20
|
+
const mappedPerm = perm7.map((val) => (val >= 6 ? val + 1 : val));
|
|
21
|
+
mappedPerm.splice(6, 0, 6);
|
|
22
|
+
const orient7 = randomOrientations(types_js_1.CORNER_COUNT - 1, 3, random);
|
|
23
|
+
orient7.splice(6, 0, 0);
|
|
24
|
+
return {
|
|
25
|
+
corners: {
|
|
26
|
+
permutation: mappedPerm,
|
|
27
|
+
orientation: orient7
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function shuffledRange(length, random) {
|
|
32
|
+
const values = Array.from({ length }, (_, index) => index);
|
|
33
|
+
for (let index = values.length - 1; index > 0; index -= 1) {
|
|
34
|
+
const swapIndex = random.nextInt(index + 1);
|
|
35
|
+
swap(values, index, swapIndex);
|
|
36
|
+
}
|
|
37
|
+
return values;
|
|
38
|
+
}
|
|
39
|
+
function randomOrientations(length, modulo, random) {
|
|
40
|
+
const orientations = Array(length).fill(0);
|
|
41
|
+
let total = 0;
|
|
42
|
+
for (let index = 0; index < length - 1; index += 1) {
|
|
43
|
+
const orientation = random.nextInt(modulo);
|
|
44
|
+
orientations[index] = orientation;
|
|
45
|
+
total += orientation;
|
|
46
|
+
}
|
|
47
|
+
orientations[length - 1] = (modulo - (total % modulo)) % modulo;
|
|
48
|
+
return orientations;
|
|
49
|
+
}
|
|
50
|
+
function swap(values, left, right) {
|
|
51
|
+
const temporary = values[left];
|
|
52
|
+
values[left] = values[right];
|
|
53
|
+
values[right] = temporary;
|
|
54
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cube2ScrambleGenerator = void 0;
|
|
4
|
+
exports.generateCube2Scramble = generateCube2Scramble;
|
|
5
|
+
const moves_js_1 = require("./moves.js");
|
|
6
|
+
const random_state_js_1 = require("./random-state.js");
|
|
7
|
+
const state_js_1 = require("./state.js");
|
|
8
|
+
const facelets_js_1 = require("./facelets.js");
|
|
9
|
+
const index_js_1 = require("./solver/index.js");
|
|
10
|
+
exports.cube2ScrambleGenerator = {
|
|
11
|
+
info: {
|
|
12
|
+
eventId: "222",
|
|
13
|
+
name: "2x2x2 Cube",
|
|
14
|
+
puzzle: "cube-2x2",
|
|
15
|
+
quality: "random-state",
|
|
16
|
+
generator: "cube2-ida-star",
|
|
17
|
+
description: "Random-state 2x2 scramble generated by an optimal IDA* corner solver."
|
|
18
|
+
},
|
|
19
|
+
generate(options = {}) {
|
|
20
|
+
return generateCube2Scramble(options);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
async function generateCube2Scramble(options = {}) {
|
|
24
|
+
const state = (0, random_state_js_1.generateRandomCube2State)(options);
|
|
25
|
+
const solution = await (0, index_js_1.solveCube2State)(state);
|
|
26
|
+
const scrambleMoves = (0, moves_js_1.invertCube2Algorithm)(solution.moves);
|
|
27
|
+
if (!options.skipValidation) {
|
|
28
|
+
const scrambledState = (0, moves_js_1.applyCube2Algorithm)((0, state_js_1.createSolvedCube2State)(), scrambleMoves);
|
|
29
|
+
if (!(0, state_js_1.cube2StatesEqual)(scrambledState, state)) {
|
|
30
|
+
throw new Error("Generated 2x2 scramble does not reproduce the target random state.");
|
|
31
|
+
}
|
|
32
|
+
if (!(0, state_js_1.isSolvedCube2State)(solution.state)) {
|
|
33
|
+
throw new Error("Generated 2x2 solution does not solve the target random state.");
|
|
34
|
+
}
|
|
35
|
+
if (scrambleMoves.length < 2) {
|
|
36
|
+
throw new Error("Generated 2x2 scramble is too short.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const facelets = (0, facelets_js_1.toCube2Facelets)(state);
|
|
40
|
+
const result = {
|
|
41
|
+
eventId: "222",
|
|
42
|
+
scramble: (0, moves_js_1.formatCube2Algorithm)(scrambleMoves),
|
|
43
|
+
moves: scrambleMoves,
|
|
44
|
+
quality: "random-state",
|
|
45
|
+
generator: "cube2-ida-star",
|
|
46
|
+
metadata: {
|
|
47
|
+
state,
|
|
48
|
+
facelets,
|
|
49
|
+
faceletString: (0, facelets_js_1.formatCube2Facelets)(facelets),
|
|
50
|
+
solutionMoves: solution.moves,
|
|
51
|
+
solutionDepth: solution.depth
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
if (options.seed !== undefined) {
|
|
55
|
+
result.seed = options.seed;
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCachedBrowserTables = getCachedBrowserTables;
|
|
4
|
+
exports.clearCachedBrowserTables = clearCachedBrowserTables;
|
|
5
|
+
exports.loadBrowserTables = loadBrowserTables;
|
|
6
|
+
const table_metadata_js_1 = require("./table-metadata.js");
|
|
7
|
+
let cachedBrowserTables;
|
|
8
|
+
function getCachedBrowserTables() {
|
|
9
|
+
return cachedBrowserTables;
|
|
10
|
+
}
|
|
11
|
+
function clearCachedBrowserTables() {
|
|
12
|
+
cachedBrowserTables = undefined;
|
|
13
|
+
}
|
|
14
|
+
async function loadBrowserTables(baseUrl) {
|
|
15
|
+
if (cachedBrowserTables) {
|
|
16
|
+
return cachedBrowserTables;
|
|
17
|
+
}
|
|
18
|
+
const resolved = resolveBaseUrl(baseUrl);
|
|
19
|
+
const manifest = await fetchManifest(resolved);
|
|
20
|
+
const [permTable, orientTable, dist] = await Promise.all([
|
|
21
|
+
fetchUint16Table(resolved, manifest.files.permutationTable, table_metadata_js_1.CUBE2_SOLVER_TABLE_METADATA.permutationTable.entries),
|
|
22
|
+
fetchUint16Table(resolved, manifest.files.orientationTable, table_metadata_js_1.CUBE2_SOLVER_TABLE_METADATA.orientationTable.entries),
|
|
23
|
+
fetchUint8Table(resolved, manifest.files.distances, table_metadata_js_1.CUBE2_SOLVER_TABLE_METADATA.distances.entries)
|
|
24
|
+
]);
|
|
25
|
+
cachedBrowserTables = {
|
|
26
|
+
permutationTable: permTable,
|
|
27
|
+
orientationTable: orientTable,
|
|
28
|
+
distances: dist
|
|
29
|
+
};
|
|
30
|
+
return cachedBrowserTables;
|
|
31
|
+
}
|
|
32
|
+
function resolveBaseUrl(provided) {
|
|
33
|
+
if (provided) {
|
|
34
|
+
return provided.replace(/\/$/, "");
|
|
35
|
+
}
|
|
36
|
+
if (typeof document !== "undefined") {
|
|
37
|
+
const script = document.currentScript;
|
|
38
|
+
if (script?.src) {
|
|
39
|
+
const base = new URL(".", script.src).href;
|
|
40
|
+
return base.replace(/\/$/, "");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return ".";
|
|
44
|
+
}
|
|
45
|
+
async function fetchManifest(baseUrl) {
|
|
46
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/manifest.json`;
|
|
47
|
+
const response = await fetch(url);
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Failed to load cube2 solver table manifest from ${url}: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const manifest = await response.json();
|
|
52
|
+
if (manifest.version !== 1) {
|
|
53
|
+
throw new Error(`Unsupported cube2 solver table manifest version: ${manifest.version}`);
|
|
54
|
+
}
|
|
55
|
+
return manifest;
|
|
56
|
+
}
|
|
57
|
+
async function fetchUint16Table(baseUrl, entry, expectedEntries) {
|
|
58
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
|
|
59
|
+
const response = await fetch(url);
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
|
|
62
|
+
}
|
|
63
|
+
const buffer = await response.arrayBuffer();
|
|
64
|
+
if (buffer.byteLength !== expectedEntries * 2) {
|
|
65
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
66
|
+
}
|
|
67
|
+
const values = new Uint16Array(expectedEntries);
|
|
68
|
+
const view = new DataView(buffer);
|
|
69
|
+
for (let i = 0; i < values.length; i++) {
|
|
70
|
+
values[i] = view.getUint16(i * 2, true);
|
|
71
|
+
}
|
|
72
|
+
return values;
|
|
73
|
+
}
|
|
74
|
+
async function fetchUint8Table(baseUrl, entry, expectedEntries) {
|
|
75
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
|
|
76
|
+
const response = await fetch(url);
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const buffer = await response.arrayBuffer();
|
|
81
|
+
if (buffer.byteLength !== expectedEntries) {
|
|
82
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
83
|
+
}
|
|
84
|
+
return new Uint8Array(buffer);
|
|
85
|
+
}
|