@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,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cube6ScrambleGenerator = void 0;
|
|
4
|
+
exports.generateCube6Scramble = generateCube6Scramble;
|
|
5
|
+
const index_js_1 = require("../../random/index.js");
|
|
6
|
+
const types_js_1 = require("./types.js");
|
|
7
|
+
exports.cube6ScrambleGenerator = {
|
|
8
|
+
info: {
|
|
9
|
+
eventId: "666",
|
|
10
|
+
name: "6x6x6 Cube",
|
|
11
|
+
puzzle: "cube-6x6",
|
|
12
|
+
quality: "random-move",
|
|
13
|
+
generator: "cube6-random-move",
|
|
14
|
+
description: "Random-move 6x6 scramble with 80 moves."
|
|
15
|
+
},
|
|
16
|
+
generate(options = {}) {
|
|
17
|
+
return generateCube6Scramble(options);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function generateCube6Scramble(options = {}) {
|
|
21
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
22
|
+
const moves = [];
|
|
23
|
+
for (let i = 0; i < types_js_1.SCRAMBLE_LENGTH; i++) {
|
|
24
|
+
let move;
|
|
25
|
+
do {
|
|
26
|
+
move = random.choice(types_js_1.CUBE6_ALL_MOVES);
|
|
27
|
+
} while (isRedundant(moves, move));
|
|
28
|
+
moves.push(move);
|
|
29
|
+
}
|
|
30
|
+
const scramble = moves.join(" ");
|
|
31
|
+
const result = {
|
|
32
|
+
eventId: "666",
|
|
33
|
+
scramble,
|
|
34
|
+
moves,
|
|
35
|
+
quality: "random-move",
|
|
36
|
+
generator: "cube6-random-move",
|
|
37
|
+
metadata: {
|
|
38
|
+
totalMoves: moves.length,
|
|
39
|
+
distribution: "random-move-wca-format"
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
if (options.seed !== undefined) {
|
|
43
|
+
result.seed = options.seed;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
const MAX_AXIS_BLOCK = 4;
|
|
48
|
+
// On a 6x6, these 3-wide pairs cover all 6 layers together.
|
|
49
|
+
// Any combination of both in the same block is always reducible
|
|
50
|
+
// to at most 1 move + a free cube reorientation.
|
|
51
|
+
const ROTATION_PAIRS = {
|
|
52
|
+
"3Uw": "3Dw", "3Dw": "3Uw",
|
|
53
|
+
"3Rw": "3Lw", "3Lw": "3Rw",
|
|
54
|
+
"3Fw": "3Bw", "3Bw": "3Fw",
|
|
55
|
+
};
|
|
56
|
+
function getBaseMove(move) {
|
|
57
|
+
if (move.endsWith("2") || move.endsWith("'")) {
|
|
58
|
+
return move.slice(0, -1);
|
|
59
|
+
}
|
|
60
|
+
return move;
|
|
61
|
+
}
|
|
62
|
+
function getAxis(base) {
|
|
63
|
+
if (base.includes("R") || base.includes("L"))
|
|
64
|
+
return "X";
|
|
65
|
+
if (base.includes("U") || base.includes("D"))
|
|
66
|
+
return "Y";
|
|
67
|
+
if (base.includes("F") || base.includes("B"))
|
|
68
|
+
return "Z";
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
function isRedundant(moves, newMove) {
|
|
72
|
+
if (moves.length === 0)
|
|
73
|
+
return false;
|
|
74
|
+
const newBase = getBaseMove(newMove);
|
|
75
|
+
const newAxis = getAxis(newBase);
|
|
76
|
+
const lastBase = getBaseMove(moves[moves.length - 1]);
|
|
77
|
+
// No same base move consecutively
|
|
78
|
+
if (lastBase === newBase)
|
|
79
|
+
return true;
|
|
80
|
+
const lastAxis = getAxis(lastBase);
|
|
81
|
+
// Different axis: always allowed
|
|
82
|
+
if (newAxis !== lastAxis)
|
|
83
|
+
return false;
|
|
84
|
+
// Same axis: scan the current block
|
|
85
|
+
const basesInBlock = new Set();
|
|
86
|
+
basesInBlock.add(lastBase);
|
|
87
|
+
let blockLength = 1;
|
|
88
|
+
for (let i = moves.length - 2; i >= 0; i--) {
|
|
89
|
+
const base = getBaseMove(moves[i]);
|
|
90
|
+
if (getAxis(base) === newAxis) {
|
|
91
|
+
basesInBlock.add(base);
|
|
92
|
+
blockLength++;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// No same base within the block
|
|
99
|
+
if (basesInBlock.has(newBase))
|
|
100
|
+
return true;
|
|
101
|
+
// No rotation pairs (3-wide complements that cover all 6 layers)
|
|
102
|
+
const complement = ROTATION_PAIRS[newBase];
|
|
103
|
+
if (complement && basesInBlock.has(complement))
|
|
104
|
+
return true;
|
|
105
|
+
// Max block length
|
|
106
|
+
if (blockLength >= MAX_AXIS_BLOCK)
|
|
107
|
+
return true;
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SCRAMBLE_LENGTH = exports.CUBE6_ALL_MOVES = void 0;
|
|
4
|
+
const BASE_MOVES = [
|
|
5
|
+
"U", "D", "R", "L", "F", "B",
|
|
6
|
+
"Uw", "Dw", "Rw", "Lw", "Fw", "Bw",
|
|
7
|
+
"3Uw", "3Dw", "3Rw", "3Lw", "3Fw", "3Bw"
|
|
8
|
+
];
|
|
9
|
+
const SUFFIXES = ["", "2", "'"];
|
|
10
|
+
exports.CUBE6_ALL_MOVES = BASE_MOVES.flatMap((base) => SUFFIXES.map(suffix => `${base}${suffix}`));
|
|
11
|
+
exports.SCRAMBLE_LENGTH = 80;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCube7Scramble = exports.cube7ScrambleGenerator = exports.SCRAMBLE_LENGTH = exports.CUBE7_ALL_MOVES = void 0;
|
|
4
|
+
var types_js_1 = require("./types.js");
|
|
5
|
+
Object.defineProperty(exports, "CUBE7_ALL_MOVES", { enumerable: true, get: function () { return types_js_1.CUBE7_ALL_MOVES; } });
|
|
6
|
+
Object.defineProperty(exports, "SCRAMBLE_LENGTH", { enumerable: true, get: function () { return types_js_1.SCRAMBLE_LENGTH; } });
|
|
7
|
+
var scrambler_js_1 = require("./scrambler.js");
|
|
8
|
+
Object.defineProperty(exports, "cube7ScrambleGenerator", { enumerable: true, get: function () { return scrambler_js_1.cube7ScrambleGenerator; } });
|
|
9
|
+
Object.defineProperty(exports, "generateCube7Scramble", { enumerable: true, get: function () { return scrambler_js_1.generateCube7Scramble; } });
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cube7ScrambleGenerator = void 0;
|
|
4
|
+
exports.generateCube7Scramble = generateCube7Scramble;
|
|
5
|
+
const index_js_1 = require("../../random/index.js");
|
|
6
|
+
const types_js_1 = require("./types.js");
|
|
7
|
+
exports.cube7ScrambleGenerator = {
|
|
8
|
+
info: {
|
|
9
|
+
eventId: "777",
|
|
10
|
+
name: "7x7x7 Cube",
|
|
11
|
+
puzzle: "cube-7x7",
|
|
12
|
+
quality: "random-move",
|
|
13
|
+
generator: "cube7-random-move",
|
|
14
|
+
description: "Random-move 7x7 scramble with 100 moves."
|
|
15
|
+
},
|
|
16
|
+
generate(options = {}) {
|
|
17
|
+
return generateCube7Scramble(options);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function generateCube7Scramble(options = {}) {
|
|
21
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
22
|
+
const moves = [];
|
|
23
|
+
for (let i = 0; i < types_js_1.SCRAMBLE_LENGTH; i++) {
|
|
24
|
+
let move;
|
|
25
|
+
do {
|
|
26
|
+
move = random.choice(types_js_1.CUBE7_ALL_MOVES);
|
|
27
|
+
} while (isRedundant(moves, move));
|
|
28
|
+
moves.push(move);
|
|
29
|
+
}
|
|
30
|
+
const scramble = moves.join(" ");
|
|
31
|
+
const result = {
|
|
32
|
+
eventId: "777",
|
|
33
|
+
scramble,
|
|
34
|
+
moves,
|
|
35
|
+
quality: "random-move",
|
|
36
|
+
generator: "cube7-random-move",
|
|
37
|
+
metadata: {
|
|
38
|
+
totalMoves: moves.length,
|
|
39
|
+
distribution: "random-move-wca-format"
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
if (options.seed !== undefined) {
|
|
43
|
+
result.seed = options.seed;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
const MAX_AXIS_BLOCK = 4;
|
|
48
|
+
function getBaseMove(move) {
|
|
49
|
+
if (move.endsWith("2") || move.endsWith("'")) {
|
|
50
|
+
return move.slice(0, -1);
|
|
51
|
+
}
|
|
52
|
+
return move;
|
|
53
|
+
}
|
|
54
|
+
function getAxis(base) {
|
|
55
|
+
if (base.includes("R") || base.includes("L"))
|
|
56
|
+
return "X";
|
|
57
|
+
if (base.includes("U") || base.includes("D"))
|
|
58
|
+
return "Y";
|
|
59
|
+
if (base.includes("F") || base.includes("B"))
|
|
60
|
+
return "Z";
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
function isRedundant(moves, newMove) {
|
|
64
|
+
if (moves.length === 0)
|
|
65
|
+
return false;
|
|
66
|
+
const newBase = getBaseMove(newMove);
|
|
67
|
+
const newAxis = getAxis(newBase);
|
|
68
|
+
const lastBase = getBaseMove(moves[moves.length - 1]);
|
|
69
|
+
// No same base move consecutively
|
|
70
|
+
if (lastBase === newBase)
|
|
71
|
+
return true;
|
|
72
|
+
const lastAxis = getAxis(lastBase);
|
|
73
|
+
// Different axis: always allowed
|
|
74
|
+
if (newAxis !== lastAxis)
|
|
75
|
+
return false;
|
|
76
|
+
// Same axis: scan the current block
|
|
77
|
+
const basesInBlock = new Set();
|
|
78
|
+
basesInBlock.add(lastBase);
|
|
79
|
+
let blockLength = 1;
|
|
80
|
+
for (let i = moves.length - 2; i >= 0; i--) {
|
|
81
|
+
const base = getBaseMove(moves[i]);
|
|
82
|
+
if (getAxis(base) === newAxis) {
|
|
83
|
+
basesInBlock.add(base);
|
|
84
|
+
blockLength++;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// No same base within the block
|
|
91
|
+
if (basesInBlock.has(newBase))
|
|
92
|
+
return true;
|
|
93
|
+
// Max block length
|
|
94
|
+
if (blockLength >= MAX_AXIS_BLOCK)
|
|
95
|
+
return true;
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SCRAMBLE_LENGTH = exports.CUBE7_ALL_MOVES = void 0;
|
|
4
|
+
const BASE_MOVES = [
|
|
5
|
+
"U", "D", "R", "L", "F", "B",
|
|
6
|
+
"Uw", "Dw", "Rw", "Lw", "Fw", "Bw",
|
|
7
|
+
"3Uw", "3Dw", "3Rw", "3Lw", "3Fw", "3Bw"
|
|
8
|
+
];
|
|
9
|
+
const SUFFIXES = ["", "2", "'"];
|
|
10
|
+
exports.CUBE7_ALL_MOVES = BASE_MOVES.flatMap((base) => SUFFIXES.map(suffix => `${base}${suffix}`));
|
|
11
|
+
exports.SCRAMBLE_LENGTH = 100;
|
|
@@ -0,0 +1,64 @@
|
|
|
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.clock = exports.pyraminx = exports.cube7x7 = exports.cube6x6 = exports.cube5x5 = exports.megaminx = exports.cube4 = exports.cube3 = exports.cube2 = void 0;
|
|
37
|
+
const index_js_1 = require("../core/index.js");
|
|
38
|
+
const index_js_2 = require("./cube2/index.js");
|
|
39
|
+
const index_js_3 = require("./cube3/index.js");
|
|
40
|
+
const index_js_4 = require("./cube4/index.js");
|
|
41
|
+
const index_js_5 = require("./megaminx/index.js");
|
|
42
|
+
const index_js_6 = require("./cube5x5/index.js");
|
|
43
|
+
const index_js_7 = require("./cube6x6/index.js");
|
|
44
|
+
const index_js_8 = require("./cube7x7/index.js");
|
|
45
|
+
const index_js_9 = require("./pyraminx/index.js");
|
|
46
|
+
const index_js_10 = require("./clock/index.js");
|
|
47
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_2.cube2ScrambleGenerator);
|
|
48
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_3.cube3ScrambleGenerator);
|
|
49
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_4.cube4ScrambleGenerator);
|
|
50
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_5.megaminxScrambleGenerator);
|
|
51
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_6.cube5ScrambleGenerator);
|
|
52
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_7.cube6ScrambleGenerator);
|
|
53
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_8.cube7ScrambleGenerator);
|
|
54
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_9.pyraminxScrambleGenerator);
|
|
55
|
+
(0, index_js_1.registerScrambleGenerator)(index_js_10.clockScrambleGenerator);
|
|
56
|
+
exports.cube2 = __importStar(require("./cube2/index.js"));
|
|
57
|
+
exports.cube3 = __importStar(require("./cube3/index.js"));
|
|
58
|
+
exports.cube4 = __importStar(require("./cube4/index.js"));
|
|
59
|
+
exports.megaminx = __importStar(require("./megaminx/index.js"));
|
|
60
|
+
exports.cube5x5 = __importStar(require("./cube5x5/index.js"));
|
|
61
|
+
exports.cube6x6 = __importStar(require("./cube6x6/index.js"));
|
|
62
|
+
exports.cube7x7 = __importStar(require("./cube7x7/index.js"));
|
|
63
|
+
exports.pyraminx = __importStar(require("./pyraminx/index.js"));
|
|
64
|
+
exports.clock = __importStar(require("./clock/index.js"));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateMegaminxScramble = exports.megaminxScrambleGenerator = exports.MOVES_PER_LINE = exports.SCRAMBLE_LINES = exports.MEGAMINX_D_MOVES = exports.MEGAMINX_R_MOVES = void 0;
|
|
4
|
+
var types_js_1 = require("./types.js");
|
|
5
|
+
Object.defineProperty(exports, "MEGAMINX_R_MOVES", { enumerable: true, get: function () { return types_js_1.MEGAMINX_R_MOVES; } });
|
|
6
|
+
Object.defineProperty(exports, "MEGAMINX_D_MOVES", { enumerable: true, get: function () { return types_js_1.MEGAMINX_D_MOVES; } });
|
|
7
|
+
Object.defineProperty(exports, "SCRAMBLE_LINES", { enumerable: true, get: function () { return types_js_1.SCRAMBLE_LINES; } });
|
|
8
|
+
Object.defineProperty(exports, "MOVES_PER_LINE", { enumerable: true, get: function () { return types_js_1.MOVES_PER_LINE; } });
|
|
9
|
+
var scrambler_js_1 = require("./scrambler.js");
|
|
10
|
+
Object.defineProperty(exports, "megaminxScrambleGenerator", { enumerable: true, get: function () { return scrambler_js_1.megaminxScrambleGenerator; } });
|
|
11
|
+
Object.defineProperty(exports, "generateMegaminxScramble", { enumerable: true, get: function () { return scrambler_js_1.generateMegaminxScramble; } });
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.megaminxScrambleGenerator = void 0;
|
|
4
|
+
exports.generateMegaminxScramble = generateMegaminxScramble;
|
|
5
|
+
const index_js_1 = require("../../random/index.js");
|
|
6
|
+
const types_js_1 = require("./types.js");
|
|
7
|
+
exports.megaminxScrambleGenerator = {
|
|
8
|
+
info: {
|
|
9
|
+
eventId: "mega",
|
|
10
|
+
name: "Megaminx",
|
|
11
|
+
puzzle: "megaminx",
|
|
12
|
+
quality: "random-move",
|
|
13
|
+
generator: "megaminx-random-move",
|
|
14
|
+
description: "Random-move Megaminx scramble using WCA notation (7 lines of 10 moves + U/U')."
|
|
15
|
+
},
|
|
16
|
+
generate(options = {}) {
|
|
17
|
+
return generateMegaminxScramble(options);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function generateMegaminxScramble(options = {}) {
|
|
21
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
22
|
+
const moves = [];
|
|
23
|
+
for (let line = 0; line < types_js_1.SCRAMBLE_LINES; line++) {
|
|
24
|
+
let lastD = "D++";
|
|
25
|
+
for (let pair = 0; pair < 5; pair++) {
|
|
26
|
+
const rMove = random.choice(types_js_1.MEGAMINX_R_MOVES);
|
|
27
|
+
const dMove = random.choice(types_js_1.MEGAMINX_D_MOVES);
|
|
28
|
+
moves.push(rMove, dMove);
|
|
29
|
+
lastD = dMove;
|
|
30
|
+
}
|
|
31
|
+
const uMove = lastD === "D++" ? "U" : "U'";
|
|
32
|
+
moves.push(uMove);
|
|
33
|
+
}
|
|
34
|
+
const scramble = formatMegaminxScramble(moves);
|
|
35
|
+
const result = {
|
|
36
|
+
eventId: "mega",
|
|
37
|
+
scramble,
|
|
38
|
+
moves,
|
|
39
|
+
quality: "random-move",
|
|
40
|
+
generator: "megaminx-random-move",
|
|
41
|
+
metadata: {
|
|
42
|
+
lines: types_js_1.SCRAMBLE_LINES,
|
|
43
|
+
movesPerLine: types_js_1.MOVES_PER_LINE,
|
|
44
|
+
totalMoves: moves.length,
|
|
45
|
+
distribution: "random-move-wca-format"
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
if (options.seed !== undefined) {
|
|
49
|
+
result.seed = options.seed;
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
function formatMegaminxScramble(moves) {
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (let i = 0; i < types_js_1.SCRAMBLE_LINES; i++) {
|
|
56
|
+
const lineMoves = moves.slice(i * types_js_1.MOVES_PER_LINE, (i + 1) * types_js_1.MOVES_PER_LINE);
|
|
57
|
+
lines.push(lineMoves.join(" "));
|
|
58
|
+
}
|
|
59
|
+
return lines.join("\n");
|
|
60
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MOVES_PER_LINE = exports.SCRAMBLE_LINES = exports.MEGAMINX_D_MOVES = exports.MEGAMINX_R_MOVES = void 0;
|
|
4
|
+
exports.MEGAMINX_R_MOVES = ["R++", "R--"];
|
|
5
|
+
exports.MEGAMINX_D_MOVES = ["D++", "D--"];
|
|
6
|
+
exports.SCRAMBLE_LINES = 7;
|
|
7
|
+
exports.MOVES_PER_LINE = 11;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.solvePyraminx = exports.generatePyraminxScramble = exports.pyraminxScrambleGenerator = exports.generateRandomPyraminxState = exports.isAllowedRandomPyraminxState = exports.validatePyraminxState = exports.permutationParity = exports.isSolvedPyraminxState = exports.pyraminxStatesEqual = exports.createSolvedPyraminxState = exports.clonePyraminxState = exports.parsePyraminxMove = exports.parsePyraminxAlgorithm = exports.invertPyraminxMove = exports.invertPyraminxAlgorithm = exports.formatPyraminxAlgorithm = exports.applyPyraminxMove = exports.applyPyraminxAlgorithm = exports.PYRAMINX_TIPS = exports.PYRAMINX_CORE_MOVES = void 0;
|
|
4
|
+
var types_js_1 = require("./types.js");
|
|
5
|
+
Object.defineProperty(exports, "PYRAMINX_CORE_MOVES", { enumerable: true, get: function () { return types_js_1.PYRAMINX_CORE_MOVES; } });
|
|
6
|
+
Object.defineProperty(exports, "PYRAMINX_TIPS", { enumerable: true, get: function () { return types_js_1.PYRAMINX_TIPS; } });
|
|
7
|
+
var moves_js_1 = require("./moves.js");
|
|
8
|
+
Object.defineProperty(exports, "applyPyraminxAlgorithm", { enumerable: true, get: function () { return moves_js_1.applyPyraminxAlgorithm; } });
|
|
9
|
+
Object.defineProperty(exports, "applyPyraminxMove", { enumerable: true, get: function () { return moves_js_1.applyPyraminxMove; } });
|
|
10
|
+
Object.defineProperty(exports, "formatPyraminxAlgorithm", { enumerable: true, get: function () { return moves_js_1.formatPyraminxAlgorithm; } });
|
|
11
|
+
Object.defineProperty(exports, "invertPyraminxAlgorithm", { enumerable: true, get: function () { return moves_js_1.invertPyraminxAlgorithm; } });
|
|
12
|
+
Object.defineProperty(exports, "invertPyraminxMove", { enumerable: true, get: function () { return moves_js_1.invertPyraminxMove; } });
|
|
13
|
+
Object.defineProperty(exports, "parsePyraminxAlgorithm", { enumerable: true, get: function () { return moves_js_1.parsePyraminxAlgorithm; } });
|
|
14
|
+
Object.defineProperty(exports, "parsePyraminxMove", { enumerable: true, get: function () { return moves_js_1.parsePyraminxMove; } });
|
|
15
|
+
var state_js_1 = require("./state.js");
|
|
16
|
+
Object.defineProperty(exports, "clonePyraminxState", { enumerable: true, get: function () { return state_js_1.clonePyraminxState; } });
|
|
17
|
+
Object.defineProperty(exports, "createSolvedPyraminxState", { enumerable: true, get: function () { return state_js_1.createSolvedPyraminxState; } });
|
|
18
|
+
Object.defineProperty(exports, "pyraminxStatesEqual", { enumerable: true, get: function () { return state_js_1.pyraminxStatesEqual; } });
|
|
19
|
+
Object.defineProperty(exports, "isSolvedPyraminxState", { enumerable: true, get: function () { return state_js_1.isSolvedPyraminxState; } });
|
|
20
|
+
var validation_js_1 = require("./validation.js");
|
|
21
|
+
Object.defineProperty(exports, "permutationParity", { enumerable: true, get: function () { return validation_js_1.permutationParity; } });
|
|
22
|
+
Object.defineProperty(exports, "validatePyraminxState", { enumerable: true, get: function () { return validation_js_1.validatePyraminxState; } });
|
|
23
|
+
Object.defineProperty(exports, "isAllowedRandomPyraminxState", { enumerable: true, get: function () { return validation_js_1.isAllowedRandomPyraminxState; } });
|
|
24
|
+
var random_state_js_1 = require("./random-state.js");
|
|
25
|
+
Object.defineProperty(exports, "generateRandomPyraminxState", { enumerable: true, get: function () { return random_state_js_1.generateRandomPyraminxState; } });
|
|
26
|
+
var scrambler_js_1 = require("./scrambler.js");
|
|
27
|
+
Object.defineProperty(exports, "pyraminxScrambleGenerator", { enumerable: true, get: function () { return scrambler_js_1.pyraminxScrambleGenerator; } });
|
|
28
|
+
Object.defineProperty(exports, "generatePyraminxScramble", { enumerable: true, get: function () { return scrambler_js_1.generatePyraminxScramble; } });
|
|
29
|
+
var solver_js_1 = require("./solver.js");
|
|
30
|
+
Object.defineProperty(exports, "solvePyraminx", { enumerable: true, get: function () { return solver_js_1.solvePyraminx; } });
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyPyraminxMove = applyPyraminxMove;
|
|
4
|
+
exports.applyPyraminxAlgorithm = applyPyraminxAlgorithm;
|
|
5
|
+
exports.invertPyraminxAlgorithm = invertPyraminxAlgorithm;
|
|
6
|
+
exports.parsePyraminxAlgorithm = parsePyraminxAlgorithm;
|
|
7
|
+
exports.formatPyraminxAlgorithm = formatPyraminxAlgorithm;
|
|
8
|
+
exports.parsePyraminxMove = parsePyraminxMove;
|
|
9
|
+
exports.invertPyraminxMove = invertPyraminxMove;
|
|
10
|
+
const types_js_1 = require("./types.js");
|
|
11
|
+
const state_js_1 = require("./state.js");
|
|
12
|
+
// Mathematical representation of Pyraminx moves
|
|
13
|
+
function applyPyraminxMove(state, move) {
|
|
14
|
+
const isInverse = move.endsWith("'");
|
|
15
|
+
const baseMove = move.replace("'", "");
|
|
16
|
+
const isTip = baseMove === baseMove.toLowerCase();
|
|
17
|
+
const next = (0, state_js_1.clonePyraminxState)(state);
|
|
18
|
+
if (isTip) {
|
|
19
|
+
const tipIndex = types_js_1.PYRAMINX_TIPS.indexOf(baseMove);
|
|
20
|
+
if (tipIndex !== -1) {
|
|
21
|
+
if (isInverse) {
|
|
22
|
+
next.tips[tipIndex] = (next.tips[tipIndex] + 2) % 3;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
next.tips[tipIndex] = (next.tips[tipIndex] + 1) % 3;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return next;
|
|
29
|
+
}
|
|
30
|
+
// Otherwise, it is a core layer move
|
|
31
|
+
const face = baseMove;
|
|
32
|
+
const turns = isInverse ? 2 : 1; // CW is 1, CCW is 2 turns CW
|
|
33
|
+
for (let step = 0; step < turns; step++) {
|
|
34
|
+
applySingleCoreMoveCW(next, face);
|
|
35
|
+
}
|
|
36
|
+
return next;
|
|
37
|
+
}
|
|
38
|
+
function applySingleCoreMoveCW(state, face) {
|
|
39
|
+
const centers = state.centers;
|
|
40
|
+
const perm = state.edgesPerm;
|
|
41
|
+
const orient = state.edgesOrient;
|
|
42
|
+
// Clone arrays for temporary storage
|
|
43
|
+
const prevPerm = [...perm];
|
|
44
|
+
const prevOrient = [...orient];
|
|
45
|
+
if (face === "U") {
|
|
46
|
+
// Center
|
|
47
|
+
centers[0] = (centers[0] + 1) % 3;
|
|
48
|
+
// Edges cycle: 0 -> 1 -> 2 -> 0 (UL -> UR -> UB -> UL)
|
|
49
|
+
// No orientation flips for U
|
|
50
|
+
perm[1] = prevPerm[0];
|
|
51
|
+
perm[2] = prevPerm[1];
|
|
52
|
+
perm[0] = prevPerm[2];
|
|
53
|
+
orient[1] = prevOrient[0];
|
|
54
|
+
orient[2] = prevOrient[1];
|
|
55
|
+
orient[0] = prevOrient[2];
|
|
56
|
+
}
|
|
57
|
+
else if (face === "L") {
|
|
58
|
+
// Center
|
|
59
|
+
centers[1] = (centers[1] + 1) % 3;
|
|
60
|
+
// Edges cycle: 0 -> 4 -> 3 -> 0 (UL -> LB -> LR -> UL)
|
|
61
|
+
// Flips: UL(0) flips, LB(4) flips, LR(3) does not flip
|
|
62
|
+
perm[4] = prevPerm[0];
|
|
63
|
+
perm[3] = prevPerm[4];
|
|
64
|
+
perm[0] = prevPerm[3];
|
|
65
|
+
orient[4] = (prevOrient[0] + 1) % 2;
|
|
66
|
+
orient[3] = (prevOrient[4] + 1) % 2;
|
|
67
|
+
orient[0] = prevOrient[3];
|
|
68
|
+
}
|
|
69
|
+
else if (face === "R") {
|
|
70
|
+
// Center
|
|
71
|
+
centers[2] = (centers[2] + 1) % 3;
|
|
72
|
+
// Edges cycle: 1 -> 3 -> 5 -> 1 (UR -> LR -> RB -> UR)
|
|
73
|
+
// Flips: UR(1) flips, LR(3) flips, RB(5) does not flip
|
|
74
|
+
perm[3] = prevPerm[1];
|
|
75
|
+
perm[5] = prevPerm[3];
|
|
76
|
+
perm[1] = prevPerm[5];
|
|
77
|
+
orient[3] = (prevOrient[1] + 1) % 2;
|
|
78
|
+
orient[5] = (prevOrient[3] + 1) % 2;
|
|
79
|
+
orient[1] = prevOrient[5];
|
|
80
|
+
}
|
|
81
|
+
else if (face === "B") {
|
|
82
|
+
// Center
|
|
83
|
+
centers[3] = (centers[3] + 1) % 3;
|
|
84
|
+
// Edges cycle: 2 -> 5 -> 4 -> 2 (UB -> RB -> LB -> UB)
|
|
85
|
+
// Flips: UB(2) flips, RB(5) flips, LB(4) does not flip
|
|
86
|
+
perm[5] = prevPerm[2];
|
|
87
|
+
perm[4] = prevPerm[5];
|
|
88
|
+
perm[2] = prevPerm[4];
|
|
89
|
+
orient[5] = (prevOrient[2] + 1) % 2;
|
|
90
|
+
orient[4] = (prevOrient[5] + 1) % 2;
|
|
91
|
+
orient[2] = prevOrient[4];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function applyPyraminxAlgorithm(state, moves) {
|
|
95
|
+
return moves.reduce((current, move) => applyPyraminxMove(current, move), state);
|
|
96
|
+
}
|
|
97
|
+
function invertPyraminxAlgorithm(moves) {
|
|
98
|
+
return [...moves].reverse().map(invertPyraminxMove);
|
|
99
|
+
}
|
|
100
|
+
function parsePyraminxAlgorithm(algorithm) {
|
|
101
|
+
const trimmed = algorithm.trim();
|
|
102
|
+
if (trimmed.length === 0) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return trimmed.split(/\s+/).map(parsePyraminxMove);
|
|
106
|
+
}
|
|
107
|
+
function formatPyraminxAlgorithm(moves) {
|
|
108
|
+
return moves.join(" ");
|
|
109
|
+
}
|
|
110
|
+
function parsePyraminxMove(value) {
|
|
111
|
+
const baseMove = value.replace("'", "");
|
|
112
|
+
const isInverse = value.endsWith("'") || value.endsWith(""); // wait, standard validation
|
|
113
|
+
if (types_js_1.PYRAMINX_CORE_MOVES.includes(value) || types_js_1.PYRAMINX_TIPS.map(t => `${t}'`).includes(value) || types_js_1.PYRAMINX_TIPS.includes(value)) {
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
if (types_js_1.PYRAMINX_CORE_MOVES.map(m => `${m}'`).includes(value)) {
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Invalid Pyraminx move: ${value}`);
|
|
120
|
+
}
|
|
121
|
+
function invertPyraminxMove(move) {
|
|
122
|
+
if (move.endsWith("'")) {
|
|
123
|
+
return move.slice(0, -1);
|
|
124
|
+
}
|
|
125
|
+
return `${move}'`;
|
|
126
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRandomPyraminxState = generateRandomPyraminxState;
|
|
4
|
+
const index_js_1 = require("../../random/index.js");
|
|
5
|
+
const validation_js_1 = require("./validation.js");
|
|
6
|
+
function generateRandomPyraminxState(options = {}) {
|
|
7
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
8
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
9
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
10
|
+
const state = createLegalRandomState(random);
|
|
11
|
+
if (!rejectTrivial || (0, validation_js_1.isAllowedRandomPyraminxState)(state)) {
|
|
12
|
+
return state;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
throw new Error("Unable to generate a non-trivial random Pyraminx state.");
|
|
16
|
+
}
|
|
17
|
+
function createLegalRandomState(random) {
|
|
18
|
+
// 4 random centers
|
|
19
|
+
const centers = Array.from({ length: 4 }, () => random.nextInt(3));
|
|
20
|
+
// 4 random tips
|
|
21
|
+
const tips = Array.from({ length: 4 }, () => random.nextInt(3));
|
|
22
|
+
// 6 edges permutation
|
|
23
|
+
const edgesPerm = shuffledRange(6, random);
|
|
24
|
+
// Ensure even parity
|
|
25
|
+
if ((0, validation_js_1.permutationParity)(edgesPerm) !== 0) {
|
|
26
|
+
// Swap the first two elements to flip parity
|
|
27
|
+
const temp = edgesPerm[0];
|
|
28
|
+
edgesPerm[0] = edgesPerm[1];
|
|
29
|
+
edgesPerm[1] = temp;
|
|
30
|
+
}
|
|
31
|
+
// 6 edges orientation (sum must be even)
|
|
32
|
+
const edgesOrient = Array(6).fill(0);
|
|
33
|
+
let sumOrient = 0;
|
|
34
|
+
for (let i = 0; i < 5; i++) {
|
|
35
|
+
const val = random.nextInt(2);
|
|
36
|
+
edgesOrient[i] = val;
|
|
37
|
+
sumOrient += val;
|
|
38
|
+
}
|
|
39
|
+
edgesOrient[5] = sumOrient % 2 === 0 ? 0 : 1;
|
|
40
|
+
return {
|
|
41
|
+
centers,
|
|
42
|
+
edgesPerm,
|
|
43
|
+
edgesOrient,
|
|
44
|
+
tips
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function shuffledRange(length, random) {
|
|
48
|
+
const values = Array.from({ length }, (_, index) => index);
|
|
49
|
+
for (let index = values.length - 1; index > 0; index -= 1) {
|
|
50
|
+
const swapIndex = random.nextInt(index + 1);
|
|
51
|
+
const temporary = values[index];
|
|
52
|
+
values[index] = values[swapIndex];
|
|
53
|
+
values[swapIndex] = temporary;
|
|
54
|
+
}
|
|
55
|
+
return values;
|
|
56
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pyraminxScrambleGenerator = void 0;
|
|
4
|
+
exports.generatePyraminxScramble = generatePyraminxScramble;
|
|
5
|
+
const random_state_js_1 = require("./random-state.js");
|
|
6
|
+
const state_js_1 = require("./state.js");
|
|
7
|
+
const moves_js_1 = require("./moves.js");
|
|
8
|
+
const solver_js_1 = require("./solver.js");
|
|
9
|
+
exports.pyraminxScrambleGenerator = {
|
|
10
|
+
info: {
|
|
11
|
+
eventId: "pyrso",
|
|
12
|
+
name: "Pyraminx",
|
|
13
|
+
puzzle: "pyraminx",
|
|
14
|
+
quality: "random-state",
|
|
15
|
+
generator: "pyraminx-ida-star",
|
|
16
|
+
description: "Random-state Pyraminx scramble generated by an optimal bidirectional BFS solver."
|
|
17
|
+
},
|
|
18
|
+
generate(options = {}) {
|
|
19
|
+
return generatePyraminxScramble(options);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
async function generatePyraminxScramble(options = {}) {
|
|
23
|
+
const state = (0, random_state_js_1.generateRandomPyraminxState)(options);
|
|
24
|
+
// Solve the core edges and centers
|
|
25
|
+
const solution = (0, solver_js_1.solvePyraminx)(state);
|
|
26
|
+
const scrambleMoves = (0, moves_js_1.invertPyraminxAlgorithm)(solution);
|
|
27
|
+
// Append tips to scrambleMoves
|
|
28
|
+
const finalMoves = [...scrambleMoves];
|
|
29
|
+
const tipsNotation = ["u", "l", "r", "b"];
|
|
30
|
+
for (let i = 0; i < 4; i++) {
|
|
31
|
+
const tipVal = state.tips[i];
|
|
32
|
+
if (tipVal === 1) {
|
|
33
|
+
finalMoves.push(tipsNotation[i]);
|
|
34
|
+
}
|
|
35
|
+
else if (tipVal === 2) {
|
|
36
|
+
finalMoves.push(`${tipsNotation[i]}'`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!options.skipValidation) {
|
|
40
|
+
const scrambledState = (0, moves_js_1.applyPyraminxAlgorithm)((0, state_js_1.createSolvedPyraminxState)(), finalMoves);
|
|
41
|
+
if (scrambledState.edgesPerm.toString() !== state.edgesPerm.toString() ||
|
|
42
|
+
scrambledState.edgesOrient.toString() !== state.edgesOrient.toString() ||
|
|
43
|
+
scrambledState.centers.toString() !== state.centers.toString() ||
|
|
44
|
+
scrambledState.tips.toString() !== state.tips.toString()) {
|
|
45
|
+
throw new Error("Generated Pyraminx scramble does not reproduce the target random state.");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
eventId: "pyrso",
|
|
50
|
+
scramble: finalMoves.join(" "),
|
|
51
|
+
moves: finalMoves,
|
|
52
|
+
quality: "random-state",
|
|
53
|
+
generator: "pyraminx-ida-star",
|
|
54
|
+
metadata: {
|
|
55
|
+
state,
|
|
56
|
+
solutionMoves: solution,
|
|
57
|
+
solutionDepth: solution.length
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|