@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,93 @@
|
|
|
1
|
+
import { createRandomSource } from "../../random/index.js";
|
|
2
|
+
import { CUBE7_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
|
|
3
|
+
export const cube7ScrambleGenerator = {
|
|
4
|
+
info: {
|
|
5
|
+
eventId: "777",
|
|
6
|
+
name: "7x7x7 Cube",
|
|
7
|
+
puzzle: "cube-7x7",
|
|
8
|
+
quality: "random-move",
|
|
9
|
+
generator: "cube7-random-move",
|
|
10
|
+
description: "Random-move 7x7 scramble with 100 moves."
|
|
11
|
+
},
|
|
12
|
+
generate(options = {}) {
|
|
13
|
+
return generateCube7Scramble(options);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export function generateCube7Scramble(options = {}) {
|
|
17
|
+
const random = createRandomSource(options.seed);
|
|
18
|
+
const moves = [];
|
|
19
|
+
for (let i = 0; i < SCRAMBLE_LENGTH; i++) {
|
|
20
|
+
let move;
|
|
21
|
+
do {
|
|
22
|
+
move = random.choice(CUBE7_ALL_MOVES);
|
|
23
|
+
} while (isRedundant(moves, move));
|
|
24
|
+
moves.push(move);
|
|
25
|
+
}
|
|
26
|
+
const scramble = moves.join(" ");
|
|
27
|
+
const result = {
|
|
28
|
+
eventId: "777",
|
|
29
|
+
scramble,
|
|
30
|
+
moves,
|
|
31
|
+
quality: "random-move",
|
|
32
|
+
generator: "cube7-random-move",
|
|
33
|
+
metadata: {
|
|
34
|
+
totalMoves: moves.length,
|
|
35
|
+
distribution: "random-move-wca-format"
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (options.seed !== undefined) {
|
|
39
|
+
result.seed = options.seed;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
const MAX_AXIS_BLOCK = 4;
|
|
44
|
+
function getBaseMove(move) {
|
|
45
|
+
if (move.endsWith("2") || move.endsWith("'")) {
|
|
46
|
+
return move.slice(0, -1);
|
|
47
|
+
}
|
|
48
|
+
return move;
|
|
49
|
+
}
|
|
50
|
+
function getAxis(base) {
|
|
51
|
+
if (base.includes("R") || base.includes("L"))
|
|
52
|
+
return "X";
|
|
53
|
+
if (base.includes("U") || base.includes("D"))
|
|
54
|
+
return "Y";
|
|
55
|
+
if (base.includes("F") || base.includes("B"))
|
|
56
|
+
return "Z";
|
|
57
|
+
return "";
|
|
58
|
+
}
|
|
59
|
+
function isRedundant(moves, newMove) {
|
|
60
|
+
if (moves.length === 0)
|
|
61
|
+
return false;
|
|
62
|
+
const newBase = getBaseMove(newMove);
|
|
63
|
+
const newAxis = getAxis(newBase);
|
|
64
|
+
const lastBase = getBaseMove(moves[moves.length - 1]);
|
|
65
|
+
// No same base move consecutively
|
|
66
|
+
if (lastBase === newBase)
|
|
67
|
+
return true;
|
|
68
|
+
const lastAxis = getAxis(lastBase);
|
|
69
|
+
// Different axis: always allowed
|
|
70
|
+
if (newAxis !== lastAxis)
|
|
71
|
+
return false;
|
|
72
|
+
// Same axis: scan the current block
|
|
73
|
+
const basesInBlock = new Set();
|
|
74
|
+
basesInBlock.add(lastBase);
|
|
75
|
+
let blockLength = 1;
|
|
76
|
+
for (let i = moves.length - 2; i >= 0; i--) {
|
|
77
|
+
const base = getBaseMove(moves[i]);
|
|
78
|
+
if (getAxis(base) === newAxis) {
|
|
79
|
+
basesInBlock.add(base);
|
|
80
|
+
blockLength++;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// No same base within the block
|
|
87
|
+
if (basesInBlock.has(newBase))
|
|
88
|
+
return true;
|
|
89
|
+
// Max block length
|
|
90
|
+
if (blockLength >= MAX_AXIS_BLOCK)
|
|
91
|
+
return true;
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Cube7Move = "U" | "U2" | "U'" | "D" | "D2" | "D'" | "R" | "R2" | "R'" | "L" | "L2" | "L'" | "F" | "F2" | "F'" | "B" | "B2" | "B'" | "Uw" | "Uw2" | "Uw'" | "Dw" | "Dw2" | "Dw'" | "Rw" | "Rw2" | "Rw'" | "Lw" | "Lw2" | "Lw'" | "Fw" | "Fw2" | "Fw'" | "Bw" | "Bw2" | "Bw'" | "3Uw" | "3Uw2" | "3Uw'" | "3Dw" | "3Dw2" | "3Dw'" | "3Rw" | "3Rw2" | "3Rw'" | "3Lw" | "3Lw2" | "3Lw'" | "3Fw" | "3Fw2" | "3Fw'" | "3Bw" | "3Bw2" | "3Bw'";
|
|
2
|
+
export declare const CUBE7_ALL_MOVES: readonly Cube7Move[];
|
|
3
|
+
export declare const SCRAMBLE_LENGTH = 100;
|
|
4
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube7x7/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,GAAG,GAAG,IAAI,GAAG,IAAI,GACjB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,IAAI,GAAG,KAAK,GAAG,KAAK,GACpB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,GACvB,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAS5B,eAAO,MAAM,eAAe,EAAE,SAAS,SAAS,EAE/C,CAAC;AAEF,eAAO,MAAM,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const BASE_MOVES = [
|
|
2
|
+
"U", "D", "R", "L", "F", "B",
|
|
3
|
+
"Uw", "Dw", "Rw", "Lw", "Fw", "Bw",
|
|
4
|
+
"3Uw", "3Dw", "3Rw", "3Lw", "3Fw", "3Bw"
|
|
5
|
+
];
|
|
6
|
+
const SUFFIXES = ["", "2", "'"];
|
|
7
|
+
export const CUBE7_ALL_MOVES = BASE_MOVES.flatMap((base) => SUFFIXES.map(suffix => `${base}${suffix}`));
|
|
8
|
+
export const SCRAMBLE_LENGTH = 100;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * as cube2 from "./cube2/index.js";
|
|
2
|
+
export * as cube3 from "./cube3/index.js";
|
|
3
|
+
export * as cube4 from "./cube4/index.js";
|
|
4
|
+
export * as megaminx from "./megaminx/index.js";
|
|
5
|
+
export * as cube5x5 from "./cube5x5/index.js";
|
|
6
|
+
export * as cube6x6 from "./cube6x6/index.js";
|
|
7
|
+
export * as cube7x7 from "./cube7x7/index.js";
|
|
8
|
+
export * as pyraminx from "./pyraminx/index.js";
|
|
9
|
+
export * as clock from "./clock/index.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/puzzles/index.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { registerScrambleGenerator } from "../core/index.js";
|
|
2
|
+
import { cube2ScrambleGenerator } from "./cube2/index.js";
|
|
3
|
+
import { cube3ScrambleGenerator } from "./cube3/index.js";
|
|
4
|
+
import { cube4ScrambleGenerator } from "./cube4/index.js";
|
|
5
|
+
import { megaminxScrambleGenerator } from "./megaminx/index.js";
|
|
6
|
+
import { cube5ScrambleGenerator } from "./cube5x5/index.js";
|
|
7
|
+
import { cube6ScrambleGenerator } from "./cube6x6/index.js";
|
|
8
|
+
import { cube7ScrambleGenerator } from "./cube7x7/index.js";
|
|
9
|
+
import { pyraminxScrambleGenerator } from "./pyraminx/index.js";
|
|
10
|
+
import { clockScrambleGenerator } from "./clock/index.js";
|
|
11
|
+
registerScrambleGenerator(cube2ScrambleGenerator);
|
|
12
|
+
registerScrambleGenerator(cube3ScrambleGenerator);
|
|
13
|
+
registerScrambleGenerator(cube4ScrambleGenerator);
|
|
14
|
+
registerScrambleGenerator(megaminxScrambleGenerator);
|
|
15
|
+
registerScrambleGenerator(cube5ScrambleGenerator);
|
|
16
|
+
registerScrambleGenerator(cube6ScrambleGenerator);
|
|
17
|
+
registerScrambleGenerator(cube7ScrambleGenerator);
|
|
18
|
+
registerScrambleGenerator(pyraminxScrambleGenerator);
|
|
19
|
+
registerScrambleGenerator(clockScrambleGenerator);
|
|
20
|
+
export * as cube2 from "./cube2/index.js";
|
|
21
|
+
export * as cube3 from "./cube3/index.js";
|
|
22
|
+
export * as cube4 from "./cube4/index.js";
|
|
23
|
+
export * as megaminx from "./megaminx/index.js";
|
|
24
|
+
export * as cube5x5 from "./cube5x5/index.js";
|
|
25
|
+
export * as cube6x6 from "./cube6x6/index.js";
|
|
26
|
+
export * as cube7x7 from "./cube7x7/index.js";
|
|
27
|
+
export * as pyraminx from "./pyraminx/index.js";
|
|
28
|
+
export * as clock from "./clock/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
|
|
2
|
+
export declare const megaminxScrambleGenerator: ScrambleGenerator;
|
|
3
|
+
export declare function generateMegaminxScramble(options?: ScrambleOptions): ScrambleResult;
|
|
4
|
+
//# sourceMappingURL=scrambler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK9F,eAAO,MAAM,yBAAyB,EAAE,iBAYvC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAuCtF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createRandomSource } from "../../random/index.js";
|
|
2
|
+
import { MEGAMINX_R_MOVES, MEGAMINX_D_MOVES, SCRAMBLE_LINES, MOVES_PER_LINE } from "./types.js";
|
|
3
|
+
export const megaminxScrambleGenerator = {
|
|
4
|
+
info: {
|
|
5
|
+
eventId: "mega",
|
|
6
|
+
name: "Megaminx",
|
|
7
|
+
puzzle: "megaminx",
|
|
8
|
+
quality: "random-move",
|
|
9
|
+
generator: "megaminx-random-move",
|
|
10
|
+
description: "Random-move Megaminx scramble using WCA notation (7 lines of 10 moves + U/U')."
|
|
11
|
+
},
|
|
12
|
+
generate(options = {}) {
|
|
13
|
+
return generateMegaminxScramble(options);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export function generateMegaminxScramble(options = {}) {
|
|
17
|
+
const random = createRandomSource(options.seed);
|
|
18
|
+
const moves = [];
|
|
19
|
+
for (let line = 0; line < SCRAMBLE_LINES; line++) {
|
|
20
|
+
let lastD = "D++";
|
|
21
|
+
for (let pair = 0; pair < 5; pair++) {
|
|
22
|
+
const rMove = random.choice(MEGAMINX_R_MOVES);
|
|
23
|
+
const dMove = random.choice(MEGAMINX_D_MOVES);
|
|
24
|
+
moves.push(rMove, dMove);
|
|
25
|
+
lastD = dMove;
|
|
26
|
+
}
|
|
27
|
+
const uMove = lastD === "D++" ? "U" : "U'";
|
|
28
|
+
moves.push(uMove);
|
|
29
|
+
}
|
|
30
|
+
const scramble = formatMegaminxScramble(moves);
|
|
31
|
+
const result = {
|
|
32
|
+
eventId: "mega",
|
|
33
|
+
scramble,
|
|
34
|
+
moves,
|
|
35
|
+
quality: "random-move",
|
|
36
|
+
generator: "megaminx-random-move",
|
|
37
|
+
metadata: {
|
|
38
|
+
lines: SCRAMBLE_LINES,
|
|
39
|
+
movesPerLine: MOVES_PER_LINE,
|
|
40
|
+
totalMoves: moves.length,
|
|
41
|
+
distribution: "random-move-wca-format"
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
if (options.seed !== undefined) {
|
|
45
|
+
result.seed = options.seed;
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
function formatMegaminxScramble(moves) {
|
|
50
|
+
const lines = [];
|
|
51
|
+
for (let i = 0; i < SCRAMBLE_LINES; i++) {
|
|
52
|
+
const lineMoves = moves.slice(i * MOVES_PER_LINE, (i + 1) * MOVES_PER_LINE);
|
|
53
|
+
lines.push(lineMoves.join(" "));
|
|
54
|
+
}
|
|
55
|
+
return lines.join("\n");
|
|
56
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type MegaminxMove = "R++" | "R--" | "D++" | "D--" | "U" | "U'";
|
|
2
|
+
export declare const MEGAMINX_R_MOVES: readonly MegaminxMove[];
|
|
3
|
+
export declare const MEGAMINX_D_MOVES: readonly MegaminxMove[];
|
|
4
|
+
export declare const SCRAMBLE_LINES = 7;
|
|
5
|
+
export declare const MOVES_PER_LINE = 11;
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AAEtE,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAA4B,CAAC;AACjF,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAA4B,CAAC;AAEjF,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
|
|
2
|
+
export type { PyraminxMove, PyraminxState, PyraminxFaceMove, PyraminxTipMove, PyraminxRandomStateOptions } from "./types.js";
|
|
3
|
+
export { applyPyraminxAlgorithm, applyPyraminxMove, formatPyraminxAlgorithm, invertPyraminxAlgorithm, invertPyraminxMove, parsePyraminxAlgorithm, parsePyraminxMove } from "./moves.js";
|
|
4
|
+
export { clonePyraminxState, createSolvedPyraminxState, pyraminxStatesEqual, isSolvedPyraminxState } from "./state.js";
|
|
5
|
+
export { permutationParity, validatePyraminxState, isAllowedRandomPyraminxState } from "./validation.js";
|
|
6
|
+
export { generateRandomPyraminxState } from "./random-state.js";
|
|
7
|
+
export { pyraminxScrambleGenerator, generatePyraminxScramble } from "./scrambler.js";
|
|
8
|
+
export { solvePyraminx } from "./solver.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACd,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
|
|
2
|
+
export { applyPyraminxAlgorithm, applyPyraminxMove, formatPyraminxAlgorithm, invertPyraminxAlgorithm, invertPyraminxMove, parsePyraminxAlgorithm, parsePyraminxMove } from "./moves.js";
|
|
3
|
+
export { clonePyraminxState, createSolvedPyraminxState, pyraminxStatesEqual, isSolvedPyraminxState } from "./state.js";
|
|
4
|
+
export { permutationParity, validatePyraminxState, isAllowedRandomPyraminxState } from "./validation.js";
|
|
5
|
+
export { generateRandomPyraminxState } from "./random-state.js";
|
|
6
|
+
export { pyraminxScrambleGenerator, generatePyraminxScramble } from "./scrambler.js";
|
|
7
|
+
export { solvePyraminx } from "./solver.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PyraminxMove, PyraminxState } from "./types.js";
|
|
2
|
+
export declare function applyPyraminxMove(state: PyraminxState, move: PyraminxMove): PyraminxState;
|
|
3
|
+
export declare function applyPyraminxAlgorithm(state: PyraminxState, moves: readonly PyraminxMove[]): PyraminxState;
|
|
4
|
+
export declare function invertPyraminxAlgorithm(moves: readonly PyraminxMove[]): PyraminxMove[];
|
|
5
|
+
export declare function parsePyraminxAlgorithm(algorithm: string): PyraminxMove[];
|
|
6
|
+
export declare function formatPyraminxAlgorithm(moves: readonly PyraminxMove[]): string;
|
|
7
|
+
export declare function parsePyraminxMove(value: string): PyraminxMove;
|
|
8
|
+
export declare function invertPyraminxMove(move: PyraminxMove): PyraminxMove;
|
|
9
|
+
//# sourceMappingURL=moves.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/moves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAKjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,aAAa,CA4BzF;AA8DD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,aAAa,CAE1G;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAEtF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAU7D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAKnE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { PYRAMINX_CORE_MOVES, PYRAMINX_TIPS } from "./types.js";
|
|
2
|
+
import { clonePyraminxState } from "./state.js";
|
|
3
|
+
// Mathematical representation of Pyraminx moves
|
|
4
|
+
export function applyPyraminxMove(state, move) {
|
|
5
|
+
const isInverse = move.endsWith("'");
|
|
6
|
+
const baseMove = move.replace("'", "");
|
|
7
|
+
const isTip = baseMove === baseMove.toLowerCase();
|
|
8
|
+
const next = clonePyraminxState(state);
|
|
9
|
+
if (isTip) {
|
|
10
|
+
const tipIndex = PYRAMINX_TIPS.indexOf(baseMove);
|
|
11
|
+
if (tipIndex !== -1) {
|
|
12
|
+
if (isInverse) {
|
|
13
|
+
next.tips[tipIndex] = (next.tips[tipIndex] + 2) % 3;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
next.tips[tipIndex] = (next.tips[tipIndex] + 1) % 3;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return next;
|
|
20
|
+
}
|
|
21
|
+
// Otherwise, it is a core layer move
|
|
22
|
+
const face = baseMove;
|
|
23
|
+
const turns = isInverse ? 2 : 1; // CW is 1, CCW is 2 turns CW
|
|
24
|
+
for (let step = 0; step < turns; step++) {
|
|
25
|
+
applySingleCoreMoveCW(next, face);
|
|
26
|
+
}
|
|
27
|
+
return next;
|
|
28
|
+
}
|
|
29
|
+
function applySingleCoreMoveCW(state, face) {
|
|
30
|
+
const centers = state.centers;
|
|
31
|
+
const perm = state.edgesPerm;
|
|
32
|
+
const orient = state.edgesOrient;
|
|
33
|
+
// Clone arrays for temporary storage
|
|
34
|
+
const prevPerm = [...perm];
|
|
35
|
+
const prevOrient = [...orient];
|
|
36
|
+
if (face === "U") {
|
|
37
|
+
// Center
|
|
38
|
+
centers[0] = (centers[0] + 1) % 3;
|
|
39
|
+
// Edges cycle: 0 -> 1 -> 2 -> 0 (UL -> UR -> UB -> UL)
|
|
40
|
+
// No orientation flips for U
|
|
41
|
+
perm[1] = prevPerm[0];
|
|
42
|
+
perm[2] = prevPerm[1];
|
|
43
|
+
perm[0] = prevPerm[2];
|
|
44
|
+
orient[1] = prevOrient[0];
|
|
45
|
+
orient[2] = prevOrient[1];
|
|
46
|
+
orient[0] = prevOrient[2];
|
|
47
|
+
}
|
|
48
|
+
else if (face === "L") {
|
|
49
|
+
// Center
|
|
50
|
+
centers[1] = (centers[1] + 1) % 3;
|
|
51
|
+
// Edges cycle: 0 -> 4 -> 3 -> 0 (UL -> LB -> LR -> UL)
|
|
52
|
+
// Flips: UL(0) flips, LB(4) flips, LR(3) does not flip
|
|
53
|
+
perm[4] = prevPerm[0];
|
|
54
|
+
perm[3] = prevPerm[4];
|
|
55
|
+
perm[0] = prevPerm[3];
|
|
56
|
+
orient[4] = (prevOrient[0] + 1) % 2;
|
|
57
|
+
orient[3] = (prevOrient[4] + 1) % 2;
|
|
58
|
+
orient[0] = prevOrient[3];
|
|
59
|
+
}
|
|
60
|
+
else if (face === "R") {
|
|
61
|
+
// Center
|
|
62
|
+
centers[2] = (centers[2] + 1) % 3;
|
|
63
|
+
// Edges cycle: 1 -> 3 -> 5 -> 1 (UR -> LR -> RB -> UR)
|
|
64
|
+
// Flips: UR(1) flips, LR(3) flips, RB(5) does not flip
|
|
65
|
+
perm[3] = prevPerm[1];
|
|
66
|
+
perm[5] = prevPerm[3];
|
|
67
|
+
perm[1] = prevPerm[5];
|
|
68
|
+
orient[3] = (prevOrient[1] + 1) % 2;
|
|
69
|
+
orient[5] = (prevOrient[3] + 1) % 2;
|
|
70
|
+
orient[1] = prevOrient[5];
|
|
71
|
+
}
|
|
72
|
+
else if (face === "B") {
|
|
73
|
+
// Center
|
|
74
|
+
centers[3] = (centers[3] + 1) % 3;
|
|
75
|
+
// Edges cycle: 2 -> 5 -> 4 -> 2 (UB -> RB -> LB -> UB)
|
|
76
|
+
// Flips: UB(2) flips, RB(5) flips, LB(4) does not flip
|
|
77
|
+
perm[5] = prevPerm[2];
|
|
78
|
+
perm[4] = prevPerm[5];
|
|
79
|
+
perm[2] = prevPerm[4];
|
|
80
|
+
orient[5] = (prevOrient[2] + 1) % 2;
|
|
81
|
+
orient[4] = (prevOrient[5] + 1) % 2;
|
|
82
|
+
orient[2] = prevOrient[4];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function applyPyraminxAlgorithm(state, moves) {
|
|
86
|
+
return moves.reduce((current, move) => applyPyraminxMove(current, move), state);
|
|
87
|
+
}
|
|
88
|
+
export function invertPyraminxAlgorithm(moves) {
|
|
89
|
+
return [...moves].reverse().map(invertPyraminxMove);
|
|
90
|
+
}
|
|
91
|
+
export function parsePyraminxAlgorithm(algorithm) {
|
|
92
|
+
const trimmed = algorithm.trim();
|
|
93
|
+
if (trimmed.length === 0) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
return trimmed.split(/\s+/).map(parsePyraminxMove);
|
|
97
|
+
}
|
|
98
|
+
export function formatPyraminxAlgorithm(moves) {
|
|
99
|
+
return moves.join(" ");
|
|
100
|
+
}
|
|
101
|
+
export function parsePyraminxMove(value) {
|
|
102
|
+
const baseMove = value.replace("'", "");
|
|
103
|
+
const isInverse = value.endsWith("'") || value.endsWith(""); // wait, standard validation
|
|
104
|
+
if (PYRAMINX_CORE_MOVES.includes(value) || PYRAMINX_TIPS.map(t => `${t}'`).includes(value) || PYRAMINX_TIPS.includes(value)) {
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
if (PYRAMINX_CORE_MOVES.map(m => `${m}'`).includes(value)) {
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
throw new Error(`Invalid Pyraminx move: ${value}`);
|
|
111
|
+
}
|
|
112
|
+
export function invertPyraminxMove(move) {
|
|
113
|
+
if (move.endsWith("'")) {
|
|
114
|
+
return move.slice(0, -1);
|
|
115
|
+
}
|
|
116
|
+
return `${move}'`;
|
|
117
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/random-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG5E,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAYnG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createRandomSource } from "../../random/index.js";
|
|
2
|
+
import { isAllowedRandomPyraminxState, permutationParity } from "./validation.js";
|
|
3
|
+
export function generateRandomPyraminxState(options = {}) {
|
|
4
|
+
const random = createRandomSource(options.seed);
|
|
5
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
6
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
7
|
+
const state = createLegalRandomState(random);
|
|
8
|
+
if (!rejectTrivial || isAllowedRandomPyraminxState(state)) {
|
|
9
|
+
return state;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
throw new Error("Unable to generate a non-trivial random Pyraminx state.");
|
|
13
|
+
}
|
|
14
|
+
function createLegalRandomState(random) {
|
|
15
|
+
// 4 random centers
|
|
16
|
+
const centers = Array.from({ length: 4 }, () => random.nextInt(3));
|
|
17
|
+
// 4 random tips
|
|
18
|
+
const tips = Array.from({ length: 4 }, () => random.nextInt(3));
|
|
19
|
+
// 6 edges permutation
|
|
20
|
+
const edgesPerm = shuffledRange(6, random);
|
|
21
|
+
// Ensure even parity
|
|
22
|
+
if (permutationParity(edgesPerm) !== 0) {
|
|
23
|
+
// Swap the first two elements to flip parity
|
|
24
|
+
const temp = edgesPerm[0];
|
|
25
|
+
edgesPerm[0] = edgesPerm[1];
|
|
26
|
+
edgesPerm[1] = temp;
|
|
27
|
+
}
|
|
28
|
+
// 6 edges orientation (sum must be even)
|
|
29
|
+
const edgesOrient = Array(6).fill(0);
|
|
30
|
+
let sumOrient = 0;
|
|
31
|
+
for (let i = 0; i < 5; i++) {
|
|
32
|
+
const val = random.nextInt(2);
|
|
33
|
+
edgesOrient[i] = val;
|
|
34
|
+
sumOrient += val;
|
|
35
|
+
}
|
|
36
|
+
edgesOrient[5] = sumOrient % 2 === 0 ? 0 : 1;
|
|
37
|
+
return {
|
|
38
|
+
centers,
|
|
39
|
+
edgesPerm,
|
|
40
|
+
edgesOrient,
|
|
41
|
+
tips
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function shuffledRange(length, random) {
|
|
45
|
+
const values = Array.from({ length }, (_, index) => index);
|
|
46
|
+
for (let index = values.length - 1; index > 0; index -= 1) {
|
|
47
|
+
const swapIndex = random.nextInt(index + 1);
|
|
48
|
+
const temporary = values[index];
|
|
49
|
+
values[index] = values[swapIndex];
|
|
50
|
+
values[swapIndex] = temporary;
|
|
51
|
+
}
|
|
52
|
+
return values;
|
|
53
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
|
|
2
|
+
export declare const pyraminxScrambleGenerator: ScrambleGenerator;
|
|
3
|
+
export declare function generatePyraminxScramble(options?: ScrambleOptions & {
|
|
4
|
+
skipValidation?: boolean;
|
|
5
|
+
}): Promise<ScrambleResult>;
|
|
6
|
+
//# sourceMappingURL=scrambler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO9F,eAAO,MAAM,yBAAyB,EAAE,iBAYvC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { generateRandomPyraminxState } from "./random-state.js";
|
|
2
|
+
import { createSolvedPyraminxState } from "./state.js";
|
|
3
|
+
import { applyPyraminxAlgorithm, invertPyraminxAlgorithm } from "./moves.js";
|
|
4
|
+
import { solvePyraminx } from "./solver.js";
|
|
5
|
+
export const pyraminxScrambleGenerator = {
|
|
6
|
+
info: {
|
|
7
|
+
eventId: "pyrso",
|
|
8
|
+
name: "Pyraminx",
|
|
9
|
+
puzzle: "pyraminx",
|
|
10
|
+
quality: "random-state",
|
|
11
|
+
generator: "pyraminx-ida-star",
|
|
12
|
+
description: "Random-state Pyraminx scramble generated by an optimal bidirectional BFS solver."
|
|
13
|
+
},
|
|
14
|
+
generate(options = {}) {
|
|
15
|
+
return generatePyraminxScramble(options);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export async function generatePyraminxScramble(options = {}) {
|
|
19
|
+
const state = generateRandomPyraminxState(options);
|
|
20
|
+
// Solve the core edges and centers
|
|
21
|
+
const solution = solvePyraminx(state);
|
|
22
|
+
const scrambleMoves = invertPyraminxAlgorithm(solution);
|
|
23
|
+
// Append tips to scrambleMoves
|
|
24
|
+
const finalMoves = [...scrambleMoves];
|
|
25
|
+
const tipsNotation = ["u", "l", "r", "b"];
|
|
26
|
+
for (let i = 0; i < 4; i++) {
|
|
27
|
+
const tipVal = state.tips[i];
|
|
28
|
+
if (tipVal === 1) {
|
|
29
|
+
finalMoves.push(tipsNotation[i]);
|
|
30
|
+
}
|
|
31
|
+
else if (tipVal === 2) {
|
|
32
|
+
finalMoves.push(`${tipsNotation[i]}'`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!options.skipValidation) {
|
|
36
|
+
const scrambledState = applyPyraminxAlgorithm(createSolvedPyraminxState(), finalMoves);
|
|
37
|
+
if (scrambledState.edgesPerm.toString() !== state.edgesPerm.toString() ||
|
|
38
|
+
scrambledState.edgesOrient.toString() !== state.edgesOrient.toString() ||
|
|
39
|
+
scrambledState.centers.toString() !== state.centers.toString() ||
|
|
40
|
+
scrambledState.tips.toString() !== state.tips.toString()) {
|
|
41
|
+
throw new Error("Generated Pyraminx scramble does not reproduce the target random state.");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
eventId: "pyrso",
|
|
46
|
+
scramble: finalMoves.join(" "),
|
|
47
|
+
moves: finalMoves,
|
|
48
|
+
quality: "random-state",
|
|
49
|
+
generator: "pyraminx-ida-star",
|
|
50
|
+
metadata: {
|
|
51
|
+
state,
|
|
52
|
+
solutionMoves: solution,
|
|
53
|
+
solutionDepth: solution.length
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PyraminxState, PyraminxMove } from "./types.js";
|
|
2
|
+
export declare function getPermutationIndex(perm: readonly number[]): number;
|
|
3
|
+
export declare function getPermutationFromIndex(index: number, n: number): number[];
|
|
4
|
+
export declare function getOrientationIndex(orient: readonly number[]): number;
|
|
5
|
+
export declare function getOrientationFromIndex(index: number): number[];
|
|
6
|
+
export declare function getCentersIndex(centers: readonly number[]): number;
|
|
7
|
+
export declare function getCentersFromIndex(index: number): number[];
|
|
8
|
+
export declare function getStateIndex(state: PyraminxState): number;
|
|
9
|
+
export declare function solvePyraminx(state: PyraminxState): PyraminxMove[];
|
|
10
|
+
//# sourceMappingURL=solver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../../src/puzzles/pyraminx/solver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAWnE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAY1E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMrE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAY/D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAM1D;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,EAAE,CA8DlE"}
|