@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 @@
|
|
|
1
|
+
{"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/clock/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAUF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAoCzB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const clockScrambleGenerator = {
|
|
2
|
+
info: {
|
|
3
|
+
eventId: "clkwca",
|
|
4
|
+
name: "Clock",
|
|
5
|
+
puzzle: "clock",
|
|
6
|
+
quality: "random-state",
|
|
7
|
+
generator: "clock-random-moves",
|
|
8
|
+
description: "Generates standard WCA Clock scrambles."
|
|
9
|
+
},
|
|
10
|
+
generate(options = {}) {
|
|
11
|
+
return generateClockScramble(options);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
function getRandomTurns() {
|
|
15
|
+
const value = Math.floor(Math.random() * 12) - 5; // -5 to +6
|
|
16
|
+
if (value >= 0) {
|
|
17
|
+
return `${value}+`;
|
|
18
|
+
}
|
|
19
|
+
return `${Math.abs(value)}-`;
|
|
20
|
+
}
|
|
21
|
+
export async function generateClockScramble(options = {}) {
|
|
22
|
+
const moves = [];
|
|
23
|
+
// Front face moves
|
|
24
|
+
const frontPins = ["UR", "DR", "DL", "UL", "U", "R", "D", "L", "ALL"];
|
|
25
|
+
for (const pin of frontPins) {
|
|
26
|
+
moves.push(`${pin}${getRandomTurns()}`);
|
|
27
|
+
}
|
|
28
|
+
// Flip
|
|
29
|
+
moves.push("y2");
|
|
30
|
+
// Back face moves
|
|
31
|
+
const backPins = ["U", "R", "D", "L", "ALL"];
|
|
32
|
+
for (const pin of backPins) {
|
|
33
|
+
moves.push(`${pin}${getRandomTurns()}`);
|
|
34
|
+
}
|
|
35
|
+
// Final pins state
|
|
36
|
+
const pins = ["UR", "DR", "DL", "UL"];
|
|
37
|
+
const finalPins = pins.filter(() => Math.random() < 0.5);
|
|
38
|
+
const finalPinsStr = finalPins.join(" ");
|
|
39
|
+
const scramble = [...moves, finalPinsStr].filter(Boolean).join(" ");
|
|
40
|
+
return {
|
|
41
|
+
eventId: "clkwca",
|
|
42
|
+
scramble,
|
|
43
|
+
moves, // For moves we return the steps without final pins as parsed moves, or just string array
|
|
44
|
+
quality: "random-state",
|
|
45
|
+
generator: "clock-random-moves",
|
|
46
|
+
metadata: {
|
|
47
|
+
finalPins
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Cube2Face, Cube2Facelets, Cube2State } from "./types.js";
|
|
2
|
+
export declare function toCube2Facelets(state: Cube2State): Cube2Facelets;
|
|
3
|
+
export declare function formatCube2Facelets(facelets: Cube2Facelets): string;
|
|
4
|
+
export declare function getCube2FaceOrder(): readonly Cube2Face[];
|
|
5
|
+
//# sourceMappingURL=facelets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facelets.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/facelets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AA4BrF,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAehE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,IAAI,SAAS,SAAS,EAAE,CAExD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const FACE_ORDER = ["U", "R", "F", "D", "L", "B"];
|
|
2
|
+
const CORNER_PIECE_STICKERS = [
|
|
3
|
+
["U", "R", "F"],
|
|
4
|
+
["U", "F", "L"],
|
|
5
|
+
["U", "L", "B"],
|
|
6
|
+
["U", "B", "R"],
|
|
7
|
+
["D", "F", "R"],
|
|
8
|
+
["D", "L", "F"],
|
|
9
|
+
["D", "B", "L"],
|
|
10
|
+
["D", "R", "B"]
|
|
11
|
+
];
|
|
12
|
+
const CORNER_POSITION_SLOTS = [
|
|
13
|
+
[["U", 3], ["R", 0], ["F", 1]],
|
|
14
|
+
[["U", 2], ["F", 0], ["L", 1]],
|
|
15
|
+
[["U", 0], ["L", 0], ["B", 1]],
|
|
16
|
+
[["U", 1], ["B", 0], ["R", 1]],
|
|
17
|
+
[["D", 1], ["F", 3], ["R", 2]],
|
|
18
|
+
[["D", 0], ["L", 3], ["F", 2]],
|
|
19
|
+
[["D", 2], ["B", 3], ["L", 2]],
|
|
20
|
+
[["D", 3], ["R", 3], ["B", 2]]
|
|
21
|
+
];
|
|
22
|
+
export function toCube2Facelets(state) {
|
|
23
|
+
const facelets = createEmptyFacelets();
|
|
24
|
+
for (let position = 0; position < CORNER_POSITION_SLOTS.length; position += 1) {
|
|
25
|
+
const piece = state.corners.permutation[position];
|
|
26
|
+
const orientation = state.corners.orientation[position];
|
|
27
|
+
placeOrientedStickers(facelets, CORNER_POSITION_SLOTS[position], CORNER_PIECE_STICKERS[piece], orientation);
|
|
28
|
+
}
|
|
29
|
+
return facelets;
|
|
30
|
+
}
|
|
31
|
+
export function formatCube2Facelets(facelets) {
|
|
32
|
+
return FACE_ORDER.map((face) => facelets[face].join("")).join("");
|
|
33
|
+
}
|
|
34
|
+
export function getCube2FaceOrder() {
|
|
35
|
+
return FACE_ORDER;
|
|
36
|
+
}
|
|
37
|
+
function createEmptyFacelets() {
|
|
38
|
+
return {
|
|
39
|
+
U: Array(4).fill("U"),
|
|
40
|
+
R: Array(4).fill("R"),
|
|
41
|
+
F: Array(4).fill("F"),
|
|
42
|
+
D: Array(4).fill("D"),
|
|
43
|
+
L: Array(4).fill("L"),
|
|
44
|
+
B: Array(4).fill("B")
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function placeOrientedStickers(facelets, slots, stickers, orientation) {
|
|
48
|
+
for (let index = 0; index < slots.length; index += 1) {
|
|
49
|
+
const [face, stickerIndex] = slots[index];
|
|
50
|
+
const sticker = stickers[(index - orientation + stickers.length) % stickers.length];
|
|
51
|
+
facelets[face][stickerIndex] = sticker;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { CUBE2_MOVES, CORNER_COUNT } from "./types.js";
|
|
2
|
+
export type { Cube2Face, Cube2Facelets, Cube2Move, Cube2FaceMove, Cube2MoveSuffix, Cube2RandomStateOptions, Cube2State, Cube2ValidationResult } from "./types.js";
|
|
3
|
+
export { applyCube2Algorithm, applyCube2Move, formatCube2Algorithm, invertCube2Algorithm, invertCube2Move, parseCube2Algorithm, parseCube2Move } from "./moves.js";
|
|
4
|
+
export { cloneCube2State, createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
|
|
5
|
+
export { isAllowedRandomCube2State, isOneMoveFromSolvedCube2State, permutationParity, validateCube2State } from "./validation.js";
|
|
6
|
+
export { generateRandomCube2State } from "./random-state.js";
|
|
7
|
+
export { cube2ScrambleGenerator, generateCube2Scramble } from "./scrambler.js";
|
|
8
|
+
export { formatCube2Facelets, getCube2FaceOrder, toCube2Facelets } from "./facelets.js";
|
|
9
|
+
export * as solver from "./solver/index.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { CUBE2_MOVES, CORNER_COUNT } from "./types.js";
|
|
2
|
+
export { applyCube2Algorithm, applyCube2Move, formatCube2Algorithm, invertCube2Algorithm, invertCube2Move, parseCube2Algorithm, parseCube2Move } from "./moves.js";
|
|
3
|
+
export { cloneCube2State, createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
|
|
4
|
+
export { isAllowedRandomCube2State, isOneMoveFromSolvedCube2State, permutationParity, validateCube2State } from "./validation.js";
|
|
5
|
+
export { generateRandomCube2State } from "./random-state.js";
|
|
6
|
+
export { cube2ScrambleGenerator, generateCube2Scramble } from "./scrambler.js";
|
|
7
|
+
export { formatCube2Facelets, getCube2FaceOrder, toCube2Facelets } from "./facelets.js";
|
|
8
|
+
export * as solver from "./solver/index.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Cube2Move, Cube2State } from "./types.js";
|
|
2
|
+
export declare function applyCube2Move(state: Cube2State, move: Cube2Move): Cube2State;
|
|
3
|
+
export declare function applyCube2Algorithm(state: Cube2State, moves: readonly Cube2Move[]): Cube2State;
|
|
4
|
+
export declare function invertCube2Algorithm(moves: readonly Cube2Move[]): Cube2Move[];
|
|
5
|
+
export declare function parseCube2Algorithm(algorithm: string): Cube2Move[];
|
|
6
|
+
export declare function formatCube2Algorithm(moves: readonly Cube2Move[]): string;
|
|
7
|
+
export declare function parseCube2Move(value: string): Cube2Move;
|
|
8
|
+
export declare function invertCube2Move(move: Cube2Move): Cube2Move;
|
|
9
|
+
//# sourceMappingURL=moves.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/moves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,SAAS,EAAmB,UAAU,EAAE,MAAM,YAAY,CAAC;AAmCxF,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAS7E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAE9F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAE7E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAOlE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAExE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAMvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAQ1D"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { CUBE2_MOVES } from "./types.js";
|
|
2
|
+
import { cloneCube2State } from "./state.js";
|
|
3
|
+
const FACE_MOVE_TABLES = {
|
|
4
|
+
U: {
|
|
5
|
+
permutation: [3, 0, 1, 2, 4, 5, 6, 7],
|
|
6
|
+
orientation: [0, 0, 0, 0, 0, 0, 0, 0]
|
|
7
|
+
},
|
|
8
|
+
D: {
|
|
9
|
+
permutation: [0, 1, 2, 3, 5, 6, 7, 4],
|
|
10
|
+
orientation: [0, 0, 0, 0, 0, 0, 0, 0]
|
|
11
|
+
},
|
|
12
|
+
R: {
|
|
13
|
+
permutation: [4, 1, 2, 0, 7, 5, 6, 3],
|
|
14
|
+
orientation: [2, 0, 0, 1, 1, 0, 0, 2]
|
|
15
|
+
},
|
|
16
|
+
L: {
|
|
17
|
+
permutation: [0, 2, 6, 3, 4, 1, 5, 7],
|
|
18
|
+
orientation: [0, 1, 2, 0, 0, 2, 1, 0]
|
|
19
|
+
},
|
|
20
|
+
F: {
|
|
21
|
+
permutation: [1, 5, 2, 3, 0, 4, 6, 7],
|
|
22
|
+
orientation: [1, 2, 0, 0, 2, 1, 0, 0]
|
|
23
|
+
},
|
|
24
|
+
B: {
|
|
25
|
+
permutation: [0, 1, 3, 7, 4, 5, 2, 6],
|
|
26
|
+
orientation: [0, 0, 1, 2, 0, 0, 2, 1]
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export function applyCube2Move(state, move) {
|
|
30
|
+
const { face, turns } = parseMoveParts(move);
|
|
31
|
+
let next = cloneCube2State(state);
|
|
32
|
+
for (let index = 0; index < turns; index += 1) {
|
|
33
|
+
next = applyFaceMove(next, FACE_MOVE_TABLES[face]);
|
|
34
|
+
}
|
|
35
|
+
return next;
|
|
36
|
+
}
|
|
37
|
+
export function applyCube2Algorithm(state, moves) {
|
|
38
|
+
return moves.reduce((current, move) => applyCube2Move(current, move), state);
|
|
39
|
+
}
|
|
40
|
+
export function invertCube2Algorithm(moves) {
|
|
41
|
+
return [...moves].reverse().map(invertCube2Move);
|
|
42
|
+
}
|
|
43
|
+
export function parseCube2Algorithm(algorithm) {
|
|
44
|
+
const trimmed = algorithm.trim();
|
|
45
|
+
if (trimmed.length === 0) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return trimmed.split(/\s+/).map(parseCube2Move);
|
|
49
|
+
}
|
|
50
|
+
export function formatCube2Algorithm(moves) {
|
|
51
|
+
return moves.join(" ");
|
|
52
|
+
}
|
|
53
|
+
export function parseCube2Move(value) {
|
|
54
|
+
if (CUBE2_MOVES.includes(value)) {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`Invalid 2x2 move: ${value}`);
|
|
58
|
+
}
|
|
59
|
+
export function invertCube2Move(move) {
|
|
60
|
+
const { face, suffix } = parseMoveParts(move);
|
|
61
|
+
if (suffix === "2") {
|
|
62
|
+
return move;
|
|
63
|
+
}
|
|
64
|
+
return `${face}${suffix === "'" ? "" : "'"}`;
|
|
65
|
+
}
|
|
66
|
+
function applyFaceMove(state, table) {
|
|
67
|
+
return {
|
|
68
|
+
corners: {
|
|
69
|
+
permutation: table.permutation.map((source) => state.corners.permutation[source]),
|
|
70
|
+
orientation: table.permutation.map((source, target) => ((state.corners.orientation[source] + table.orientation[target]) % 3))
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function parseMoveParts(move) {
|
|
75
|
+
const face = move[0];
|
|
76
|
+
const suffix = move.slice(1);
|
|
77
|
+
const turns = suffix === "2" ? 2 : suffix === "'" ? 3 : 1;
|
|
78
|
+
return { face, suffix, turns };
|
|
79
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random-state.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/random-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtE,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAa1F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createRandomSource } from "../../random/index.js";
|
|
2
|
+
import { CORNER_COUNT } from "./types.js";
|
|
3
|
+
import { isAllowedRandomCube2State } from "./validation.js";
|
|
4
|
+
export function generateRandomCube2State(options = {}) {
|
|
5
|
+
const random = createRandomSource(options.seed);
|
|
6
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
7
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
8
|
+
const state = createLegalRandomState(random);
|
|
9
|
+
if (!rejectTrivial || isAllowedRandomCube2State(state)) {
|
|
10
|
+
return state;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
throw new Error("Unable to generate a non-trivial random 2x2 state.");
|
|
14
|
+
}
|
|
15
|
+
function createLegalRandomState(random) {
|
|
16
|
+
const perm7 = shuffledRange(CORNER_COUNT - 1, random);
|
|
17
|
+
const mappedPerm = perm7.map((val) => (val >= 6 ? val + 1 : val));
|
|
18
|
+
mappedPerm.splice(6, 0, 6);
|
|
19
|
+
const orient7 = randomOrientations(CORNER_COUNT - 1, 3, random);
|
|
20
|
+
orient7.splice(6, 0, 0);
|
|
21
|
+
return {
|
|
22
|
+
corners: {
|
|
23
|
+
permutation: mappedPerm,
|
|
24
|
+
orientation: orient7
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function shuffledRange(length, random) {
|
|
29
|
+
const values = Array.from({ length }, (_, index) => index);
|
|
30
|
+
for (let index = values.length - 1; index > 0; index -= 1) {
|
|
31
|
+
const swapIndex = random.nextInt(index + 1);
|
|
32
|
+
swap(values, index, swapIndex);
|
|
33
|
+
}
|
|
34
|
+
return values;
|
|
35
|
+
}
|
|
36
|
+
function randomOrientations(length, modulo, random) {
|
|
37
|
+
const orientations = Array(length).fill(0);
|
|
38
|
+
let total = 0;
|
|
39
|
+
for (let index = 0; index < length - 1; index += 1) {
|
|
40
|
+
const orientation = random.nextInt(modulo);
|
|
41
|
+
orientations[index] = orientation;
|
|
42
|
+
total += orientation;
|
|
43
|
+
}
|
|
44
|
+
orientations[length - 1] = (modulo - (total % modulo)) % modulo;
|
|
45
|
+
return orientations;
|
|
46
|
+
}
|
|
47
|
+
function swap(values, left, right) {
|
|
48
|
+
const temporary = values[left];
|
|
49
|
+
values[left] = values[right];
|
|
50
|
+
values[right] = temporary;
|
|
51
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
|
|
2
|
+
export declare const cube2ScrambleGenerator: ScrambleGenerator;
|
|
3
|
+
export declare function generateCube2Scramble(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/cube2/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAW9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CA0CzB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { applyCube2Algorithm, formatCube2Algorithm, invertCube2Algorithm } from "./moves.js";
|
|
2
|
+
import { generateRandomCube2State } from "./random-state.js";
|
|
3
|
+
import { createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
|
|
4
|
+
import { formatCube2Facelets, toCube2Facelets } from "./facelets.js";
|
|
5
|
+
import { solveCube2State } from "./solver/index.js";
|
|
6
|
+
export const cube2ScrambleGenerator = {
|
|
7
|
+
info: {
|
|
8
|
+
eventId: "222",
|
|
9
|
+
name: "2x2x2 Cube",
|
|
10
|
+
puzzle: "cube-2x2",
|
|
11
|
+
quality: "random-state",
|
|
12
|
+
generator: "cube2-ida-star",
|
|
13
|
+
description: "Random-state 2x2 scramble generated by an optimal IDA* corner solver."
|
|
14
|
+
},
|
|
15
|
+
generate(options = {}) {
|
|
16
|
+
return generateCube2Scramble(options);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export async function generateCube2Scramble(options = {}) {
|
|
20
|
+
const state = generateRandomCube2State(options);
|
|
21
|
+
const solution = await solveCube2State(state);
|
|
22
|
+
const scrambleMoves = invertCube2Algorithm(solution.moves);
|
|
23
|
+
if (!options.skipValidation) {
|
|
24
|
+
const scrambledState = applyCube2Algorithm(createSolvedCube2State(), scrambleMoves);
|
|
25
|
+
if (!cube2StatesEqual(scrambledState, state)) {
|
|
26
|
+
throw new Error("Generated 2x2 scramble does not reproduce the target random state.");
|
|
27
|
+
}
|
|
28
|
+
if (!isSolvedCube2State(solution.state)) {
|
|
29
|
+
throw new Error("Generated 2x2 solution does not solve the target random state.");
|
|
30
|
+
}
|
|
31
|
+
if (scrambleMoves.length < 2) {
|
|
32
|
+
throw new Error("Generated 2x2 scramble is too short.");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const facelets = toCube2Facelets(state);
|
|
36
|
+
const result = {
|
|
37
|
+
eventId: "222",
|
|
38
|
+
scramble: formatCube2Algorithm(scrambleMoves),
|
|
39
|
+
moves: scrambleMoves,
|
|
40
|
+
quality: "random-state",
|
|
41
|
+
generator: "cube2-ida-star",
|
|
42
|
+
metadata: {
|
|
43
|
+
state,
|
|
44
|
+
facelets,
|
|
45
|
+
faceletString: formatCube2Facelets(facelets),
|
|
46
|
+
solutionMoves: solution.moves,
|
|
47
|
+
solutionDepth: solution.depth
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
if (options.seed !== undefined) {
|
|
51
|
+
result.seed = options.seed;
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function getCachedBrowserTables(): {
|
|
2
|
+
permutationTable: Uint16Array;
|
|
3
|
+
orientationTable: Uint16Array;
|
|
4
|
+
distances: Uint8Array;
|
|
5
|
+
} | undefined;
|
|
6
|
+
export declare function clearCachedBrowserTables(): void;
|
|
7
|
+
export declare function loadBrowserTables(baseUrl?: string): Promise<{
|
|
8
|
+
permutationTable: Uint16Array;
|
|
9
|
+
orientationTable: Uint16Array;
|
|
10
|
+
distances: Uint8Array;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=browser-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/browser-loader.ts"],"names":[],"mappings":"AAQA,wBAAgB,sBAAsB;sBALlB,WAAW;sBACX,WAAW;eAClB,UAAU;cAKtB;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAqBD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { CUBE2_SOLVER_TABLE_METADATA } from "./table-metadata.js";
|
|
2
|
+
let cachedBrowserTables;
|
|
3
|
+
export function getCachedBrowserTables() {
|
|
4
|
+
return cachedBrowserTables;
|
|
5
|
+
}
|
|
6
|
+
export function clearCachedBrowserTables() {
|
|
7
|
+
cachedBrowserTables = undefined;
|
|
8
|
+
}
|
|
9
|
+
export async function loadBrowserTables(baseUrl) {
|
|
10
|
+
if (cachedBrowserTables) {
|
|
11
|
+
return cachedBrowserTables;
|
|
12
|
+
}
|
|
13
|
+
const resolved = resolveBaseUrl(baseUrl);
|
|
14
|
+
const manifest = await fetchManifest(resolved);
|
|
15
|
+
const [permTable, orientTable, dist] = await Promise.all([
|
|
16
|
+
fetchUint16Table(resolved, manifest.files.permutationTable, CUBE2_SOLVER_TABLE_METADATA.permutationTable.entries),
|
|
17
|
+
fetchUint16Table(resolved, manifest.files.orientationTable, CUBE2_SOLVER_TABLE_METADATA.orientationTable.entries),
|
|
18
|
+
fetchUint8Table(resolved, manifest.files.distances, CUBE2_SOLVER_TABLE_METADATA.distances.entries)
|
|
19
|
+
]);
|
|
20
|
+
cachedBrowserTables = {
|
|
21
|
+
permutationTable: permTable,
|
|
22
|
+
orientationTable: orientTable,
|
|
23
|
+
distances: dist
|
|
24
|
+
};
|
|
25
|
+
return cachedBrowserTables;
|
|
26
|
+
}
|
|
27
|
+
function resolveBaseUrl(provided) {
|
|
28
|
+
if (provided) {
|
|
29
|
+
return provided.replace(/\/$/, "");
|
|
30
|
+
}
|
|
31
|
+
if (typeof document !== "undefined") {
|
|
32
|
+
const script = document.currentScript;
|
|
33
|
+
if (script?.src) {
|
|
34
|
+
const base = new URL(".", script.src).href;
|
|
35
|
+
return base.replace(/\/$/, "");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return ".";
|
|
39
|
+
}
|
|
40
|
+
async function fetchManifest(baseUrl) {
|
|
41
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/manifest.json`;
|
|
42
|
+
const response = await fetch(url);
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`Failed to load cube2 solver table manifest from ${url}: ${response.status} ${response.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
const manifest = await response.json();
|
|
47
|
+
if (manifest.version !== 1) {
|
|
48
|
+
throw new Error(`Unsupported cube2 solver table manifest version: ${manifest.version}`);
|
|
49
|
+
}
|
|
50
|
+
return manifest;
|
|
51
|
+
}
|
|
52
|
+
async function fetchUint16Table(baseUrl, entry, expectedEntries) {
|
|
53
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
|
|
54
|
+
const response = await fetch(url);
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
|
|
57
|
+
}
|
|
58
|
+
const buffer = await response.arrayBuffer();
|
|
59
|
+
if (buffer.byteLength !== expectedEntries * 2) {
|
|
60
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
61
|
+
}
|
|
62
|
+
const values = new Uint16Array(expectedEntries);
|
|
63
|
+
const view = new DataView(buffer);
|
|
64
|
+
for (let i = 0; i < values.length; i++) {
|
|
65
|
+
values[i] = view.getUint16(i * 2, true);
|
|
66
|
+
}
|
|
67
|
+
return values;
|
|
68
|
+
}
|
|
69
|
+
async function fetchUint8Table(baseUrl, entry, expectedEntries) {
|
|
70
|
+
const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
|
|
71
|
+
const response = await fetch(url);
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
|
|
74
|
+
}
|
|
75
|
+
const buffer = await response.arrayBuffer();
|
|
76
|
+
if (buffer.byteLength !== expectedEntries) {
|
|
77
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
78
|
+
}
|
|
79
|
+
return new Uint8Array(buffer);
|
|
80
|
+
}
|