@cubingcenter/scrambler 0.5.3 → 0.6.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 +24 -9
- package/dist/cli/index.js +0 -0
- package/dist/core/api.d.ts.map +1 -1
- package/dist/core/api.js +11 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/puzzles/cube4/index.d.ts +4 -2
- package/dist/puzzles/cube4/index.d.ts.map +1 -1
- package/dist/puzzles/cube4/index.js +3 -1
- package/dist/puzzles/cube4/random-state.d.ts +16 -0
- package/dist/puzzles/cube4/random-state.d.ts.map +1 -0
- package/dist/puzzles/cube4/random-state.js +76 -0
- package/dist/puzzles/cube4/reduction/browser-loader.d.ts +18 -0
- package/dist/puzzles/cube4/reduction/browser-loader.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/browser-loader.js +95 -0
- package/dist/puzzles/cube4/reduction/center1.d.ts +65 -0
- package/dist/puzzles/cube4/reduction/center1.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/center1.js +245 -0
- package/dist/puzzles/cube4/reduction/center2.d.ts +91 -0
- package/dist/puzzles/cube4/reduction/center2.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/center2.js +449 -0
- package/dist/puzzles/cube4/reduction/center3.d.ts +47 -0
- package/dist/puzzles/cube4/reduction/center3.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/center3.js +278 -0
- package/dist/puzzles/cube4/reduction/edge3.d.ts +100 -0
- package/dist/puzzles/cube4/reduction/edge3.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/edge3.js +511 -0
- package/dist/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
- package/dist/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
- package/dist/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
- package/dist/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
- package/dist/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
- package/dist/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
- package/dist/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
- package/dist/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
- package/dist/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
- package/dist/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
- package/dist/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
- package/dist/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
- package/dist/puzzles/cube4/reduction/geometry.d.ts +33 -0
- package/dist/puzzles/cube4/reduction/geometry.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/geometry.js +302 -0
- package/dist/puzzles/cube4/reduction/node-loader.d.ts +17 -0
- package/dist/puzzles/cube4/reduction/node-loader.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/node-loader.js +98 -0
- package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts +130 -0
- package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/pairing-coordinate.js +281 -0
- package/dist/puzzles/cube4/reduction/phase3-search.d.ts +42 -0
- package/dist/puzzles/cube4/reduction/phase3-search.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/phase3-search.js +133 -0
- package/dist/puzzles/cube4/reduction/phase3.d.ts +34 -0
- package/dist/puzzles/cube4/reduction/phase3.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/phase3.js +83 -0
- package/dist/puzzles/cube4/reduction/phase4.d.ts +35 -0
- package/dist/puzzles/cube4/reduction/phase4.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/phase4.js +82 -0
- package/dist/puzzles/cube4/reduction/solve.d.ts +31 -0
- package/dist/puzzles/cube4/reduction/solve.d.ts.map +1 -0
- package/dist/puzzles/cube4/reduction/solve.js +311 -0
- package/dist/puzzles/cube4/scrambler.d.ts +9 -1
- package/dist/puzzles/cube4/scrambler.d.ts.map +1 -1
- package/dist/puzzles/cube4/scrambler.js +123 -81
- package/dist/puzzles/cube4/types.d.ts +6 -0
- package/dist/puzzles/cube4/types.d.ts.map +1 -1
- package/dist/puzzles/cube4/validation.d.ts +6 -0
- package/dist/puzzles/cube4/validation.d.ts.map +1 -0
- package/dist/puzzles/cube4/validation.js +91 -0
- package/dist/puzzles/fto/coordinates.d.ts +53 -0
- package/dist/puzzles/fto/coordinates.d.ts.map +1 -0
- package/dist/puzzles/fto/coordinates.js +228 -0
- package/dist/puzzles/fto/facelets.d.ts +6 -0
- package/dist/puzzles/fto/facelets.d.ts.map +1 -0
- package/dist/puzzles/fto/facelets.js +99 -0
- package/dist/puzzles/fto/index.d.ts +12 -0
- package/dist/puzzles/fto/index.d.ts.map +1 -0
- package/dist/puzzles/fto/index.js +13 -0
- package/dist/puzzles/fto/moves.d.ts +12 -0
- package/dist/puzzles/fto/moves.d.ts.map +1 -0
- package/dist/puzzles/fto/moves.js +115 -0
- package/dist/puzzles/fto/random-state.d.ts +17 -0
- package/dist/puzzles/fto/random-state.d.ts.map +1 -0
- package/dist/puzzles/fto/random-state.js +40 -0
- package/dist/puzzles/fto/scrambler.d.ts +6 -0
- package/dist/puzzles/fto/scrambler.d.ts.map +1 -0
- package/dist/puzzles/fto/scrambler.js +49 -0
- package/dist/puzzles/fto/solver/engine.d.ts +18 -0
- package/dist/puzzles/fto/solver/engine.d.ts.map +1 -0
- package/dist/puzzles/fto/solver/engine.js +1168 -0
- package/dist/puzzles/fto/solver/index.d.ts +2 -0
- package/dist/puzzles/fto/solver/index.d.ts.map +1 -0
- package/dist/puzzles/fto/solver/index.js +1 -0
- package/dist/puzzles/fto/state.d.ts +16 -0
- package/dist/puzzles/fto/state.d.ts.map +1 -0
- package/dist/puzzles/fto/state.js +61 -0
- package/dist/puzzles/fto/types.d.ts +32 -0
- package/dist/puzzles/fto/types.d.ts.map +1 -0
- package/dist/puzzles/fto/types.js +46 -0
- package/dist/puzzles/fto/validation.d.ts +19 -0
- package/dist/puzzles/fto/validation.d.ts.map +1 -0
- package/dist/puzzles/fto/validation.js +143 -0
- package/dist/puzzles/index.d.ts +2 -0
- package/dist/puzzles/index.d.ts.map +1 -1
- package/dist/puzzles/index.js +6 -0
- package/dist/puzzles/skewb/index.d.ts +1 -1
- package/dist/puzzles/skewb/index.d.ts.map +1 -1
- package/dist/puzzles/skewb/index.js +1 -1
- package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
- package/dist/puzzles/skewb/random-state.js +4 -1
- package/dist/puzzles/sq1/facelets.d.ts +12 -0
- package/dist/puzzles/sq1/facelets.d.ts.map +1 -0
- package/dist/puzzles/sq1/facelets.js +26 -0
- package/dist/puzzles/sq1/index.d.ts +10 -0
- package/dist/puzzles/sq1/index.d.ts.map +1 -0
- package/dist/puzzles/sq1/index.js +11 -0
- package/dist/puzzles/sq1/moves.d.ts +55 -0
- package/dist/puzzles/sq1/moves.d.ts.map +1 -0
- package/dist/puzzles/sq1/moves.js +220 -0
- package/dist/puzzles/sq1/random-state.d.ts +6 -0
- package/dist/puzzles/sq1/random-state.d.ts.map +1 -0
- package/dist/puzzles/sq1/random-state.js +49 -0
- package/dist/puzzles/sq1/scrambler.d.ts +10 -0
- package/dist/puzzles/sq1/scrambler.d.ts.map +1 -0
- package/dist/puzzles/sq1/scrambler.js +90 -0
- package/dist/puzzles/sq1/solver/browser-loader.d.ts +5 -0
- package/dist/puzzles/sq1/solver/browser-loader.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/browser-loader.js +92 -0
- package/dist/puzzles/sq1/solver/full-cube.d.ts +53 -0
- package/dist/puzzles/sq1/solver/full-cube.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/full-cube.js +281 -0
- package/dist/puzzles/sq1/solver/generated/manifest.json +50 -0
- package/dist/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/square-prun.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
- package/dist/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
- package/dist/puzzles/sq1/solver/index.d.ts +5 -0
- package/dist/puzzles/sq1/solver/index.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/index.js +4 -0
- package/dist/puzzles/sq1/solver/node-loader.d.ts +4 -0
- package/dist/puzzles/sq1/solver/node-loader.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/node-loader.js +113 -0
- package/dist/puzzles/sq1/solver/search.d.ts +27 -0
- package/dist/puzzles/sq1/solver/search.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/search.js +225 -0
- package/dist/puzzles/sq1/solver/shape.d.ts +22 -0
- package/dist/puzzles/sq1/solver/shape.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/shape.js +185 -0
- package/dist/puzzles/sq1/solver/square.d.ts +10 -0
- package/dist/puzzles/sq1/solver/square.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/square.js +90 -0
- package/dist/puzzles/sq1/solver/table-metadata.d.ts +48 -0
- package/dist/puzzles/sq1/solver/table-metadata.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/table-metadata.js +47 -0
- package/dist/puzzles/sq1/solver/tables.d.ts +17 -0
- package/dist/puzzles/sq1/solver/tables.d.ts.map +1 -0
- package/dist/puzzles/sq1/solver/tables.js +66 -0
- package/dist/puzzles/sq1/state.d.ts +10 -0
- package/dist/puzzles/sq1/state.d.ts.map +1 -0
- package/dist/puzzles/sq1/state.js +74 -0
- package/dist/puzzles/sq1/types.d.ts +32 -0
- package/dist/puzzles/sq1/types.d.ts.map +1 -0
- package/dist/puzzles/sq1/types.js +1 -0
- package/dist/puzzles/sq1/validation.d.ts +7 -0
- package/dist/puzzles/sq1/validation.d.ts.map +1 -0
- package/dist/puzzles/sq1/validation.js +64 -0
- package/dist/random/prng.d.ts.map +1 -1
- package/dist/random/prng.js +9 -4
- package/dist-cjs/core/api.js +11 -1
- package/dist-cjs/puzzles/cube4/index.js +11 -4
- package/dist-cjs/puzzles/cube4/random-state.js +79 -0
- package/dist-cjs/puzzles/cube4/reduction/browser-loader.js +100 -0
- package/dist-cjs/puzzles/cube4/reduction/center1.js +258 -0
- package/dist-cjs/puzzles/cube4/reduction/center2.js +462 -0
- package/dist-cjs/puzzles/cube4/reduction/center3.js +284 -0
- package/dist-cjs/puzzles/cube4/reduction/edge3.js +522 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
- package/dist-cjs/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
- package/dist-cjs/puzzles/cube4/reduction/geometry.js +308 -0
- package/dist-cjs/puzzles/cube4/reduction/node-loader.js +104 -0
- package/dist-cjs/puzzles/cube4/reduction/pairing-coordinate.js +294 -0
- package/dist-cjs/puzzles/cube4/reduction/phase3-search.js +138 -0
- package/dist-cjs/puzzles/cube4/reduction/phase3.js +86 -0
- package/dist-cjs/puzzles/cube4/reduction/phase4.js +87 -0
- package/dist-cjs/puzzles/cube4/reduction/solve.js +314 -0
- package/dist-cjs/puzzles/cube4/scrambler.js +122 -79
- package/dist-cjs/puzzles/cube4/validation.js +97 -0
- package/dist-cjs/puzzles/fto/coordinates.js +240 -0
- package/dist-cjs/puzzles/fto/facelets.js +104 -0
- package/dist-cjs/puzzles/fto/index.js +68 -0
- package/dist-cjs/puzzles/fto/moves.js +126 -0
- package/dist-cjs/puzzles/fto/random-state.js +43 -0
- package/dist-cjs/puzzles/fto/scrambler.js +53 -0
- package/dist-cjs/puzzles/fto/solver/engine.js +1175 -0
- package/dist-cjs/puzzles/fto/solver/index.js +9 -0
- package/dist-cjs/puzzles/fto/state.js +69 -0
- package/dist-cjs/puzzles/fto/types.js +49 -0
- package/dist-cjs/puzzles/fto/validation.js +147 -0
- package/dist-cjs/puzzles/index.js +7 -1
- package/dist-cjs/puzzles/skewb/index.js +2 -1
- package/dist-cjs/puzzles/skewb/random-state.js +4 -1
- package/dist-cjs/puzzles/sq1/facelets.js +30 -0
- package/dist-cjs/puzzles/sq1/index.js +52 -0
- package/dist-cjs/puzzles/sq1/moves.js +234 -0
- package/dist-cjs/puzzles/sq1/random-state.js +52 -0
- package/dist-cjs/puzzles/sq1/scrambler.js +95 -0
- package/dist-cjs/puzzles/sq1/solver/browser-loader.js +97 -0
- package/dist-cjs/puzzles/sq1/solver/full-cube.js +289 -0
- package/dist-cjs/puzzles/sq1/solver/generated/manifest.json +50 -0
- package/dist-cjs/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/square-prun.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
- package/dist-cjs/puzzles/sq1/solver/index.js +18 -0
- package/dist-cjs/puzzles/sq1/solver/node-loader.js +120 -0
- package/dist-cjs/puzzles/sq1/solver/search.js +229 -0
- package/dist-cjs/puzzles/sq1/solver/shape.js +191 -0
- package/dist-cjs/puzzles/sq1/solver/square.js +93 -0
- package/dist-cjs/puzzles/sq1/solver/table-metadata.js +50 -0
- package/dist-cjs/puzzles/sq1/solver/tables.js +106 -0
- package/dist-cjs/puzzles/sq1/state.js +81 -0
- package/dist-cjs/puzzles/sq1/types.js +2 -0
- package/dist-cjs/puzzles/sq1/validation.js +68 -0
- package/dist-cjs/random/prng.js +9 -4
- package/package.json +43 -14
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRandomSquare1State = generateRandomSquare1State;
|
|
4
|
+
const index_js_1 = require("../../random/index.js");
|
|
5
|
+
const index_js_2 = require("./solver/index.js");
|
|
6
|
+
const state_js_1 = require("./state.js");
|
|
7
|
+
const moves_js_1 = require("./moves.js");
|
|
8
|
+
/**
|
|
9
|
+
* Samples an exact uniform random legal state for Square-1.
|
|
10
|
+
*/
|
|
11
|
+
function generateRandomSquare1State(options = {}) {
|
|
12
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
13
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
14
|
+
const tables = (0, index_js_2.getSquare1SolverTablesSync)();
|
|
15
|
+
const searcher = new index_js_2.Square1Searcher(tables);
|
|
16
|
+
for (let attempt = 0; attempt < 100; attempt++) {
|
|
17
|
+
const shapeIdx = tables.shapeIdx[random.nextInt(3678)];
|
|
18
|
+
const cube = new index_js_2.FullCube();
|
|
19
|
+
let corner = (0x01234567 << 1) | 0x11111111;
|
|
20
|
+
let edge = 0x01234567 << 1;
|
|
21
|
+
let n_corner = 8;
|
|
22
|
+
let n_edge = 8;
|
|
23
|
+
for (let i = 0; i < 24; i++) {
|
|
24
|
+
if (((shapeIdx >> i) & 1) === 0) {
|
|
25
|
+
// edge
|
|
26
|
+
const rnd = random.nextInt(n_edge) << 2;
|
|
27
|
+
cube.setPiece(23 - i, (edge >> rnd) & 0xf);
|
|
28
|
+
const m = (1 << rnd) - 1;
|
|
29
|
+
edge = (edge & m) + ((edge >> 4) & ~m);
|
|
30
|
+
n_edge--;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// corner
|
|
34
|
+
const rnd = random.nextInt(n_corner) << 2;
|
|
35
|
+
cube.setPiece(23 - i, (corner >> rnd) & 0xf);
|
|
36
|
+
cube.setPiece(22 - i, (corner >> rnd) & 0xf);
|
|
37
|
+
const m = (1 << rnd) - 1;
|
|
38
|
+
corner = (corner & m) + ((corner >> 4) & ~m);
|
|
39
|
+
n_corner--;
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
cube.ml = random.nextInt(2);
|
|
44
|
+
const sol = searcher.solution(cube, index_js_2.INVERSE_SOLUTION);
|
|
45
|
+
const state = (0, moves_js_1.applySquare1Algorithm)((0, state_js_1.createSolvedSquare1State)(), sol.moves);
|
|
46
|
+
if (rejectTrivial && (0, state_js_1.isSolvedSquare1State)(state)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
throw new Error("Unable to generate a non-trivial random Square-1 state.");
|
|
52
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sq1ScrambleGenerator = void 0;
|
|
4
|
+
exports.generateSquare1Scramble = generateSquare1Scramble;
|
|
5
|
+
exports.generateSquare1ScrambleSync = generateSquare1ScrambleSync;
|
|
6
|
+
const index_js_1 = require("../../random/index.js");
|
|
7
|
+
const index_js_2 = require("./solver/index.js");
|
|
8
|
+
const state_js_1 = require("./state.js");
|
|
9
|
+
const moves_js_1 = require("./moves.js");
|
|
10
|
+
const facelets_js_1 = require("./facelets.js");
|
|
11
|
+
exports.sq1ScrambleGenerator = {
|
|
12
|
+
info: {
|
|
13
|
+
eventId: "sq1",
|
|
14
|
+
name: "Square-1",
|
|
15
|
+
puzzle: "square1",
|
|
16
|
+
quality: "random-state",
|
|
17
|
+
generator: "sq1-two-phase",
|
|
18
|
+
description: "Random-state Square-1 scramble generated by a two-phase reduction solver."
|
|
19
|
+
},
|
|
20
|
+
generate(options = {}) {
|
|
21
|
+
return generateSquare1Scramble(options);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
async function generateSquare1Scramble(options = {}) {
|
|
25
|
+
if (!(0, index_js_2.areSquare1TablesLoaded)()) {
|
|
26
|
+
await (0, index_js_2.ensureSquare1TablesLoaded)();
|
|
27
|
+
}
|
|
28
|
+
return generateSquare1ScrambleSync(options);
|
|
29
|
+
}
|
|
30
|
+
function generateSquare1ScrambleSync(options = {}) {
|
|
31
|
+
const tables = (0, index_js_2.getSquare1SolverTablesSync)();
|
|
32
|
+
const searcher = new index_js_2.Square1Searcher(tables);
|
|
33
|
+
const random = (0, index_js_1.createRandomSource)(options.seed);
|
|
34
|
+
const rejectTrivial = options.rejectTrivial ?? true;
|
|
35
|
+
let scramble = "";
|
|
36
|
+
let moves = [];
|
|
37
|
+
let state = (0, state_js_1.createSolvedSquare1State)();
|
|
38
|
+
for (let attempt = 0; attempt < 100; attempt++) {
|
|
39
|
+
const shapeIdx = tables.shapeIdx[random.nextInt(3678)];
|
|
40
|
+
const cube = new index_js_2.FullCube();
|
|
41
|
+
let corner = (0x01234567 << 1) | 0x11111111;
|
|
42
|
+
let edge = 0x01234567 << 1;
|
|
43
|
+
let n_corner = 8;
|
|
44
|
+
let n_edge = 8;
|
|
45
|
+
for (let idx = 0; idx < 24; idx++) {
|
|
46
|
+
if (((shapeIdx >> idx) & 1) === 0) {
|
|
47
|
+
const rnd = random.nextInt(n_edge) << 2;
|
|
48
|
+
cube.setPiece(23 - idx, (edge >> rnd) & 0xf);
|
|
49
|
+
const m = (1 << rnd) - 1;
|
|
50
|
+
edge = (edge & m) + ((edge >> 4) & ~m);
|
|
51
|
+
n_edge--;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const rnd = random.nextInt(n_corner) << 2;
|
|
55
|
+
cube.setPiece(23 - idx, (corner >> rnd) & 0xf);
|
|
56
|
+
cube.setPiece(22 - idx, (corner >> rnd) & 0xf);
|
|
57
|
+
const m = (1 << rnd) - 1;
|
|
58
|
+
corner = (corner & m) + ((corner >> 4) & ~m);
|
|
59
|
+
n_corner--;
|
|
60
|
+
idx++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
cube.ml = random.nextInt(2);
|
|
64
|
+
const sol = searcher.solution(cube, index_js_2.INVERSE_SOLUTION);
|
|
65
|
+
moves = sol.moves;
|
|
66
|
+
scramble = sol.scramble;
|
|
67
|
+
state = (0, moves_js_1.applySquare1Algorithm)((0, state_js_1.createSolvedSquare1State)(), moves);
|
|
68
|
+
if (rejectTrivial && (0, state_js_1.isSolvedSquare1State)(state)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const solutionMoves = (0, moves_js_1.invertSquare1Algorithm)(moves);
|
|
74
|
+
const facelets = (0, facelets_js_1.toSquare1Facelets)(state);
|
|
75
|
+
const faceletString = (0, facelets_js_1.formatSquare1Facelets)(facelets);
|
|
76
|
+
const result = {
|
|
77
|
+
eventId: "sq1",
|
|
78
|
+
scramble,
|
|
79
|
+
moves,
|
|
80
|
+
quality: "random-state",
|
|
81
|
+
generator: "sq1-two-phase",
|
|
82
|
+
metadata: {
|
|
83
|
+
totalSlashes: moves.filter((m) => m === "/").length,
|
|
84
|
+
solutionDepth: solutionMoves.filter((m) => m === "/").length,
|
|
85
|
+
solutionMoves,
|
|
86
|
+
state,
|
|
87
|
+
facelets,
|
|
88
|
+
faceletString
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
if (options.seed !== undefined) {
|
|
92
|
+
result.seed = options.seed;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCachedBrowserTables = getCachedBrowserTables;
|
|
4
|
+
exports.clearCachedBrowserTables = clearCachedBrowserTables;
|
|
5
|
+
exports.loadBrowserTables = loadBrowserTables;
|
|
6
|
+
const table_metadata_js_1 = require("./table-metadata.js");
|
|
7
|
+
const compressed_fetch_js_1 = require("../../shared/compressed-fetch.js");
|
|
8
|
+
const TABLES_DIR = "puzzles/sq1/solver/generated";
|
|
9
|
+
let cachedBrowserTables;
|
|
10
|
+
function getCachedBrowserTables() {
|
|
11
|
+
return cachedBrowserTables;
|
|
12
|
+
}
|
|
13
|
+
function clearCachedBrowserTables() {
|
|
14
|
+
cachedBrowserTables = undefined;
|
|
15
|
+
}
|
|
16
|
+
async function loadBrowserTables(baseUrl) {
|
|
17
|
+
if (cachedBrowserTables) {
|
|
18
|
+
return cachedBrowserTables;
|
|
19
|
+
}
|
|
20
|
+
const resolved = resolveBaseUrl(baseUrl);
|
|
21
|
+
const manifest = await fetchManifest(resolved);
|
|
22
|
+
const [shapeIdx, shapePrun, shapeTopMove, shapeBottomMove, shapeTwistMove, squareTwistMove, squareTopMove, squareBottomMove, squarePrun] = await Promise.all([
|
|
23
|
+
fetchInt32Table(resolved, manifest.files.shapeIdx, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.shapeIdx.entries),
|
|
24
|
+
fetchInt8Table(resolved, manifest.files.shapePrun, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.shapePrun.entries),
|
|
25
|
+
fetchInt32Table(resolved, manifest.files.shapeTopMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.shapeTopMove.entries),
|
|
26
|
+
fetchInt32Table(resolved, manifest.files.shapeBottomMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.shapeBottomMove.entries),
|
|
27
|
+
fetchInt32Table(resolved, manifest.files.shapeTwistMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.shapeTwistMove.entries),
|
|
28
|
+
fetchUint16Table(resolved, manifest.files.squareTwistMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.squareTwistMove.entries),
|
|
29
|
+
fetchUint16Table(resolved, manifest.files.squareTopMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.squareTopMove.entries),
|
|
30
|
+
fetchUint16Table(resolved, manifest.files.squareBottomMove, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.squareBottomMove.entries),
|
|
31
|
+
fetchInt8Table(resolved, manifest.files.squarePrun, table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA.squarePrun.entries),
|
|
32
|
+
]);
|
|
33
|
+
cachedBrowserTables = {
|
|
34
|
+
shapeIdx,
|
|
35
|
+
shapePrun,
|
|
36
|
+
shapeTopMove,
|
|
37
|
+
shapeBottomMove,
|
|
38
|
+
shapeTwistMove,
|
|
39
|
+
squareTwistMove,
|
|
40
|
+
squareTopMove,
|
|
41
|
+
squareBottomMove,
|
|
42
|
+
squarePrun
|
|
43
|
+
};
|
|
44
|
+
return cachedBrowserTables;
|
|
45
|
+
}
|
|
46
|
+
function resolveBaseUrl(provided) {
|
|
47
|
+
if (provided) {
|
|
48
|
+
return provided.replace(/\/$/, "");
|
|
49
|
+
}
|
|
50
|
+
if (typeof document !== "undefined") {
|
|
51
|
+
const script = document.currentScript;
|
|
52
|
+
if (script?.src) {
|
|
53
|
+
const base = new URL(".", script.src).href;
|
|
54
|
+
return base.replace(/\/$/, "");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return ".";
|
|
58
|
+
}
|
|
59
|
+
async function fetchManifest(baseUrl) {
|
|
60
|
+
const url = `${baseUrl}/${TABLES_DIR}/manifest.json`;
|
|
61
|
+
const response = await fetch(url);
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`Failed to load Square-1 solver table manifest from ${url}: ${response.status} ${response.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
return (await response.json());
|
|
66
|
+
}
|
|
67
|
+
async function fetchInt32Table(baseUrl, entry, expectedEntries) {
|
|
68
|
+
const buffer = await (0, compressed_fetch_js_1.fetchTableBuffer)(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
|
|
69
|
+
if (buffer.byteLength !== expectedEntries * 4) {
|
|
70
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
71
|
+
}
|
|
72
|
+
const values = new Int32Array(expectedEntries);
|
|
73
|
+
const view = new DataView(buffer);
|
|
74
|
+
for (let i = 0; i < values.length; i++) {
|
|
75
|
+
values[i] = view.getInt32(i * 4, true);
|
|
76
|
+
}
|
|
77
|
+
return values;
|
|
78
|
+
}
|
|
79
|
+
async function fetchUint16Table(baseUrl, entry, expectedEntries) {
|
|
80
|
+
const buffer = await (0, compressed_fetch_js_1.fetchTableBuffer)(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
|
|
81
|
+
if (buffer.byteLength !== expectedEntries * 2) {
|
|
82
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
83
|
+
}
|
|
84
|
+
const values = new Uint16Array(expectedEntries);
|
|
85
|
+
const view = new DataView(buffer);
|
|
86
|
+
for (let i = 0; i < values.length; i++) {
|
|
87
|
+
values[i] = view.getUint16(i * 2, true);
|
|
88
|
+
}
|
|
89
|
+
return values;
|
|
90
|
+
}
|
|
91
|
+
async function fetchInt8Table(baseUrl, entry, expectedEntries) {
|
|
92
|
+
const buffer = await (0, compressed_fetch_js_1.fetchTableBuffer)(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
|
|
93
|
+
if (buffer.byteLength !== expectedEntries) {
|
|
94
|
+
throw new Error(`Invalid byte size for ${entry.file}`);
|
|
95
|
+
}
|
|
96
|
+
return new Int8Array(buffer);
|
|
97
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FullCube = void 0;
|
|
4
|
+
exports.get8Perm = get8Perm;
|
|
5
|
+
exports.set8Perm = set8Perm;
|
|
6
|
+
exports.fullCubeToState = fullCubeToState;
|
|
7
|
+
exports.stateToFullCube = stateToFullCube;
|
|
8
|
+
const state_js_1 = require("../state.js");
|
|
9
|
+
/**
|
|
10
|
+
* Low-level bitwise representation of Square-1 state.
|
|
11
|
+
*
|
|
12
|
+
* Each layer is split into left and right 6-slot halves (24 bits per half, 4 bits per slot):
|
|
13
|
+
* - `ul`: top left (slots 0..5)
|
|
14
|
+
* - `ur`: top right (slots 6..11)
|
|
15
|
+
* - `dl`: bottom right / left (slots 0..5 of bottom)
|
|
16
|
+
* - `dr`: bottom left / right (slots 6..11 of bottom)
|
|
17
|
+
* - `ml`: middle layer state (0 = solved, 1 = flipped)
|
|
18
|
+
*
|
|
19
|
+
* Piece encoding in 4-bit values:
|
|
20
|
+
* - Corners: values with LSB 1 (1, 3, 5, 7, 9, 11, 13, 15) -> pieceId = (val >> 1) in [0..7]
|
|
21
|
+
* - Edges: values with LSB 0 (0, 2, 4, 6, 8, 10, 12, 14) -> pieceId = (val >> 1) + 8 in [8..15]
|
|
22
|
+
*/
|
|
23
|
+
class FullCube {
|
|
24
|
+
ul = 0x011233;
|
|
25
|
+
ur = 0x455677;
|
|
26
|
+
dl = 0x998bba;
|
|
27
|
+
dr = 0xddcffe;
|
|
28
|
+
ml = 0;
|
|
29
|
+
copy(c) {
|
|
30
|
+
this.ul = c.ul;
|
|
31
|
+
this.ur = c.ur;
|
|
32
|
+
this.dl = c.dl;
|
|
33
|
+
this.dr = c.dr;
|
|
34
|
+
this.ml = c.ml;
|
|
35
|
+
}
|
|
36
|
+
isSolved() {
|
|
37
|
+
return (this.ul === 0x011233 &&
|
|
38
|
+
this.ur === 0x455677 &&
|
|
39
|
+
this.dl === 0x998bba &&
|
|
40
|
+
this.dr === 0xddcffe &&
|
|
41
|
+
this.ml === 0);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Applies move token:
|
|
45
|
+
* - 0: slice /
|
|
46
|
+
* - >0: top layer turn
|
|
47
|
+
* - <0: bottom layer turn
|
|
48
|
+
*/
|
|
49
|
+
doMove(move) {
|
|
50
|
+
let m = move << 2;
|
|
51
|
+
if (m > 24) {
|
|
52
|
+
m = 48 - m;
|
|
53
|
+
const temp = this.ul;
|
|
54
|
+
this.ul = ((this.ul >> m) | (this.ur << (24 - m))) & 0xffffff;
|
|
55
|
+
this.ur = ((this.ur >> m) | (temp << (24 - m))) & 0xffffff;
|
|
56
|
+
}
|
|
57
|
+
else if (m > 0) {
|
|
58
|
+
const temp = this.ul;
|
|
59
|
+
this.ul = ((this.ul << m) | (this.ur >> (24 - m))) & 0xffffff;
|
|
60
|
+
this.ur = ((this.ur << m) | (temp >> (24 - m))) & 0xffffff;
|
|
61
|
+
}
|
|
62
|
+
else if (m === 0) {
|
|
63
|
+
const temp = this.ur;
|
|
64
|
+
this.ur = this.dl;
|
|
65
|
+
this.dl = temp;
|
|
66
|
+
this.ml = 1 - this.ml;
|
|
67
|
+
}
|
|
68
|
+
else if (m >= -24) {
|
|
69
|
+
m = -m;
|
|
70
|
+
const temp = this.dl;
|
|
71
|
+
this.dl = ((this.dl << m) | (this.dr >> (24 - m))) & 0xffffff;
|
|
72
|
+
this.dr = ((this.dr << m) | (temp >> (24 - m))) & 0xffffff;
|
|
73
|
+
}
|
|
74
|
+
else if (m < -24) {
|
|
75
|
+
m = 48 + m;
|
|
76
|
+
const temp = this.dl;
|
|
77
|
+
this.dl = ((this.dl >> m) | (this.dr << (24 - m))) & 0xffffff;
|
|
78
|
+
this.dr = ((this.dr >> m) | (temp << (24 - m))) & 0xffffff;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
pieceAt(idx) {
|
|
82
|
+
let ret;
|
|
83
|
+
if (idx < 6) {
|
|
84
|
+
ret = this.ul >> ((5 - idx) << 2);
|
|
85
|
+
}
|
|
86
|
+
else if (idx < 12) {
|
|
87
|
+
ret = this.ur >> ((11 - idx) << 2);
|
|
88
|
+
}
|
|
89
|
+
else if (idx < 18) {
|
|
90
|
+
ret = this.dl >> ((17 - idx) << 2);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
ret = this.dr >> ((23 - idx) << 2);
|
|
94
|
+
}
|
|
95
|
+
return ret & 0x0f;
|
|
96
|
+
}
|
|
97
|
+
setPiece(idx, value) {
|
|
98
|
+
const shift = idx < 6
|
|
99
|
+
? (5 - idx) << 2
|
|
100
|
+
: idx < 12
|
|
101
|
+
? (11 - idx) << 2
|
|
102
|
+
: idx < 18
|
|
103
|
+
? (17 - idx) << 2
|
|
104
|
+
: (23 - idx) << 2;
|
|
105
|
+
if (idx < 6) {
|
|
106
|
+
this.ul = (this.ul & ~(0xf << shift)) | (value << shift);
|
|
107
|
+
}
|
|
108
|
+
else if (idx < 12) {
|
|
109
|
+
this.ur = (this.ur & ~(0xf << shift)) | (value << shift);
|
|
110
|
+
}
|
|
111
|
+
else if (idx < 18) {
|
|
112
|
+
this.dl = (this.dl & ~(0xf << shift)) | (value << shift);
|
|
113
|
+
}
|
|
114
|
+
else if (idx < 24) {
|
|
115
|
+
this.dr = (this.dr & ~(0xf << shift)) | (value << shift);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
getParity() {
|
|
119
|
+
const arr = new Array(16);
|
|
120
|
+
let cnt = 0;
|
|
121
|
+
arr[0] = this.pieceAt(0);
|
|
122
|
+
for (let i = 1; i < 24; i++) {
|
|
123
|
+
const p = this.pieceAt(i);
|
|
124
|
+
if (p !== arr[cnt]) {
|
|
125
|
+
arr[++cnt] = p;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let p = 0;
|
|
129
|
+
for (let a = 0; a < 16; a++) {
|
|
130
|
+
for (let b = a + 1; b < 16; b++) {
|
|
131
|
+
if (arr[a] > arr[b]) {
|
|
132
|
+
p ^= 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return p;
|
|
137
|
+
}
|
|
138
|
+
getShapeIdx(shapeIdxTable) {
|
|
139
|
+
let urx = this.ur & 0x111111;
|
|
140
|
+
urx |= urx >> 3;
|
|
141
|
+
urx |= urx >> 6;
|
|
142
|
+
urx = (urx & 0xf) | ((urx >> 12) & 0x30);
|
|
143
|
+
let ulx = this.ul & 0x111111;
|
|
144
|
+
ulx |= ulx >> 3;
|
|
145
|
+
ulx |= ulx >> 6;
|
|
146
|
+
ulx = (ulx & 0xf) | ((ulx >> 12) & 0x30);
|
|
147
|
+
let drx = this.dr & 0x111111;
|
|
148
|
+
drx |= drx >> 3;
|
|
149
|
+
drx |= drx >> 6;
|
|
150
|
+
drx = (drx & 0xf) | ((drx >> 12) & 0x30);
|
|
151
|
+
let dlx = this.dl & 0x111111;
|
|
152
|
+
dlx |= dlx >> 3;
|
|
153
|
+
dlx |= dlx >> 6;
|
|
154
|
+
dlx = (dlx & 0xf) | ((dlx >> 12) & 0x30);
|
|
155
|
+
const key = ((this.getParity() << 24) | (ulx << 18) | (urx << 12) | (dlx << 6) | drx) >>> 0;
|
|
156
|
+
return getShape2Idx(shapeIdxTable, key);
|
|
157
|
+
}
|
|
158
|
+
getSquare() {
|
|
159
|
+
const prm = new Uint8Array(8);
|
|
160
|
+
for (let a = 0; a < 8; a++) {
|
|
161
|
+
prm[a] = this.pieceAt(a * 3 + 1) >> 1;
|
|
162
|
+
}
|
|
163
|
+
const cornperm = get8Perm(prm);
|
|
164
|
+
const topEdgeFirst = this.pieceAt(0) === this.pieceAt(1);
|
|
165
|
+
let a = topEdgeFirst ? 2 : 0;
|
|
166
|
+
let b = 0;
|
|
167
|
+
for (; b < 4; a += 3, b++) {
|
|
168
|
+
prm[b] = this.pieceAt(a) >> 1;
|
|
169
|
+
}
|
|
170
|
+
const botEdgeFirst = this.pieceAt(12) === this.pieceAt(13);
|
|
171
|
+
a = botEdgeFirst ? 14 : 12;
|
|
172
|
+
for (; b < 8; a += 3, b++) {
|
|
173
|
+
prm[b] = this.pieceAt(a) >> 1;
|
|
174
|
+
}
|
|
175
|
+
const edgeperm = get8Perm(prm);
|
|
176
|
+
return { edgeperm, cornperm, topEdgeFirst, botEdgeFirst, ml: this.ml };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.FullCube = FullCube;
|
|
180
|
+
function getShape2Idx(shapeIdxTable, shp) {
|
|
181
|
+
let low = 0;
|
|
182
|
+
let high = shapeIdxTable.length - 1;
|
|
183
|
+
const key = (shp & 0xffffff) >>> 0;
|
|
184
|
+
while (low <= high) {
|
|
185
|
+
const mid = (low + high) >>> 1;
|
|
186
|
+
const midVal = (shapeIdxTable[mid]) >>> 0;
|
|
187
|
+
if (midVal < key)
|
|
188
|
+
low = mid + 1;
|
|
189
|
+
else if (midVal > key)
|
|
190
|
+
high = mid - 1;
|
|
191
|
+
else
|
|
192
|
+
return (mid << 1) | (shp >>> 24);
|
|
193
|
+
}
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
const fact = [1, 1, 2, 6, 24, 120, 720, 5040];
|
|
197
|
+
function get8Perm(arr) {
|
|
198
|
+
let idx = 0;
|
|
199
|
+
let val = 0x76543210;
|
|
200
|
+
for (let i = 0; i < 7; i++) {
|
|
201
|
+
const v = arr[i] << 2;
|
|
202
|
+
idx = (8 - i) * idx + ((val >> v) & 7);
|
|
203
|
+
val -= 0x11111110 << v;
|
|
204
|
+
}
|
|
205
|
+
return idx;
|
|
206
|
+
}
|
|
207
|
+
function set8Perm(arr, idx) {
|
|
208
|
+
let val = 0x76543210;
|
|
209
|
+
for (let i = 0; i < 7; i++) {
|
|
210
|
+
const p = fact[7 - i];
|
|
211
|
+
const v = Math.floor(idx / p);
|
|
212
|
+
idx -= v * p;
|
|
213
|
+
const shift = v << 2;
|
|
214
|
+
arr[i] = (val >> shift) & 7;
|
|
215
|
+
const m = (1 << shift) - 1;
|
|
216
|
+
val = (val & m) + ((val >> 4) & ~m);
|
|
217
|
+
}
|
|
218
|
+
arr[7] = val & 7;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Converts a FullCube instance to a high-level Square1State.
|
|
222
|
+
*/
|
|
223
|
+
function fullCubeToState(cube) {
|
|
224
|
+
const solved = (0, state_js_1.createSolvedSquare1State)();
|
|
225
|
+
const allSlots = [...solved.top, ...solved.bottom];
|
|
226
|
+
const getSlotDef = (pieceId, isCorner, partIndex) => {
|
|
227
|
+
const def = allSlots.find((s) => s.pieceId === pieceId && s.partIndex === partIndex);
|
|
228
|
+
return def || { faceColor: (pieceId < 8 ? "U" : "D"), sideColor: "F" };
|
|
229
|
+
};
|
|
230
|
+
const top = Array.from({ length: 12 }, (_, i) => {
|
|
231
|
+
const raw = cube.pieceAt(i);
|
|
232
|
+
const isCorner = (raw & 1) === 1;
|
|
233
|
+
const pieceId = isCorner ? (raw >> 1) : ((raw >> 1) + 8);
|
|
234
|
+
let partIndex = 0;
|
|
235
|
+
if (isCorner) {
|
|
236
|
+
const prevRaw = cube.pieceAt((i - 1 + 12) % 12);
|
|
237
|
+
if (prevRaw === raw)
|
|
238
|
+
partIndex = 1;
|
|
239
|
+
else
|
|
240
|
+
partIndex = 0;
|
|
241
|
+
}
|
|
242
|
+
const def = getSlotDef(pieceId, isCorner, partIndex);
|
|
243
|
+
return {
|
|
244
|
+
pieceId,
|
|
245
|
+
isCorner,
|
|
246
|
+
partIndex,
|
|
247
|
+
faceColor: "U",
|
|
248
|
+
sideColor: def.sideColor
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
const bottom = Array.from({ length: 12 }, (_, i) => {
|
|
252
|
+
const raw = cube.pieceAt(12 + i);
|
|
253
|
+
const isCorner = (raw & 1) === 1;
|
|
254
|
+
const pieceId = isCorner ? (raw >> 1) : ((raw >> 1) + 8);
|
|
255
|
+
let partIndex = 0;
|
|
256
|
+
if (isCorner) {
|
|
257
|
+
const prevRaw = cube.pieceAt(12 + ((i - 1 + 12) % 12));
|
|
258
|
+
if (prevRaw === raw)
|
|
259
|
+
partIndex = 1;
|
|
260
|
+
else
|
|
261
|
+
partIndex = 0;
|
|
262
|
+
}
|
|
263
|
+
const def = getSlotDef(pieceId, isCorner, partIndex);
|
|
264
|
+
return {
|
|
265
|
+
pieceId,
|
|
266
|
+
isCorner,
|
|
267
|
+
partIndex,
|
|
268
|
+
faceColor: "D",
|
|
269
|
+
sideColor: def.sideColor
|
|
270
|
+
};
|
|
271
|
+
});
|
|
272
|
+
return { top, bottom, middle: cube.ml };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Converts a high-level Square1State to a FullCube.
|
|
276
|
+
*/
|
|
277
|
+
function stateToFullCube(state) {
|
|
278
|
+
const cube = new FullCube();
|
|
279
|
+
cube.ml = state.middle;
|
|
280
|
+
for (let i = 0; i < 12; i++) {
|
|
281
|
+
const s = state.top[i];
|
|
282
|
+
const raw = s.isCorner ? ((s.pieceId << 1) | 1) : ((s.pieceId - 8) << 1);
|
|
283
|
+
cube.setPiece(i, raw);
|
|
284
|
+
const sb = state.bottom[i];
|
|
285
|
+
const rawB = sb.isCorner ? ((sb.pieceId << 1) | 1) : ((sb.pieceId - 8) << 1);
|
|
286
|
+
cube.setPiece(12 + i, rawB);
|
|
287
|
+
}
|
|
288
|
+
return cube;
|
|
289
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"files": {
|
|
4
|
+
"shapeIdx": {
|
|
5
|
+
"file": "shape-idx.bin",
|
|
6
|
+
"entries": 3678,
|
|
7
|
+
"checksum": 3187990008
|
|
8
|
+
},
|
|
9
|
+
"shapePrun": {
|
|
10
|
+
"file": "shape-prun.bin",
|
|
11
|
+
"entries": 7356,
|
|
12
|
+
"checksum": 2116325776
|
|
13
|
+
},
|
|
14
|
+
"shapeTopMove": {
|
|
15
|
+
"file": "shape-top-move.bin",
|
|
16
|
+
"entries": 7356,
|
|
17
|
+
"checksum": 4112891337
|
|
18
|
+
},
|
|
19
|
+
"shapeBottomMove": {
|
|
20
|
+
"file": "shape-bottom-move.bin",
|
|
21
|
+
"entries": 7356,
|
|
22
|
+
"checksum": 161984121
|
|
23
|
+
},
|
|
24
|
+
"shapeTwistMove": {
|
|
25
|
+
"file": "shape-twist-move.bin",
|
|
26
|
+
"entries": 7356,
|
|
27
|
+
"checksum": 694153781
|
|
28
|
+
},
|
|
29
|
+
"squareTwistMove": {
|
|
30
|
+
"file": "square-twist-move.bin",
|
|
31
|
+
"entries": 40320,
|
|
32
|
+
"checksum": 4150758597
|
|
33
|
+
},
|
|
34
|
+
"squareTopMove": {
|
|
35
|
+
"file": "square-top-move.bin",
|
|
36
|
+
"entries": 40320,
|
|
37
|
+
"checksum": 1003750981
|
|
38
|
+
},
|
|
39
|
+
"squareBottomMove": {
|
|
40
|
+
"file": "square-bottom-move.bin",
|
|
41
|
+
"entries": 40320,
|
|
42
|
+
"checksum": 2028613829
|
|
43
|
+
},
|
|
44
|
+
"squarePrun": {
|
|
45
|
+
"file": "square-prun.bin",
|
|
46
|
+
"entries": 80640,
|
|
47
|
+
"checksum": 1475475221
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SQ1_SOLVER_TABLE_METADATA = exports.INVERSE_SOLUTION = exports.Square1Searcher = exports.setCachedSquare1Tables = exports.generateSquare1SolverTables = exports.getSquare1SolverTablesSync = exports.ensureSquare1TablesLoaded = exports.areSquare1TablesLoaded = exports.stateToFullCube = exports.fullCubeToState = exports.FullCube = void 0;
|
|
4
|
+
var full_cube_js_1 = require("./full-cube.js");
|
|
5
|
+
Object.defineProperty(exports, "FullCube", { enumerable: true, get: function () { return full_cube_js_1.FullCube; } });
|
|
6
|
+
Object.defineProperty(exports, "fullCubeToState", { enumerable: true, get: function () { return full_cube_js_1.fullCubeToState; } });
|
|
7
|
+
Object.defineProperty(exports, "stateToFullCube", { enumerable: true, get: function () { return full_cube_js_1.stateToFullCube; } });
|
|
8
|
+
var tables_js_1 = require("./tables.js");
|
|
9
|
+
Object.defineProperty(exports, "areSquare1TablesLoaded", { enumerable: true, get: function () { return tables_js_1.areSquare1TablesLoaded; } });
|
|
10
|
+
Object.defineProperty(exports, "ensureSquare1TablesLoaded", { enumerable: true, get: function () { return tables_js_1.ensureSquare1TablesLoaded; } });
|
|
11
|
+
Object.defineProperty(exports, "getSquare1SolverTablesSync", { enumerable: true, get: function () { return tables_js_1.getSquare1SolverTablesSync; } });
|
|
12
|
+
Object.defineProperty(exports, "generateSquare1SolverTables", { enumerable: true, get: function () { return tables_js_1.generateSquare1SolverTables; } });
|
|
13
|
+
Object.defineProperty(exports, "setCachedSquare1Tables", { enumerable: true, get: function () { return tables_js_1.setCachedSquare1Tables; } });
|
|
14
|
+
var search_js_1 = require("./search.js");
|
|
15
|
+
Object.defineProperty(exports, "Square1Searcher", { enumerable: true, get: function () { return search_js_1.Square1Searcher; } });
|
|
16
|
+
Object.defineProperty(exports, "INVERSE_SOLUTION", { enumerable: true, get: function () { return search_js_1.INVERSE_SOLUTION; } });
|
|
17
|
+
var table_metadata_js_1 = require("./table-metadata.js");
|
|
18
|
+
Object.defineProperty(exports, "SQ1_SOLVER_TABLE_METADATA", { enumerable: true, get: function () { return table_metadata_js_1.SQ1_SOLVER_TABLE_METADATA; } });
|