@cubingcenter/scrambler 0.4.0 → 0.5.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.
Files changed (174) hide show
  1. package/README.md +67 -3
  2. package/dist/core/api.d.ts.map +1 -1
  3. package/dist/core/api.js +18 -6
  4. package/dist/core/index.d.ts +1 -1
  5. package/dist/core/index.d.ts.map +1 -1
  6. package/dist/core/types.d.ts +7 -0
  7. package/dist/core/types.d.ts.map +1 -1
  8. package/dist/puzzles/clock/index.d.ts +1 -0
  9. package/dist/puzzles/clock/index.d.ts.map +1 -1
  10. package/dist/puzzles/clock/index.js +4 -0
  11. package/dist/puzzles/cube2/index.d.ts +1 -0
  12. package/dist/puzzles/cube2/index.d.ts.map +1 -1
  13. package/dist/puzzles/cube2/index.js +4 -0
  14. package/dist/puzzles/cube2/scrambler.d.ts.map +1 -1
  15. package/dist/puzzles/cube2/scrambler.js +4 -6
  16. package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -1
  17. package/dist/puzzles/cube2/solver/browser-loader.js +4 -12
  18. package/dist/puzzles/cube2/solver/index.d.ts +1 -1
  19. package/dist/puzzles/cube2/solver/index.d.ts.map +1 -1
  20. package/dist/puzzles/cube2/solver/index.js +1 -1
  21. package/dist/puzzles/cube2/solver/search.d.ts +2 -0
  22. package/dist/puzzles/cube2/solver/search.d.ts.map +1 -1
  23. package/dist/puzzles/cube2/solver/search.js +26 -0
  24. package/dist/puzzles/cube2/validation.d.ts.map +1 -1
  25. package/dist/puzzles/cube2/validation.js +15 -3
  26. package/dist/puzzles/cube3/index.d.ts +1 -0
  27. package/dist/puzzles/cube3/index.d.ts.map +1 -1
  28. package/dist/puzzles/cube3/index.js +4 -0
  29. package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -1
  30. package/dist/puzzles/cube3/solver/browser-loader.js +5 -29
  31. package/dist/puzzles/cube4/index.d.ts +1 -0
  32. package/dist/puzzles/cube4/index.d.ts.map +1 -1
  33. package/dist/puzzles/cube4/index.js +4 -0
  34. package/dist/puzzles/cube5x5/index.d.ts +1 -0
  35. package/dist/puzzles/cube5x5/index.d.ts.map +1 -1
  36. package/dist/puzzles/cube5x5/index.js +4 -0
  37. package/dist/puzzles/cube6x6/index.d.ts +1 -0
  38. package/dist/puzzles/cube6x6/index.d.ts.map +1 -1
  39. package/dist/puzzles/cube6x6/index.js +4 -0
  40. package/dist/puzzles/cube7x7/index.d.ts +1 -0
  41. package/dist/puzzles/cube7x7/index.d.ts.map +1 -1
  42. package/dist/puzzles/cube7x7/index.js +4 -0
  43. package/dist/puzzles/megaminx/index.d.ts +1 -0
  44. package/dist/puzzles/megaminx/index.d.ts.map +1 -1
  45. package/dist/puzzles/megaminx/index.js +4 -0
  46. package/dist/puzzles/pyraminx/index.d.ts +3 -1
  47. package/dist/puzzles/pyraminx/index.d.ts.map +1 -1
  48. package/dist/puzzles/pyraminx/index.js +6 -1
  49. package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -1
  50. package/dist/puzzles/pyraminx/scrambler.js +24 -20
  51. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts +14 -0
  52. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts.map +1 -0
  53. package/dist/puzzles/pyraminx/solver/browser-loader.js +63 -0
  54. package/dist/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  55. package/dist/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  56. package/dist/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  57. package/dist/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  58. package/dist/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  59. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts +7 -0
  60. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts.map +1 -0
  61. package/dist/puzzles/pyraminx/solver/generated-assets.js +24 -0
  62. package/dist/puzzles/pyraminx/solver/index.d.ts +5 -0
  63. package/dist/puzzles/pyraminx/solver/index.d.ts.map +1 -0
  64. package/dist/puzzles/pyraminx/solver/index.js +4 -0
  65. package/dist/puzzles/pyraminx/solver/node-loader.d.ts +7 -0
  66. package/dist/puzzles/pyraminx/solver/node-loader.d.ts.map +1 -0
  67. package/dist/puzzles/pyraminx/solver/node-loader.js +73 -0
  68. package/dist/puzzles/pyraminx/solver/search.d.ts +10 -0
  69. package/dist/puzzles/pyraminx/solver/search.d.ts.map +1 -0
  70. package/dist/puzzles/pyraminx/solver/search.js +82 -0
  71. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts +20 -0
  72. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts.map +1 -0
  73. package/dist/puzzles/pyraminx/solver/table-metadata.js +19 -0
  74. package/dist/puzzles/pyraminx/solver/tables.d.ts +43 -0
  75. package/dist/puzzles/pyraminx/solver/tables.d.ts.map +1 -0
  76. package/dist/puzzles/pyraminx/solver/tables.js +300 -0
  77. package/dist/puzzles/shared/compressed-fetch.d.ts +12 -0
  78. package/dist/puzzles/shared/compressed-fetch.d.ts.map +1 -0
  79. package/dist/puzzles/shared/compressed-fetch.js +68 -0
  80. package/dist/puzzles/skewb/facelets.d.ts.map +1 -1
  81. package/dist/puzzles/skewb/facelets.js +46 -23
  82. package/dist/puzzles/skewb/index.d.ts +3 -1
  83. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  84. package/dist/puzzles/skewb/index.js +6 -1
  85. package/dist/puzzles/skewb/random-state.d.ts +1 -1
  86. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  87. package/dist/puzzles/skewb/random-state.js +25 -18
  88. package/dist/puzzles/skewb/scrambler.d.ts.map +1 -1
  89. package/dist/puzzles/skewb/scrambler.js +10 -13
  90. package/dist/puzzles/skewb/solver/browser-loader.d.ts +20 -0
  91. package/dist/puzzles/skewb/solver/browser-loader.d.ts.map +1 -0
  92. package/dist/puzzles/skewb/solver/browser-loader.js +86 -0
  93. package/dist/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  94. package/dist/puzzles/skewb/solver/generated/helpers.bin +0 -0
  95. package/dist/puzzles/skewb/solver/generated/manifest.json +31 -0
  96. package/dist/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  97. package/dist/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  98. package/dist/puzzles/skewb/solver/generated/policy.bin +0 -0
  99. package/dist/puzzles/skewb/solver/generated-assets.d.ts +10 -0
  100. package/dist/puzzles/skewb/solver/generated-assets.d.ts.map +1 -0
  101. package/dist/puzzles/skewb/solver/generated-assets.js +24 -0
  102. package/dist/puzzles/skewb/solver/index.d.ts +5 -0
  103. package/dist/puzzles/skewb/solver/index.d.ts.map +1 -0
  104. package/dist/puzzles/skewb/solver/index.js +4 -0
  105. package/dist/puzzles/skewb/solver/node-loader.d.ts +10 -0
  106. package/dist/puzzles/skewb/solver/node-loader.d.ts.map +1 -0
  107. package/dist/puzzles/skewb/solver/node-loader.js +91 -0
  108. package/dist/puzzles/skewb/solver/search.d.ts +11 -0
  109. package/dist/puzzles/skewb/solver/search.d.ts.map +1 -0
  110. package/dist/puzzles/skewb/solver/search.js +80 -0
  111. package/dist/puzzles/skewb/solver/table-metadata.d.ts +27 -0
  112. package/dist/puzzles/skewb/solver/table-metadata.d.ts.map +1 -0
  113. package/dist/puzzles/skewb/solver/table-metadata.js +26 -0
  114. package/dist/puzzles/skewb/solver/tables.d.ts +68 -0
  115. package/dist/puzzles/skewb/solver/tables.d.ts.map +1 -0
  116. package/dist/puzzles/skewb/solver/tables.js +508 -0
  117. package/dist/random/prng.js +10 -1
  118. package/dist-cjs/core/api.js +51 -6
  119. package/dist-cjs/puzzles/clock/index.js +13 -4
  120. package/dist-cjs/puzzles/cube2/index.js +13 -4
  121. package/dist-cjs/puzzles/cube2/scrambler.js +2 -4
  122. package/dist-cjs/puzzles/cube2/solver/browser-loader.js +4 -12
  123. package/dist-cjs/puzzles/cube2/solver/index.js +3 -1
  124. package/dist-cjs/puzzles/cube2/solver/search.js +28 -0
  125. package/dist-cjs/puzzles/cube2/validation.js +14 -2
  126. package/dist-cjs/puzzles/cube3/index.js +13 -4
  127. package/dist-cjs/puzzles/cube3/solver/browser-loader.js +5 -29
  128. package/dist-cjs/puzzles/cube4/index.js +13 -4
  129. package/dist-cjs/puzzles/cube5x5/index.js +13 -4
  130. package/dist-cjs/puzzles/cube6x6/index.js +13 -4
  131. package/dist-cjs/puzzles/cube7x7/index.js +13 -4
  132. package/dist-cjs/puzzles/megaminx/index.js +13 -4
  133. package/dist-cjs/puzzles/pyraminx/index.js +50 -6
  134. package/dist-cjs/puzzles/pyraminx/scrambler.js +23 -19
  135. package/dist-cjs/puzzles/pyraminx/solver/browser-loader.js +68 -0
  136. package/dist-cjs/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  137. package/dist-cjs/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  138. package/dist-cjs/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  139. package/dist-cjs/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  140. package/dist-cjs/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  141. package/dist-cjs/puzzles/pyraminx/solver/generated-assets.js +60 -0
  142. package/dist-cjs/puzzles/pyraminx/solver/index.js +23 -0
  143. package/dist-cjs/puzzles/pyraminx/solver/node-loader.js +79 -0
  144. package/dist-cjs/puzzles/pyraminx/solver/search.js +88 -0
  145. package/dist-cjs/puzzles/pyraminx/solver/table-metadata.js +22 -0
  146. package/dist-cjs/puzzles/pyraminx/solver/tables.js +327 -0
  147. package/dist-cjs/puzzles/shared/compressed-fetch.js +71 -0
  148. package/dist-cjs/puzzles/skewb/facelets.js +46 -23
  149. package/dist-cjs/puzzles/skewb/index.js +55 -8
  150. package/dist-cjs/puzzles/skewb/random-state.js +25 -18
  151. package/dist-cjs/puzzles/skewb/scrambler.js +9 -12
  152. package/dist-cjs/puzzles/skewb/solver/browser-loader.js +91 -0
  153. package/dist-cjs/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  154. package/dist-cjs/puzzles/skewb/solver/generated/helpers.bin +0 -0
  155. package/dist-cjs/puzzles/skewb/solver/generated/manifest.json +31 -0
  156. package/dist-cjs/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  157. package/dist-cjs/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  158. package/dist-cjs/puzzles/skewb/solver/generated/policy.bin +0 -0
  159. package/dist-cjs/puzzles/skewb/solver/generated-assets.js +60 -0
  160. package/dist-cjs/puzzles/skewb/solver/index.js +23 -0
  161. package/dist-cjs/puzzles/skewb/solver/node-loader.js +97 -0
  162. package/dist-cjs/puzzles/skewb/solver/search.js +87 -0
  163. package/dist-cjs/puzzles/skewb/solver/table-metadata.js +29 -0
  164. package/dist-cjs/puzzles/skewb/solver/tables.js +539 -0
  165. package/dist-cjs/random/prng.js +10 -1
  166. package/package.json +20 -6
  167. package/dist/puzzles/pyraminx/solver.d.ts +0 -10
  168. package/dist/puzzles/pyraminx/solver.d.ts.map +0 -1
  169. package/dist/puzzles/pyraminx/solver.js +0 -160
  170. package/dist/puzzles/skewb/solver.d.ts +0 -11
  171. package/dist/puzzles/skewb/solver.d.ts.map +0 -1
  172. package/dist/puzzles/skewb/solver.js +0 -149
  173. package/dist-cjs/puzzles/pyraminx/solver.js +0 -170
  174. package/dist-cjs/puzzles/skewb/solver.js +0 -160
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readGeneratedSkewbSolverTables = readGeneratedSkewbSolverTables;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_module_1 = require("node:module");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const table_metadata_js_1 = require("./table-metadata.js");
11
+ const GENERATED_DIRECTORY = "puzzles/skewb/solver/generated";
12
+ function readGeneratedSkewbSolverTables() {
13
+ const assetDirectory = resolveGeneratedAssetDirectory();
14
+ const manifest = JSON.parse((0, node_fs_1.readFileSync)(node_path_1.default.join(assetDirectory, "manifest.json"), "utf8"));
15
+ if (manifest.version !== 1) {
16
+ throw new Error(`Unsupported skewb solver table manifest version: ${manifest.version}`);
17
+ }
18
+ const permutationTable = readUint16Table(assetDirectory, manifest.files.permutationTable, table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.permutationTable.checksum);
19
+ const orientationTable = readUint16Table(assetDirectory, manifest.files.orientationTable, table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.orientationTable.checksum);
20
+ const centersTable = readUint16Table(assetDirectory, manifest.files.centersTable, table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.centersTable.checksum);
21
+ const helpersBuffer = (0, node_fs_1.readFileSync)(node_path_1.default.join(assetDirectory, manifest.files.helpers.file));
22
+ if (helpersBuffer.length !== manifest.files.helpers.entries) {
23
+ throw new Error(`Invalid byte size for ${manifest.files.helpers.file}`);
24
+ }
25
+ assertChecksum(manifest.files.helpers.file, checksum(new Uint8Array(helpersBuffer)), table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.checksum);
26
+ const evenCenterRank = new Uint16Array(table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes / 2);
27
+ for (let i = 0; i < evenCenterRank.length; i++) {
28
+ evenCenterRank[i] = helpersBuffer.readUInt16LE(i * 2);
29
+ }
30
+ const orientClass = new Uint8Array(helpersBuffer.subarray(table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes, table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes + table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.orientClassBytes));
31
+ const r7SetsBuffer = helpersBuffer.subarray(table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.evenCenterRankBytes + table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.orientClassBytes);
32
+ const r7Sets = new Uint16Array(table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.helpers.r7SetsEntries);
33
+ for (let i = 0; i < r7Sets.length; i++) {
34
+ r7Sets[i] = r7SetsBuffer.readUInt16LE(i * 2);
35
+ }
36
+ const policyBuffer = (0, node_fs_1.readFileSync)(node_path_1.default.join(assetDirectory, manifest.files.policyTable.file));
37
+ if (policyBuffer.length !== manifest.files.policyTable.entries) {
38
+ throw new Error(`Invalid byte size for ${manifest.files.policyTable.file}`);
39
+ }
40
+ const policyTable = new Uint8Array(policyBuffer);
41
+ assertChecksum(manifest.files.policyTable.file, checksum(policyTable), table_metadata_js_1.SKEWB_SOLVER_TABLE_METADATA.policyTable.checksum);
42
+ return { permutationTable, orientationTable, centersTable, policyTable, evenCenterRank, orientClass, r7Sets };
43
+ }
44
+ function readUint16Table(assetDirectory, entry, expectedChecksum) {
45
+ const buffer = (0, node_fs_1.readFileSync)(node_path_1.default.join(assetDirectory, entry.file));
46
+ if (buffer.length !== entry.entries * 2) {
47
+ throw new Error(`Invalid byte size for ${entry.file}`);
48
+ }
49
+ const values = new Uint16Array(entry.entries);
50
+ for (let index = 0; index < values.length; index += 1) {
51
+ values[index] = buffer.readUInt16LE(index * 2);
52
+ }
53
+ assertChecksum(entry.file, checksum(values), expectedChecksum);
54
+ return values;
55
+ }
56
+ function resolveGeneratedAssetDirectory() {
57
+ const envDirectory = process.env.CUBINGCENTER_SCRAMBLER_TABLES_DIR;
58
+ if (envDirectory && (0, node_fs_1.existsSync)(node_path_1.default.join(envDirectory, "manifest.json"))) {
59
+ return envDirectory;
60
+ }
61
+ for (const candidate of getAssetDirectoryCandidates()) {
62
+ if ((0, node_fs_1.existsSync)(node_path_1.default.join(candidate, "manifest.json"))) {
63
+ return candidate;
64
+ }
65
+ }
66
+ throw new Error("Unable to find generated skewb solver tables. Run pnpm skewb:tables.");
67
+ }
68
+ function getAssetDirectoryCandidates() {
69
+ const cwd = process.cwd();
70
+ const candidates = [
71
+ node_path_1.default.join(cwd, "src", GENERATED_DIRECTORY),
72
+ node_path_1.default.join(cwd, "dist", GENERATED_DIRECTORY),
73
+ node_path_1.default.join(cwd, "dist-cjs", GENERATED_DIRECTORY)
74
+ ];
75
+ try {
76
+ const requireFromCwd = (0, node_module_1.createRequire)(node_path_1.default.join(cwd, "package.json"));
77
+ const packageEntry = requireFromCwd.resolve("@cubingcenter/scrambler");
78
+ candidates.push(node_path_1.default.join(node_path_1.default.dirname(packageEntry), GENERATED_DIRECTORY));
79
+ }
80
+ catch {
81
+ // Source-tree usage is covered by the cwd candidates.
82
+ }
83
+ return candidates;
84
+ }
85
+ function assertChecksum(file, actual, expected) {
86
+ if (actual !== expected) {
87
+ throw new Error(`Checksum mismatch for ${file}: expected ${expected}, received ${actual}.`);
88
+ }
89
+ }
90
+ function checksum(values) {
91
+ let hash = 0x811c9dc5;
92
+ for (let index = 0; index < values.length; index += 1) {
93
+ hash ^= values[index];
94
+ hash = Math.imul(hash, 0x01000193);
95
+ }
96
+ return hash >>> 0;
97
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.solveSkewb = solveSkewb;
4
+ exports.solveSkewbWithInfo = solveSkewbWithInfo;
5
+ exports.solveSkewbSync = solveSkewbSync;
6
+ exports.verifySkewbScramble = verifySkewbScramble;
7
+ exports.verifySkewbSolution = verifySkewbSolution;
8
+ const tables_js_1 = require("./tables.js");
9
+ async function solveSkewb(state) {
10
+ await (0, tables_js_1.ensureTablesLoaded)();
11
+ return solveWithTables(state).moves;
12
+ }
13
+ async function solveSkewbWithInfo(state) {
14
+ await (0, tables_js_1.ensureTablesLoaded)();
15
+ return solveWithTables(state);
16
+ }
17
+ // Synchronous variant for scripts that have already ensured tables are loaded
18
+ function solveSkewbSync(state) {
19
+ if (!tables_js_1.POLICY_TABLE) {
20
+ throw new Error("Skewb solver tables not loaded. Call ensureTablesLoaded() first.");
21
+ }
22
+ return solveWithTables(state).moves;
23
+ }
24
+ function solveWithTables(state) {
25
+ const policy = tables_js_1.POLICY_TABLE;
26
+ const permTable = tables_js_1.PERMUTATION_TABLE;
27
+ const orientTable = tables_js_1.ORIENTATION_TABLE;
28
+ const centersTable = tables_js_1.CENTERS_TABLE;
29
+ if (state.corners.permutation[0] !== 0) {
30
+ throw new Error("The Skewb solver requires the UFR corner (index 0) to be fixed " +
31
+ "as the frame of reference. Please normalize the state before solving.");
32
+ }
33
+ let r7 = (0, tables_js_1.getPerm7Index)(state.corners.permutation);
34
+ let rO = (0, tables_js_1.getOrientationIndex)(state.corners.orientation);
35
+ let rC = (0, tables_js_1.getCenterIndex)(state.centers);
36
+ let rank = (0, tables_js_1.rankFromComponents)(r7, rO, rC);
37
+ if (rank === tables_js_1.SOLVED_RANK) {
38
+ return { moves: [], depth: 0 };
39
+ }
40
+ const moves = [];
41
+ while (rank !== tables_js_1.SOLVED_RANK) {
42
+ const m = (0, tables_js_1.getPolicyMoveFromPacked)(policy, rank);
43
+ moves.push(tables_js_1.SKEWB_MOVES[m]);
44
+ r7 = permTable[r7 * tables_js_1.MOVE_COUNT + m];
45
+ rO = orientTable[rO * tables_js_1.MOVE_COUNT + m];
46
+ rC = centersTable[rC * tables_js_1.MOVE_COUNT + m];
47
+ rank = (0, tables_js_1.rankFromComponents)(r7, rO, rC);
48
+ }
49
+ return { moves, depth: moves.length };
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Coordinate-walking verification (no full state clones)
53
+ // ---------------------------------------------------------------------------
54
+ const MOVE_INDEX = {};
55
+ for (let i = 0; i < tables_js_1.SKEWB_MOVES.length; i++) {
56
+ MOVE_INDEX[tables_js_1.SKEWB_MOVES[i]] = i;
57
+ }
58
+ function walkSkewbCoordinates(start, moves) {
59
+ const permTable = tables_js_1.PERMUTATION_TABLE;
60
+ const orientTable = tables_js_1.ORIENTATION_TABLE;
61
+ const centersTable = tables_js_1.CENTERS_TABLE;
62
+ if (!permTable || !orientTable || !centersTable) {
63
+ throw new Error("Skewb solver tables not loaded. Call ensureTablesLoaded() first.");
64
+ }
65
+ let { r7, rO, rC } = start;
66
+ for (const move of moves) {
67
+ const m = MOVE_INDEX[move];
68
+ r7 = permTable[r7 * tables_js_1.MOVE_COUNT + m];
69
+ rO = orientTable[rO * tables_js_1.MOVE_COUNT + m];
70
+ rC = centersTable[rC * tables_js_1.MOVE_COUNT + m];
71
+ }
72
+ return { r7, rO, rC };
73
+ }
74
+ function verifySkewbScramble(state, scrambleMoves) {
75
+ const final = walkSkewbCoordinates({ r7: 0, rO: 0, rC: 0 }, scrambleMoves);
76
+ return (final.r7 === (0, tables_js_1.getPerm7Index)(state.corners.permutation) &&
77
+ final.rO === (0, tables_js_1.getOrientationIndex)(state.corners.orientation) &&
78
+ final.rC === (0, tables_js_1.getCenterIndex)(state.centers));
79
+ }
80
+ function verifySkewbSolution(state, solutionMoves) {
81
+ const final = walkSkewbCoordinates({
82
+ r7: (0, tables_js_1.getPerm7Index)(state.corners.permutation),
83
+ rO: (0, tables_js_1.getOrientationIndex)(state.corners.orientation),
84
+ rC: (0, tables_js_1.getCenterIndex)(state.centers)
85
+ }, solutionMoves);
86
+ return final.r7 === 0 && final.rO === 0 && final.rC === 0;
87
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SKEWB_SOLVER_TABLE_METADATA = void 0;
4
+ exports.SKEWB_SOLVER_TABLE_METADATA = {
5
+ permutationTable: {
6
+ entries: 40320, // PERMUTATION_COUNT (5040) * MOVE_COUNT (8)
7
+ checksum: 3073532981
8
+ },
9
+ orientationTable: {
10
+ entries: 17496, // ORIENTATION_COUNT (2187) * MOVE_COUNT (8)
11
+ checksum: 2128852053
12
+ },
13
+ centersTable: {
14
+ entries: 5760, // CENTER_COUNT (720) * MOVE_COUNT (8)
15
+ checksum: 360885765
16
+ },
17
+ helpers: {
18
+ evenCenterRankBytes: 1440, // 720 * 2 (Uint16, sentinel 65535)
19
+ orientClassBytes: 2187,
20
+ r7SetsEntries: 12960, // EVEN_CENTER_COUNT (360) * ORIENT_CLASS_COUNT (9) * PER_SET_SIZE (4)
21
+ entries: 1440 + 2187 + 12960 * 2,
22
+ checksum: 4284555735
23
+ },
24
+ policyTable: {
25
+ entries: 1180980, // ceil(STATE_COUNT (3_149_280) * 3 / 8)
26
+ checksum: 1294485891,
27
+ maxDepth: 11
28
+ }
29
+ };