@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.
Files changed (244) hide show
  1. package/README.md +24 -9
  2. package/dist/cli/index.js +0 -0
  3. package/dist/core/api.d.ts.map +1 -1
  4. package/dist/core/api.js +11 -1
  5. package/dist/core/types.d.ts +1 -1
  6. package/dist/core/types.d.ts.map +1 -1
  7. package/dist/puzzles/cube4/index.d.ts +4 -2
  8. package/dist/puzzles/cube4/index.d.ts.map +1 -1
  9. package/dist/puzzles/cube4/index.js +3 -1
  10. package/dist/puzzles/cube4/random-state.d.ts +16 -0
  11. package/dist/puzzles/cube4/random-state.d.ts.map +1 -0
  12. package/dist/puzzles/cube4/random-state.js +76 -0
  13. package/dist/puzzles/cube4/reduction/browser-loader.d.ts +18 -0
  14. package/dist/puzzles/cube4/reduction/browser-loader.d.ts.map +1 -0
  15. package/dist/puzzles/cube4/reduction/browser-loader.js +95 -0
  16. package/dist/puzzles/cube4/reduction/center1.d.ts +65 -0
  17. package/dist/puzzles/cube4/reduction/center1.d.ts.map +1 -0
  18. package/dist/puzzles/cube4/reduction/center1.js +245 -0
  19. package/dist/puzzles/cube4/reduction/center2.d.ts +91 -0
  20. package/dist/puzzles/cube4/reduction/center2.d.ts.map +1 -0
  21. package/dist/puzzles/cube4/reduction/center2.js +449 -0
  22. package/dist/puzzles/cube4/reduction/center3.d.ts +47 -0
  23. package/dist/puzzles/cube4/reduction/center3.d.ts.map +1 -0
  24. package/dist/puzzles/cube4/reduction/center3.js +278 -0
  25. package/dist/puzzles/cube4/reduction/edge3.d.ts +100 -0
  26. package/dist/puzzles/cube4/reduction/edge3.d.ts.map +1 -0
  27. package/dist/puzzles/cube4/reduction/edge3.js +511 -0
  28. package/dist/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
  29. package/dist/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
  30. package/dist/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
  31. package/dist/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
  32. package/dist/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
  33. package/dist/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
  34. package/dist/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
  35. package/dist/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
  36. package/dist/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
  37. package/dist/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
  38. package/dist/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
  39. package/dist/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
  40. package/dist/puzzles/cube4/reduction/geometry.d.ts +33 -0
  41. package/dist/puzzles/cube4/reduction/geometry.d.ts.map +1 -0
  42. package/dist/puzzles/cube4/reduction/geometry.js +302 -0
  43. package/dist/puzzles/cube4/reduction/node-loader.d.ts +17 -0
  44. package/dist/puzzles/cube4/reduction/node-loader.d.ts.map +1 -0
  45. package/dist/puzzles/cube4/reduction/node-loader.js +98 -0
  46. package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts +130 -0
  47. package/dist/puzzles/cube4/reduction/pairing-coordinate.d.ts.map +1 -0
  48. package/dist/puzzles/cube4/reduction/pairing-coordinate.js +281 -0
  49. package/dist/puzzles/cube4/reduction/phase3-search.d.ts +42 -0
  50. package/dist/puzzles/cube4/reduction/phase3-search.d.ts.map +1 -0
  51. package/dist/puzzles/cube4/reduction/phase3-search.js +133 -0
  52. package/dist/puzzles/cube4/reduction/phase3.d.ts +34 -0
  53. package/dist/puzzles/cube4/reduction/phase3.d.ts.map +1 -0
  54. package/dist/puzzles/cube4/reduction/phase3.js +83 -0
  55. package/dist/puzzles/cube4/reduction/phase4.d.ts +35 -0
  56. package/dist/puzzles/cube4/reduction/phase4.d.ts.map +1 -0
  57. package/dist/puzzles/cube4/reduction/phase4.js +82 -0
  58. package/dist/puzzles/cube4/reduction/solve.d.ts +31 -0
  59. package/dist/puzzles/cube4/reduction/solve.d.ts.map +1 -0
  60. package/dist/puzzles/cube4/reduction/solve.js +311 -0
  61. package/dist/puzzles/cube4/scrambler.d.ts +9 -1
  62. package/dist/puzzles/cube4/scrambler.d.ts.map +1 -1
  63. package/dist/puzzles/cube4/scrambler.js +123 -81
  64. package/dist/puzzles/cube4/types.d.ts +6 -0
  65. package/dist/puzzles/cube4/types.d.ts.map +1 -1
  66. package/dist/puzzles/cube4/validation.d.ts +6 -0
  67. package/dist/puzzles/cube4/validation.d.ts.map +1 -0
  68. package/dist/puzzles/cube4/validation.js +91 -0
  69. package/dist/puzzles/fto/coordinates.d.ts +53 -0
  70. package/dist/puzzles/fto/coordinates.d.ts.map +1 -0
  71. package/dist/puzzles/fto/coordinates.js +228 -0
  72. package/dist/puzzles/fto/facelets.d.ts +6 -0
  73. package/dist/puzzles/fto/facelets.d.ts.map +1 -0
  74. package/dist/puzzles/fto/facelets.js +99 -0
  75. package/dist/puzzles/fto/index.d.ts +12 -0
  76. package/dist/puzzles/fto/index.d.ts.map +1 -0
  77. package/dist/puzzles/fto/index.js +13 -0
  78. package/dist/puzzles/fto/moves.d.ts +12 -0
  79. package/dist/puzzles/fto/moves.d.ts.map +1 -0
  80. package/dist/puzzles/fto/moves.js +115 -0
  81. package/dist/puzzles/fto/random-state.d.ts +17 -0
  82. package/dist/puzzles/fto/random-state.d.ts.map +1 -0
  83. package/dist/puzzles/fto/random-state.js +40 -0
  84. package/dist/puzzles/fto/scrambler.d.ts +6 -0
  85. package/dist/puzzles/fto/scrambler.d.ts.map +1 -0
  86. package/dist/puzzles/fto/scrambler.js +49 -0
  87. package/dist/puzzles/fto/solver/engine.d.ts +18 -0
  88. package/dist/puzzles/fto/solver/engine.d.ts.map +1 -0
  89. package/dist/puzzles/fto/solver/engine.js +1168 -0
  90. package/dist/puzzles/fto/solver/index.d.ts +2 -0
  91. package/dist/puzzles/fto/solver/index.d.ts.map +1 -0
  92. package/dist/puzzles/fto/solver/index.js +1 -0
  93. package/dist/puzzles/fto/state.d.ts +16 -0
  94. package/dist/puzzles/fto/state.d.ts.map +1 -0
  95. package/dist/puzzles/fto/state.js +61 -0
  96. package/dist/puzzles/fto/types.d.ts +32 -0
  97. package/dist/puzzles/fto/types.d.ts.map +1 -0
  98. package/dist/puzzles/fto/types.js +46 -0
  99. package/dist/puzzles/fto/validation.d.ts +19 -0
  100. package/dist/puzzles/fto/validation.d.ts.map +1 -0
  101. package/dist/puzzles/fto/validation.js +143 -0
  102. package/dist/puzzles/index.d.ts +2 -0
  103. package/dist/puzzles/index.d.ts.map +1 -1
  104. package/dist/puzzles/index.js +6 -0
  105. package/dist/puzzles/skewb/index.d.ts +1 -1
  106. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  107. package/dist/puzzles/skewb/index.js +1 -1
  108. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  109. package/dist/puzzles/skewb/random-state.js +4 -1
  110. package/dist/puzzles/sq1/facelets.d.ts +12 -0
  111. package/dist/puzzles/sq1/facelets.d.ts.map +1 -0
  112. package/dist/puzzles/sq1/facelets.js +26 -0
  113. package/dist/puzzles/sq1/index.d.ts +10 -0
  114. package/dist/puzzles/sq1/index.d.ts.map +1 -0
  115. package/dist/puzzles/sq1/index.js +11 -0
  116. package/dist/puzzles/sq1/moves.d.ts +55 -0
  117. package/dist/puzzles/sq1/moves.d.ts.map +1 -0
  118. package/dist/puzzles/sq1/moves.js +220 -0
  119. package/dist/puzzles/sq1/random-state.d.ts +6 -0
  120. package/dist/puzzles/sq1/random-state.d.ts.map +1 -0
  121. package/dist/puzzles/sq1/random-state.js +49 -0
  122. package/dist/puzzles/sq1/scrambler.d.ts +10 -0
  123. package/dist/puzzles/sq1/scrambler.d.ts.map +1 -0
  124. package/dist/puzzles/sq1/scrambler.js +90 -0
  125. package/dist/puzzles/sq1/solver/browser-loader.d.ts +5 -0
  126. package/dist/puzzles/sq1/solver/browser-loader.d.ts.map +1 -0
  127. package/dist/puzzles/sq1/solver/browser-loader.js +92 -0
  128. package/dist/puzzles/sq1/solver/full-cube.d.ts +53 -0
  129. package/dist/puzzles/sq1/solver/full-cube.d.ts.map +1 -0
  130. package/dist/puzzles/sq1/solver/full-cube.js +281 -0
  131. package/dist/puzzles/sq1/solver/generated/manifest.json +50 -0
  132. package/dist/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
  133. package/dist/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
  134. package/dist/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
  135. package/dist/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
  136. package/dist/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
  137. package/dist/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
  138. package/dist/puzzles/sq1/solver/generated/square-prun.bin +0 -0
  139. package/dist/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
  140. package/dist/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
  141. package/dist/puzzles/sq1/solver/index.d.ts +5 -0
  142. package/dist/puzzles/sq1/solver/index.d.ts.map +1 -0
  143. package/dist/puzzles/sq1/solver/index.js +4 -0
  144. package/dist/puzzles/sq1/solver/node-loader.d.ts +4 -0
  145. package/dist/puzzles/sq1/solver/node-loader.d.ts.map +1 -0
  146. package/dist/puzzles/sq1/solver/node-loader.js +113 -0
  147. package/dist/puzzles/sq1/solver/search.d.ts +27 -0
  148. package/dist/puzzles/sq1/solver/search.d.ts.map +1 -0
  149. package/dist/puzzles/sq1/solver/search.js +225 -0
  150. package/dist/puzzles/sq1/solver/shape.d.ts +22 -0
  151. package/dist/puzzles/sq1/solver/shape.d.ts.map +1 -0
  152. package/dist/puzzles/sq1/solver/shape.js +185 -0
  153. package/dist/puzzles/sq1/solver/square.d.ts +10 -0
  154. package/dist/puzzles/sq1/solver/square.d.ts.map +1 -0
  155. package/dist/puzzles/sq1/solver/square.js +90 -0
  156. package/dist/puzzles/sq1/solver/table-metadata.d.ts +48 -0
  157. package/dist/puzzles/sq1/solver/table-metadata.d.ts.map +1 -0
  158. package/dist/puzzles/sq1/solver/table-metadata.js +47 -0
  159. package/dist/puzzles/sq1/solver/tables.d.ts +17 -0
  160. package/dist/puzzles/sq1/solver/tables.d.ts.map +1 -0
  161. package/dist/puzzles/sq1/solver/tables.js +66 -0
  162. package/dist/puzzles/sq1/state.d.ts +10 -0
  163. package/dist/puzzles/sq1/state.d.ts.map +1 -0
  164. package/dist/puzzles/sq1/state.js +74 -0
  165. package/dist/puzzles/sq1/types.d.ts +32 -0
  166. package/dist/puzzles/sq1/types.d.ts.map +1 -0
  167. package/dist/puzzles/sq1/types.js +1 -0
  168. package/dist/puzzles/sq1/validation.d.ts +7 -0
  169. package/dist/puzzles/sq1/validation.d.ts.map +1 -0
  170. package/dist/puzzles/sq1/validation.js +64 -0
  171. package/dist/random/prng.d.ts.map +1 -1
  172. package/dist/random/prng.js +9 -4
  173. package/dist-cjs/core/api.js +11 -1
  174. package/dist-cjs/puzzles/cube4/index.js +11 -4
  175. package/dist-cjs/puzzles/cube4/random-state.js +79 -0
  176. package/dist-cjs/puzzles/cube4/reduction/browser-loader.js +100 -0
  177. package/dist-cjs/puzzles/cube4/reduction/center1.js +258 -0
  178. package/dist-cjs/puzzles/cube4/reduction/center2.js +462 -0
  179. package/dist-cjs/puzzles/cube4/reduction/center3.js +284 -0
  180. package/dist-cjs/puzzles/cube4/reduction/edge3.js +522 -0
  181. package/dist-cjs/puzzles/cube4/reduction/generated/center1-distance.bin +1 -0
  182. package/dist-cjs/puzzles/cube4/reduction/generated/center1-manifest.json +46 -0
  183. package/dist-cjs/puzzles/cube4/reduction/generated/center1-move-maps.bin +0 -0
  184. package/dist-cjs/puzzles/cube4/reduction/generated/center2-ct-move.bin +0 -0
  185. package/dist-cjs/puzzles/cube4/reduction/generated/center2-manifest.json +87 -0
  186. package/dist-cjs/puzzles/cube4/reduction/generated/center2-pruning.bin +1 -0
  187. package/dist-cjs/puzzles/cube4/reduction/generated/center2-rl-move.bin +0 -0
  188. package/dist-cjs/puzzles/cube4/reduction/generated/center3-manifest.json +40 -0
  189. package/dist-cjs/puzzles/cube4/reduction/generated/center3-move.bin +0 -0
  190. package/dist-cjs/puzzles/cube4/reduction/generated/center3-pruning.bin +0 -0
  191. package/dist-cjs/puzzles/cube4/reduction/generated/edge3-distances.bin +1 -0
  192. package/dist-cjs/puzzles/cube4/reduction/generated/edge3-manifest.json +12 -0
  193. package/dist-cjs/puzzles/cube4/reduction/geometry.js +308 -0
  194. package/dist-cjs/puzzles/cube4/reduction/node-loader.js +104 -0
  195. package/dist-cjs/puzzles/cube4/reduction/pairing-coordinate.js +294 -0
  196. package/dist-cjs/puzzles/cube4/reduction/phase3-search.js +138 -0
  197. package/dist-cjs/puzzles/cube4/reduction/phase3.js +86 -0
  198. package/dist-cjs/puzzles/cube4/reduction/phase4.js +87 -0
  199. package/dist-cjs/puzzles/cube4/reduction/solve.js +314 -0
  200. package/dist-cjs/puzzles/cube4/scrambler.js +122 -79
  201. package/dist-cjs/puzzles/cube4/validation.js +97 -0
  202. package/dist-cjs/puzzles/fto/coordinates.js +240 -0
  203. package/dist-cjs/puzzles/fto/facelets.js +104 -0
  204. package/dist-cjs/puzzles/fto/index.js +68 -0
  205. package/dist-cjs/puzzles/fto/moves.js +126 -0
  206. package/dist-cjs/puzzles/fto/random-state.js +43 -0
  207. package/dist-cjs/puzzles/fto/scrambler.js +53 -0
  208. package/dist-cjs/puzzles/fto/solver/engine.js +1175 -0
  209. package/dist-cjs/puzzles/fto/solver/index.js +9 -0
  210. package/dist-cjs/puzzles/fto/state.js +69 -0
  211. package/dist-cjs/puzzles/fto/types.js +49 -0
  212. package/dist-cjs/puzzles/fto/validation.js +147 -0
  213. package/dist-cjs/puzzles/index.js +7 -1
  214. package/dist-cjs/puzzles/skewb/index.js +2 -1
  215. package/dist-cjs/puzzles/skewb/random-state.js +4 -1
  216. package/dist-cjs/puzzles/sq1/facelets.js +30 -0
  217. package/dist-cjs/puzzles/sq1/index.js +52 -0
  218. package/dist-cjs/puzzles/sq1/moves.js +234 -0
  219. package/dist-cjs/puzzles/sq1/random-state.js +52 -0
  220. package/dist-cjs/puzzles/sq1/scrambler.js +95 -0
  221. package/dist-cjs/puzzles/sq1/solver/browser-loader.js +97 -0
  222. package/dist-cjs/puzzles/sq1/solver/full-cube.js +289 -0
  223. package/dist-cjs/puzzles/sq1/solver/generated/manifest.json +50 -0
  224. package/dist-cjs/puzzles/sq1/solver/generated/shape-bottom-move.bin +0 -0
  225. package/dist-cjs/puzzles/sq1/solver/generated/shape-idx.bin +0 -0
  226. package/dist-cjs/puzzles/sq1/solver/generated/shape-prun.bin +0 -0
  227. package/dist-cjs/puzzles/sq1/solver/generated/shape-top-move.bin +0 -0
  228. package/dist-cjs/puzzles/sq1/solver/generated/shape-twist-move.bin +0 -0
  229. package/dist-cjs/puzzles/sq1/solver/generated/square-bottom-move.bin +0 -0
  230. package/dist-cjs/puzzles/sq1/solver/generated/square-prun.bin +0 -0
  231. package/dist-cjs/puzzles/sq1/solver/generated/square-top-move.bin +0 -0
  232. package/dist-cjs/puzzles/sq1/solver/generated/square-twist-move.bin +0 -0
  233. package/dist-cjs/puzzles/sq1/solver/index.js +18 -0
  234. package/dist-cjs/puzzles/sq1/solver/node-loader.js +120 -0
  235. package/dist-cjs/puzzles/sq1/solver/search.js +229 -0
  236. package/dist-cjs/puzzles/sq1/solver/shape.js +191 -0
  237. package/dist-cjs/puzzles/sq1/solver/square.js +93 -0
  238. package/dist-cjs/puzzles/sq1/solver/table-metadata.js +50 -0
  239. package/dist-cjs/puzzles/sq1/solver/tables.js +106 -0
  240. package/dist-cjs/puzzles/sq1/state.js +81 -0
  241. package/dist-cjs/puzzles/sq1/types.js +2 -0
  242. package/dist-cjs/puzzles/sq1/validation.js +68 -0
  243. package/dist-cjs/random/prng.js +9 -4
  244. package/package.json +43 -14
@@ -0,0 +1,1175 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * Face-Turning Octahedron (FTO) 3-Phase Random-State Solver & Scrambler Engine.
5
+ * Adapted from cs0x7f / Shuang Chen reference implementation under MIT License.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.initFtoSolver = initFtoSolver;
9
+ exports.isFtoSolverInitialized = isFtoSolverInitialized;
10
+ exports.solveFtoFacelet = solveFtoFacelet;
11
+ exports.solveFto = solveFto;
12
+ exports.generateFtoRandomState = generateFtoRandomState;
13
+ const state_js_1 = require("../state.js");
14
+ const moves_js_1 = require("../moves.js");
15
+ const facelets_js_1 = require("../facelets.js");
16
+ var DEBUG = false;
17
+ var currentRng = Math.random;
18
+ var mathlib = (function () {
19
+ var fact = [1];
20
+ for (var i = 0; i < 32; ++i) {
21
+ fact[i + 1] = fact[i] * (i + 1);
22
+ }
23
+ function circle(arr) {
24
+ var length = arguments.length - 1, temp = arr[arguments[length]];
25
+ for (var i2 = length; i2 > 1; i2--) {
26
+ arr[arguments[i2]] = arr[arguments[i2 - 1]];
27
+ }
28
+ arr[arguments[1]] = temp;
29
+ return circle;
30
+ }
31
+ function getPruning(table, index) {
32
+ return table[index >> 3] >> ((index & 7) << 2) & 15;
33
+ }
34
+ function setNPerm(arr, idx, n, even) {
35
+ var prt = 0;
36
+ if (even < 0) {
37
+ idx <<= 1;
38
+ }
39
+ if (n >= 16) {
40
+ arr[n - 1] = 0;
41
+ for (var i2 = n - 2; i2 >= 0; i2--) {
42
+ arr[i2] = idx % (n - i2);
43
+ prt ^= arr[i2];
44
+ idx = ~~(idx / (n - i2));
45
+ for (var j = i2 + 1; j < n; j--) {
46
+ arr[j] >= arr[i2] && arr[j]++;
47
+ }
48
+ }
49
+ if (even < 0 && (prt & 1) != 0) {
50
+ var tmp = arr[n - 1];
51
+ arr[n - 1] = arr[n - 2];
52
+ arr[n - 2] = tmp;
53
+ }
54
+ return arr;
55
+ }
56
+ var vall = 1985229328;
57
+ var valh = 4275878552;
58
+ for (var i2 = 0; i2 < n - 1; i2++) {
59
+ var p = fact[n - 1 - i2];
60
+ var v = ~~(idx / p);
61
+ idx = idx % p;
62
+ prt ^= v;
63
+ v <<= 2;
64
+ if (v >= 32) {
65
+ v = v - 32;
66
+ arr[i2] = valh >> v & 15;
67
+ var m = (1 << v) - 1;
68
+ valh = (valh & m) + (valh >> 4 & ~m);
69
+ }
70
+ else {
71
+ arr[i2] = vall >> v & 15;
72
+ var m = (1 << v) - 1;
73
+ vall = (vall & m) + (vall >>> 4 & ~m) + (valh << 28);
74
+ valh = valh >> 4;
75
+ }
76
+ }
77
+ if (even < 0 && (prt & 1) != 0) {
78
+ arr[n - 1] = arr[n - 2];
79
+ arr[n - 2] = vall & 15;
80
+ }
81
+ else {
82
+ arr[n - 1] = vall & 15;
83
+ }
84
+ return arr;
85
+ }
86
+ function getNPerm(arr, n, even) {
87
+ n = n || arr.length;
88
+ var idx = 0;
89
+ if (n >= 16) {
90
+ for (var i2 = 0; i2 < n - 1; i2++) {
91
+ idx *= n - i2;
92
+ for (var j = i2 + 1; j < n; j++) {
93
+ arr[j] < arr[i2] && idx++;
94
+ }
95
+ }
96
+ return even < 0 ? idx >> 1 : idx;
97
+ }
98
+ var vall = 1985229328;
99
+ var valh = 4275878552;
100
+ for (var i2 = 0; i2 < n - 1; i2++) {
101
+ var v = arr[i2] << 2;
102
+ idx *= n - i2;
103
+ if (v >= 32) {
104
+ idx += valh >> v - 32 & 15;
105
+ valh -= 286331152 << v - 32;
106
+ }
107
+ else {
108
+ idx += vall >> v & 15;
109
+ valh -= 286331153;
110
+ vall -= 286331152 << v;
111
+ }
112
+ }
113
+ return even < 0 ? idx >> 1 : idx;
114
+ }
115
+ function getNParity(idx, n) {
116
+ var i2, p;
117
+ p = 0;
118
+ for (i2 = n - 2; i2 >= 0; --i2) {
119
+ p ^= idx % (n - i2);
120
+ idx = ~~(idx / (n - i2));
121
+ }
122
+ return p & 1;
123
+ }
124
+ function getNOri(arr, n, evenbase) {
125
+ var base = Math.abs(evenbase);
126
+ var idx = evenbase < 0 ? 0 : arr[0] % base;
127
+ for (var i2 = n - 1; i2 > 0; i2--) {
128
+ idx = idx * base + arr[i2] % base;
129
+ }
130
+ return idx;
131
+ }
132
+ function setNOri(arr, idx, n, evenbase) {
133
+ var base = Math.abs(evenbase);
134
+ var parity = base * n;
135
+ for (var i2 = 1; i2 < n; i2++) {
136
+ arr[i2] = idx % base;
137
+ parity -= arr[i2];
138
+ idx = ~~(idx / base);
139
+ }
140
+ arr[0] = (evenbase < 0 ? parity : idx) % base;
141
+ return arr;
142
+ }
143
+ function bitCount(x) {
144
+ x -= x >> 1 & 1431655765;
145
+ x = (x & 858993459) + (x >> 2 & 858993459);
146
+ return (x + (x >> 4) & 252645135) * 16843009 >> 24;
147
+ }
148
+ function getMPerm(arr, n, cnts, cums) {
149
+ var seen = ~0;
150
+ var idx = 0;
151
+ var x = 1;
152
+ for (var i2 = 0; i2 < n; i2++) {
153
+ var pi = arr[i2];
154
+ idx = idx * (n - i2) + bitCount(seen & (1 << cums[pi]) - 1) * x;
155
+ x = x * cnts[pi]--;
156
+ seen &= ~(1 << cums[pi] + cnts[pi]);
157
+ }
158
+ return Math.round(idx / x);
159
+ }
160
+ function setMPerm(arr, idx, n, cnts, x) {
161
+ for (var i2 = 0; i2 < n; i2++) {
162
+ for (var j = 0; j < cnts.length; j++) {
163
+ if (cnts[j] == 0) {
164
+ continue;
165
+ }
166
+ var x2 = ~~(x * cnts[j] / (n - i2));
167
+ if (idx < x2) {
168
+ cnts[j]--;
169
+ arr[i2] = j;
170
+ x = x2;
171
+ break;
172
+ }
173
+ idx -= x2;
174
+ }
175
+ }
176
+ return arr;
177
+ }
178
+ function Coord(type, length, evenbase) {
179
+ this.length = length;
180
+ this.evenbase = evenbase;
181
+ if (type == "p") {
182
+ this.get = function (arr) {
183
+ return getNPerm(arr, this.length, this.evenbase);
184
+ };
185
+ this.set = function (arr, idx) {
186
+ return setNPerm(arr, idx, this.length, this.evenbase);
187
+ };
188
+ }
189
+ else if (type == "o") {
190
+ this.get = function (arr) {
191
+ return getNOri(arr, this.length, this.evenbase);
192
+ };
193
+ this.set = function (arr, idx) {
194
+ return setNOri(arr, idx, this.length, this.evenbase);
195
+ };
196
+ }
197
+ else if (type == "c") {
198
+ var cnts = evenbase;
199
+ this.cnts = cnts.slice();
200
+ this.cntn = this.cnts.length;
201
+ this.cums = [0];
202
+ for (var i2 = 1; i2 <= this.cntn; i2++) {
203
+ this.cums[i2] = this.cums[i2 - 1] + cnts[i2 - 1];
204
+ }
205
+ this.n = this.cums[this.cntn];
206
+ var n = this.n;
207
+ var x = 1;
208
+ for (var i2 = 0; i2 < this.cntn; i2++) {
209
+ for (var j = 1; j <= cnts[i2]; j++, n--) {
210
+ x *= n / j;
211
+ }
212
+ }
213
+ this.x = Math.round(x);
214
+ this.get = function (arr) {
215
+ return getMPerm(arr, this.n, this.cnts.slice(), this.cums);
216
+ };
217
+ this.set = function (arr, idx) {
218
+ return setMPerm(arr, idx, this.n, this.cnts.slice(), this.x);
219
+ };
220
+ }
221
+ }
222
+ function fillFacelet(facelets, f, perm, ori, divcol) {
223
+ for (var i2 = 0; i2 < facelets.length; i2++) {
224
+ var cubie = facelets[i2];
225
+ var p = perm[i2] === void 0 ? i2 : perm[i2];
226
+ if (typeof cubie == "number") {
227
+ f[cubie] = ~~(facelets[p] / divcol);
228
+ continue;
229
+ }
230
+ var o = ori[i2] || 0;
231
+ for (var j = 0; j < cubie.length; j++) {
232
+ f[cubie[(j + o) % cubie.length]] = ~~(facelets[p][j] / divcol);
233
+ }
234
+ }
235
+ }
236
+ function detectFacelet(facelets, f, perm, ori, divcol) {
237
+ for (var i2 = 0; i2 < facelets.length; i2++) {
238
+ var n_ori = facelets[i2].length;
239
+ outer_loop: for (var j = 0; j < facelets.length + 1; j++) {
240
+ if (j == facelets.length) {
241
+ return -1;
242
+ }
243
+ else if (facelets[j].length != n_ori) {
244
+ continue;
245
+ }
246
+ for (var o = 0; o < n_ori; o++) {
247
+ var isMatch = true;
248
+ for (var t = 0; t < n_ori; t++) {
249
+ if (~~(facelets[j][t] / divcol) != f[facelets[i2][(t + o) % n_ori]]) {
250
+ isMatch = false;
251
+ break;
252
+ }
253
+ }
254
+ if (isMatch) {
255
+ perm[i2] = j;
256
+ ori[i2] = o;
257
+ break outer_loop;
258
+ }
259
+ }
260
+ }
261
+ }
262
+ return 0;
263
+ }
264
+ function createMoveHash(initState, validMoves, hashFunc, moveFunc) {
265
+ var states = [initState];
266
+ var hash2idx = {};
267
+ var depthEnds = [];
268
+ hash2idx[hashFunc(initState)] = 0;
269
+ depthEnds[0] = 1;
270
+ var moveTable = [];
271
+ for (var m = 0; m < validMoves.length; m++) {
272
+ moveTable[m] = [];
273
+ }
274
+ for (var i2 = 0; i2 < states.length; i2++) {
275
+ if (i2 == depthEnds[depthEnds.length - 1]) {
276
+ depthEnds.push(states.length);
277
+ }
278
+ var curState = states[i2];
279
+ for (var m = 0; m < validMoves.length; m++) {
280
+ var newState = moveFunc(curState, validMoves[m]);
281
+ if (!newState) {
282
+ moveTable[m][i2] = -1;
283
+ continue;
284
+ }
285
+ var newHash = hashFunc(newState);
286
+ if (!(newHash in hash2idx)) {
287
+ hash2idx[newHash] = states.length;
288
+ states.push(newState);
289
+ }
290
+ moveTable[m][i2] = hash2idx[newHash];
291
+ }
292
+ }
293
+ return [moveTable, hash2idx];
294
+ }
295
+ function createPrun(prun, init, size, maxd, doMove, N_MOVES, N_POWER, N_INV) {
296
+ var isMoveTable = Array.isArray(doMove);
297
+ N_MOVES = N_MOVES || 6;
298
+ N_POWER = N_POWER || 3;
299
+ N_INV = N_INV || 256;
300
+ maxd = maxd || 256;
301
+ for (var i2 = 0, len = size + 7 >>> 3; i2 < len; i2++) {
302
+ prun[i2] = -1;
303
+ }
304
+ if (!Array.isArray(init)) {
305
+ init = [init];
306
+ }
307
+ for (var i2 = 0; i2 < init.length; i2++) {
308
+ prun[init[i2] >> 3] ^= 15 << ((init[i2] & 7) << 2);
309
+ }
310
+ var val = 0;
311
+ for (var l = 0; l <= maxd; l++) {
312
+ var done = 0;
313
+ var inv = l >= N_INV;
314
+ var fill = l + 1 ^ 15;
315
+ var find = inv ? 15 : l;
316
+ var check = inv ? l : 15;
317
+ outer_loop: for (var p = 0; p < size; p++, val >>= 4) {
318
+ if ((p & 7) == 0) {
319
+ val = prun[p >> 3];
320
+ if (!inv && val == -1) {
321
+ p += 7;
322
+ continue;
323
+ }
324
+ }
325
+ if ((val & 15) != find) {
326
+ continue;
327
+ }
328
+ for (var m = 0; m < N_MOVES; m++) {
329
+ var q = p;
330
+ for (var c = 0; c < N_POWER; c++) {
331
+ q = isMoveTable ? doMove[m][q] : doMove(q, m);
332
+ if (q < 0) {
333
+ break;
334
+ }
335
+ if (getPruning(prun, q) != check) {
336
+ continue;
337
+ }
338
+ ++done;
339
+ if (inv) {
340
+ prun[p >> 3] ^= fill << ((p & 7) << 2);
341
+ continue outer_loop;
342
+ }
343
+ prun[q >> 3] ^= fill << ((q & 7) << 2);
344
+ }
345
+ }
346
+ }
347
+ if (done == 0) {
348
+ break;
349
+ }
350
+ }
351
+ }
352
+ function Searcher(isSolved, getPrun, doMove, N_AXIS, N_POWER, ckmv) {
353
+ this.isSolved = isSolved || function () {
354
+ return true;
355
+ };
356
+ this.getPrun = getPrun;
357
+ this.doMove = doMove;
358
+ this.N_AXIS = N_AXIS;
359
+ this.N_POWER = N_POWER;
360
+ this.ckmv = ckmv || Array.from({ length: N_AXIS }, function (_, i2) {
361
+ return 1 << i2;
362
+ });
363
+ }
364
+ var _ = Searcher.prototype;
365
+ _.solve = function (idx, minl, MAXL, callback) {
366
+ var sols = this.solveMulti([idx], minl, MAXL, callback);
367
+ return sols == null ? null : sols[0];
368
+ };
369
+ _.solveMulti = function (idxs, minl, MAXL, callback) {
370
+ this.callback = callback || function () {
371
+ return true;
372
+ };
373
+ var sol = [];
374
+ outer_loop: for (var l = minl; l <= MAXL; l++) {
375
+ for (var s = 0; s < idxs.length; s++) {
376
+ this.sidx = s;
377
+ if (this.idaSearch(idxs[s], l, -1, sol) == 0) {
378
+ break outer_loop;
379
+ }
380
+ }
381
+ this.sidx = -1;
382
+ }
383
+ return this.sidx == -1 ? null : [sol, this.sidx];
384
+ };
385
+ _.idaSearch = function (idx, maxl, lm, sol) {
386
+ var prun = this.getPrun(idx);
387
+ if (prun > maxl) {
388
+ return prun > maxl + 1 ? 2 : 1;
389
+ }
390
+ if (maxl == 0) {
391
+ return this.isSolved(idx) && this.callback(sol, this.sidx) ? 0 : 1;
392
+ }
393
+ if (prun == 0 && this.isSolved(idx) && maxl == 1) {
394
+ return 1;
395
+ }
396
+ for (var axis = 0; axis < this.N_AXIS; axis++) {
397
+ if (this.ckmv[lm] >> axis & 1) {
398
+ continue;
399
+ }
400
+ var idx1 = Array.isArray(idx) ? idx.slice() : idx;
401
+ for (var pow = 0; pow < this.N_POWER; pow++) {
402
+ idx1 = this.doMove(idx1, axis);
403
+ if (idx1 == null) {
404
+ break;
405
+ }
406
+ sol.push([axis, pow]);
407
+ var ret = this.idaSearch(idx1, maxl - 1, axis, sol);
408
+ if (ret == 0) {
409
+ return 0;
410
+ }
411
+ sol.pop();
412
+ if (ret == 2) {
413
+ break;
414
+ }
415
+ }
416
+ }
417
+ return 1;
418
+ };
419
+ function rn(n) {
420
+ return Math.floor(currentRng() * n);
421
+ }
422
+ function rndPerm(n, isEven) {
423
+ var p = 0;
424
+ var arr = [];
425
+ for (var i2 = 0; i2 < n; i2++) {
426
+ arr[i2] = i2;
427
+ }
428
+ for (var i2 = 0; i2 < n - 1; i2++) {
429
+ var k = rn(n - i2);
430
+ circle(arr, i2, i2 + k);
431
+ p ^= k != 0;
432
+ }
433
+ if (isEven && p) {
434
+ circle(arr, 0, 1);
435
+ }
436
+ return arr;
437
+ }
438
+ function permOriMult(p1, p2, prod, o1, o2, ori, oriMod) {
439
+ for (var i2 = 0; i2 < p2.length; i2++) {
440
+ if (oriMod) {
441
+ ori[i2] = (o1[p2[i2]] + o2[i2]) % oriMod;
442
+ }
443
+ prod[i2] = p1[p2[i2]];
444
+ }
445
+ }
446
+ return {
447
+ bitCount,
448
+ getPruning,
449
+ setNOri,
450
+ getNOri,
451
+ getNPerm,
452
+ getNParity,
453
+ Coord,
454
+ createMoveHash,
455
+ createPrun,
456
+ fillFacelet,
457
+ detectFacelet,
458
+ rn,
459
+ Searcher,
460
+ rndPerm,
461
+ permOriMult
462
+ };
463
+ })();
464
+ var ftosolver = (function () {
465
+ function InternalFtoCubie(cp, co, ep, uf, rl) {
466
+ this.cp = cp && cp.slice() || [0, 1, 2, 3, 4, 5];
467
+ this.co = co && co.slice() || [0, 0, 0, 0, 0, 0];
468
+ this.ep = ep && ep.slice() || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
469
+ this.uf = uf && uf.slice() || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
470
+ this.rl = rl && rl.slice() || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
471
+ }
472
+ var U = 0, F = 9, r = 18, l = 27, D = 36, B = 45, R = 54, L = 63;
473
+ var cornFacelets = [
474
+ [U + 0, R + 0, F + 0, L + 0],
475
+ [U + 4, B + 8, r + 4, R + 8],
476
+ [U + 8, L + 4, l + 8, B + 4],
477
+ [l + 0, D + 0, r + 0, B + 0],
478
+ [F + 4, D + 8, l + 4, L + 8],
479
+ [r + 8, D + 4, F + 8, R + 4]
480
+ ];
481
+ var edgeFacelets = [
482
+ [U + 1, R + 3],
483
+ [U + 3, L + 1],
484
+ [U + 6, B + 6],
485
+ [l + 1, D + 3],
486
+ [r + 3, D + 1],
487
+ [F + 6, D + 6],
488
+ [F + 3, R + 1],
489
+ [F + 1, L + 3],
490
+ [l + 6, L + 6],
491
+ [l + 3, B + 1],
492
+ [r + 1, B + 3],
493
+ [r + 6, R + 6]
494
+ ];
495
+ var ctufFacelets = [
496
+ U + 2,
497
+ U + 5,
498
+ U + 7,
499
+ F + 2,
500
+ F + 5,
501
+ F + 7,
502
+ r + 2,
503
+ r + 5,
504
+ r + 7,
505
+ l + 2,
506
+ l + 5,
507
+ l + 7
508
+ ];
509
+ var ctrlFacelets = [
510
+ D + 2,
511
+ D + 5,
512
+ D + 7,
513
+ B + 2,
514
+ B + 5,
515
+ B + 7,
516
+ L + 2,
517
+ L + 5,
518
+ L + 7,
519
+ R + 2,
520
+ R + 5,
521
+ R + 7
522
+ ];
523
+ InternalFtoCubie.prototype.isEqual = function (fc) {
524
+ for (var i2 = 0; i2 < 12; i2++) {
525
+ if (this.ep[i2] != fc.ep[i2] || this.uf[i2] != fc.uf[i2] || this.rl[i2] != fc.rl[i2] || i2 < 6 && (this.cp[i2] != fc.cp[i2] || this.co[i2] != fc.co[i2])) {
526
+ return false;
527
+ }
528
+ }
529
+ return true;
530
+ };
531
+ InternalFtoCubie.prototype.toFaceCube = function (todiv) {
532
+ var f = [];
533
+ todiv = todiv || 9;
534
+ var co = [];
535
+ for (var i2 = 0; i2 < 6; i2++) {
536
+ co[i2] = this.co[i2] * 2;
537
+ }
538
+ mathlib.fillFacelet(cornFacelets, f, this.cp, co, todiv);
539
+ mathlib.fillFacelet(edgeFacelets, f, this.ep, [], todiv);
540
+ mathlib.fillFacelet(ctufFacelets, f, this.uf, null, todiv);
541
+ mathlib.fillFacelet(ctrlFacelets, f, this.rl, null, todiv);
542
+ return f;
543
+ };
544
+ InternalFtoCubie.prototype.fromFacelet = function (facelet) {
545
+ var count = 0;
546
+ var f = [];
547
+ for (var i2 = 0; i2 < 72; ++i2) {
548
+ f[i2] = facelet[i2];
549
+ count += Math.pow(16, f[i2]);
550
+ }
551
+ if (count != 2576980377) {
552
+ return -1;
553
+ }
554
+ var co = [];
555
+ if (mathlib.detectFacelet(cornFacelets, f, this.cp, co, 9) == -1 || mathlib.detectFacelet(edgeFacelets, f, this.ep, [], 9) == -1) {
556
+ return -1;
557
+ }
558
+ var parity = 0;
559
+ for (var i2 = 0; i2 < 6; i2++) {
560
+ this.co[i2] = co[i2] >> 1;
561
+ parity ^= this.co[i2];
562
+ }
563
+ if (parity != 0 || mathlib.getNParity(mathlib.getNPerm(this.cp, 6), 6) != 0 || mathlib.getNParity(mathlib.getNPerm(this.ep, 12), 12) != 0) {
564
+ return -1;
565
+ }
566
+ var remainCnts = [3, 3, 3, 3];
567
+ for (var i2 = 0; i2 < 12; i2++) {
568
+ var col = f[ctufFacelets[i2]];
569
+ if (!(remainCnts[col] > 0)) {
570
+ return -1;
571
+ }
572
+ this.uf[i2] = col * 3 + 3 - remainCnts[col];
573
+ remainCnts[col]--;
574
+ }
575
+ remainCnts = [3, 3, 3, 3];
576
+ for (var i2 = 0; i2 < 12; i2++) {
577
+ var col = [0, 1, 3, 2][f[ctrlFacelets[i2]] - 4];
578
+ if (!(remainCnts[col] > 0)) {
579
+ return -1;
580
+ }
581
+ this.rl[i2] = col * 3 + 3 - remainCnts[col];
582
+ remainCnts[col]--;
583
+ }
584
+ if (mathlib.getNParity(mathlib.getNPerm(this.uf, 12), 12) != 0) {
585
+ for (var i2 = 0; i2 < 12; i2++) {
586
+ this.uf[i2] ^= this.uf[i2] < 2 ? 1 : 0;
587
+ }
588
+ }
589
+ if (mathlib.getNParity(mathlib.getNPerm(this.rl, 12), 12) != 0) {
590
+ for (var i2 = 0; i2 < 12; i2++) {
591
+ this.rl[i2] ^= this.rl[i2] < 2 ? 1 : 0;
592
+ }
593
+ }
594
+ return this;
595
+ };
596
+ InternalFtoCubie.FtoMult = function () {
597
+ var prod = arguments[arguments.length - 1] || new InternalFtoCubie();
598
+ for (var k = 0; k < arguments.length; k++) {
599
+ var a = arguments[arguments.length - 1 - k];
600
+ for (var i2 = 0; i2 < 6; i2++) {
601
+ prod.co[i2] = k == 0 ? 0 : a.co[prod.cp[i2]] ^ prod.co[i2];
602
+ prod.cp[i2] = k == 0 ? i2 : a.cp[prod.cp[i2]];
603
+ }
604
+ for (var i2 = 0; i2 < 12; i2++) {
605
+ prod.ep[i2] = k == 0 ? i2 : a.ep[prod.ep[i2]];
606
+ prod.uf[i2] = k == 0 ? i2 : a.uf[prod.uf[i2]];
607
+ prod.rl[i2] = k == 0 ? i2 : a.rl[prod.rl[i2]];
608
+ }
609
+ }
610
+ return prod;
611
+ };
612
+ function initMoveCube() {
613
+ var rotU = new InternalFtoCubie([1, 2, 0, 4, 5, 3], [0, 0, 0, 0, 0, 0], [2, 0, 1, 5, 3, 4, 10, 11, 6, 7, 8, 9], [1, 2, 0, 7, 8, 6, 10, 11, 9, 4, 5, 3], [2, 0, 1, 8, 6, 7, 11, 9, 10, 5, 3, 4]);
614
+ var rotR = new InternalFtoCubie([5, 0, 4, 2, 3, 1], [1, 1, 0, 1, 1, 0], [6, 5, 7, 9, 2, 10, 11, 4, 3, 8, 1, 0], [5, 3, 4, 8, 6, 7, 2, 0, 1, 11, 9, 10], [4, 5, 3, 7, 8, 6, 1, 2, 0, 10, 11, 9]);
615
+ var rotUi = InternalFtoCubie.FtoMult(rotU, rotU, null);
616
+ var rotRi = InternalFtoCubie.FtoMult(rotR, rotR, null);
617
+ var rotL = InternalFtoCubie.FtoMult(rotUi, rotR, rotU, null);
618
+ var rotF = InternalFtoCubie.FtoMult(rotR, rotU, rotRi, null);
619
+ var moveCube = [];
620
+ moveCube[0] = new InternalFtoCubie([1, 2, 0, 3, 4, 5], [0, 0, 0, 0, 0, 0], [2, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11], [0, 1, 2, 3, 6, 7, 11, 9, 8, 5, 10, 4]);
621
+ moveCube[2] = new InternalFtoCubie([4, 1, 2, 3, 5, 0], [1, 0, 0, 0, 1, 0], [0, 1, 2, 3, 4, 6, 7, 5, 8, 9, 10, 11], [0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11], [0, 9, 10, 3, 4, 5, 2, 7, 1, 8, 6, 11]);
622
+ moveCube[4] = new InternalFtoCubie([0, 5, 2, 1, 4, 3], [0, 1, 0, 0, 0, 1], [0, 1, 2, 3, 10, 5, 6, 7, 8, 9, 11, 4], [0, 1, 2, 3, 4, 5, 7, 8, 6, 9, 10, 11], [5, 3, 2, 11, 4, 10, 6, 7, 8, 9, 0, 1]);
623
+ moveCube[6] = new InternalFtoCubie([0, 1, 3, 4, 2, 5], [0, 0, 1, 1, 0, 0], [0, 1, 2, 8, 4, 5, 6, 7, 9, 3, 10, 11], [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 9], [8, 1, 7, 2, 0, 5, 6, 3, 4, 9, 10, 11]);
624
+ moveCube[8] = new InternalFtoCubie([0, 1, 2, 5, 3, 4], [0, 0, 0, 0, 0, 0], [0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11], [0, 1, 2, 3, 9, 10, 5, 7, 4, 8, 6, 11], [1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
625
+ moveCube[10] = new InternalFtoCubie([0, 3, 1, 2, 4, 5], [0, 1, 1, 0, 0, 0], [0, 1, 10, 3, 4, 5, 6, 7, 8, 2, 9, 11], [0, 6, 7, 3, 4, 5, 11, 9, 8, 2, 10, 1], [0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11]);
626
+ moveCube[12] = new InternalFtoCubie([5, 0, 2, 3, 4, 1], [1, 1, 0, 0, 0, 0], [6, 1, 2, 3, 4, 5, 11, 7, 8, 9, 10, 0], [5, 3, 2, 8, 4, 7, 6, 0, 1, 9, 10, 11], [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 9]);
627
+ moveCube[14] = new InternalFtoCubie([2, 1, 4, 3, 0, 5], [1, 0, 1, 0, 0, 0], [0, 8, 2, 3, 4, 5, 6, 1, 7, 9, 10, 11], [11, 1, 10, 2, 0, 5, 6, 7, 8, 9, 3, 4], [0, 1, 2, 3, 4, 5, 7, 8, 6, 9, 10, 11]);
628
+ moveCube[16] = InternalFtoCubie.FtoMult(rotU, moveCube[8], null);
629
+ moveCube[18] = InternalFtoCubie.FtoMult(rotF, moveCube[10], null);
630
+ moveCube[20] = InternalFtoCubie.FtoMult(rotR, moveCube[6], null);
631
+ moveCube[22] = InternalFtoCubie.FtoMult(rotL, moveCube[4], null);
632
+ for (var i2 = 1; i2 < 24; i2 += 2) {
633
+ moveCube[i2] = new InternalFtoCubie();
634
+ InternalFtoCubie.FtoMult(moveCube[i2 - 1], moveCube[i2 - 1], moveCube[i2]);
635
+ }
636
+ var moveHash = [];
637
+ for (var i2 = 0; i2 < 24; i2++) {
638
+ moveHash[i2] = moveCube[i2].ep.join(",");
639
+ }
640
+ var symCube = [];
641
+ var symMult = [];
642
+ var symMulI = [];
643
+ var symMulM = [];
644
+ var symHash = [];
645
+ var fc = new InternalFtoCubie();
646
+ for (var s = 0; s < 12; s++) {
647
+ symCube[s] = new InternalFtoCubie(fc.cp, fc.co, fc.ep, fc.uf, fc.rl);
648
+ symHash[s] = symCube[s].ep.join(",");
649
+ symMult[s] = [];
650
+ symMulI[s] = [];
651
+ fc = InternalFtoCubie.FtoMult(fc, rotU, null);
652
+ if (s % 3 == 2) {
653
+ fc = InternalFtoCubie.FtoMult(fc, rotR, rotU, null);
654
+ }
655
+ if (s % 6 == 5) {
656
+ fc = InternalFtoCubie.FtoMult(fc, rotU, rotR, null);
657
+ }
658
+ }
659
+ for (var i2 = 0; i2 < 12; i2++) {
660
+ for (var j = 0; j < 12; j++) {
661
+ InternalFtoCubie.FtoMult(symCube[i2], symCube[j], fc);
662
+ var k = symHash.indexOf(fc.ep.join(","));
663
+ symMult[i2][j] = k;
664
+ symMulI[k][j] = i2;
665
+ }
666
+ }
667
+ for (var s = 0; s < 12; s++) {
668
+ symMulM[s] = [];
669
+ for (var j = 0; j < 8; j++) {
670
+ InternalFtoCubie.FtoMult(symCube[symMulI[0][s]], moveCube[j * 2], symCube[s], fc);
671
+ var k = moveHash.indexOf(fc.ep.join(","));
672
+ symMulM[s][j] = k >> 1;
673
+ }
674
+ }
675
+ InternalFtoCubie.moveCube = moveCube;
676
+ InternalFtoCubie.symCube = symCube;
677
+ InternalFtoCubie.symMult = symMult;
678
+ InternalFtoCubie.symMulI = symMulI;
679
+ InternalFtoCubie.symMulM = symMulM;
680
+ }
681
+ initMoveCube();
682
+ function ftoPermMove(key, perm, move) {
683
+ var ret = [];
684
+ var movePerm = InternalFtoCubie.moveCube[move][key];
685
+ for (var i2 = 0; i2 < 12; i2++) {
686
+ ret[i2] = perm[movePerm[i2]];
687
+ }
688
+ return ret;
689
+ }
690
+ function ftoFullMove(fc, move) {
691
+ return InternalFtoCubie.FtoMult(fc, InternalFtoCubie.moveCube[move], null);
692
+ }
693
+ function phase1EdgeHash(ep) {
694
+ var ret = 0;
695
+ var e3fst = -1;
696
+ for (var i2 = 0; i2 < 12; i2++) {
697
+ if ((56 >> ep[i2] & 1) == 0) {
698
+ continue;
699
+ }
700
+ if (e3fst == -1) {
701
+ e3fst = ep[i2];
702
+ }
703
+ ret += (ep[i2] - e3fst + 3) % 3 + 1 << i2 * 2;
704
+ }
705
+ return ret;
706
+ }
707
+ function phase1CtrlHash(rl) {
708
+ var ret = 0;
709
+ for (var i2 = 0; i2 < 12; i2++) {
710
+ if (rl[i2] < 3) {
711
+ ret |= 1 << i2;
712
+ }
713
+ }
714
+ return ret;
715
+ }
716
+ function phase2EdgeHash(ep) {
717
+ var edge2group = [0, 1, 2, 3, 3, 3, 0, 1, 1, 2, 2, 0];
718
+ var groups = [[0, 6, 11], [1, 7, 8], [2, 9, 10], [3, 4, 5]];
719
+ var ret = 0;
720
+ var egoff = [-1, -1, -1, -1];
721
+ for (var i2 = 0; i2 < 12; i2++) {
722
+ var g = edge2group[ep[i2]];
723
+ var gidx = groups[g].indexOf(ep[i2]);
724
+ if (egoff[g] == -1) {
725
+ egoff[g] = gidx;
726
+ }
727
+ ret += (g * 4 + (gidx - egoff[g] + 3) % 3) * Math.pow(16, i2);
728
+ }
729
+ return ret;
730
+ }
731
+ function phase2CtHash(ct) {
732
+ var ret = 0;
733
+ for (var i2 = 0; i2 < 12; i2++) {
734
+ ret |= ~~(ct[i2] / 3) << i2 * 2;
735
+ }
736
+ return ret;
737
+ }
738
+ function phase3EdgeHash(ep) {
739
+ return String.fromCharCode.apply(null, ep);
740
+ }
741
+ function phase3CcufHash(fc) {
742
+ return String.fromCharCode.apply(null, [].concat(fc.cp, fc.co));
743
+ }
744
+ function genCkmv(moves) {
745
+ var ckmv = [];
746
+ var tmp1 = new InternalFtoCubie();
747
+ var tmp2 = new InternalFtoCubie();
748
+ for (var m1 = 0; m1 < moves.length; m1++) {
749
+ ckmv[m1] = 1 << m1;
750
+ for (var m2 = 0; m2 < m1; m2++) {
751
+ InternalFtoCubie.FtoMult(InternalFtoCubie.moveCube[moves[m1]], InternalFtoCubie.moveCube[moves[m2]], tmp1);
752
+ InternalFtoCubie.FtoMult(InternalFtoCubie.moveCube[moves[m2]], InternalFtoCubie.moveCube[moves[m1]], tmp2);
753
+ if (tmp1.isEqual(tmp2)) {
754
+ ckmv[m1] |= 1 << m2;
755
+ }
756
+ }
757
+ }
758
+ return ckmv;
759
+ }
760
+ var phase1Moves = [0, 2, 22, 6, 16, 10, 12, 14];
761
+ var p1epMoves = null;
762
+ var p1rlMoves = null;
763
+ var ckmv1 = null;
764
+ var solv1 = null;
765
+ var pyraSymCube = [];
766
+ for (var i = 0; i < 12; i++) {
767
+ pyraSymCube.push(new InternalFtoCubie(InternalFtoCubie.symCube[i].cp, InternalFtoCubie.symCube[i].co, null, InternalFtoCubie.symCube[i].uf, null));
768
+ }
769
+ function phase1Init() {
770
+ var fc = new InternalFtoCubie();
771
+ p1epMoves = mathlib.createMoveHash(fc.ep.slice(), phase1Moves, phase1EdgeHash, ftoPermMove.bind(null, "ep"));
772
+ p1rlMoves = mathlib.createMoveHash(fc.rl.slice(), phase1Moves, phase1CtrlHash, ftoPermMove.bind(null, "rl"));
773
+ var N_P1EP = p1epMoves[0][0].length;
774
+ var N_P1RL = p1rlMoves[0][0].length;
775
+ ckmv1 = genCkmv(phase1Moves);
776
+ var p1eprlPrun = [];
777
+ mathlib.createPrun(p1eprlPrun, 0, N_P1EP * N_P1RL, 14, function (idx, move) {
778
+ var rl = ~~(idx / N_P1EP);
779
+ var ep = idx % N_P1EP;
780
+ return p1rlMoves[0][move][rl] * N_P1EP + p1epMoves[0][move][ep];
781
+ }, phase1Moves.length, 2);
782
+ solv1 = new mathlib.Searcher(null, function (idx) {
783
+ return mathlib.getPruning(p1eprlPrun, idx[1] * N_P1EP + idx[0]);
784
+ }, function (idx, move) {
785
+ return [
786
+ p1epMoves[0][move][idx[0]],
787
+ p1rlMoves[0][move][idx[1]]
788
+ ];
789
+ }, 8, 2, ckmv1);
790
+ }
791
+ function phase1GenIdxs(fc) {
792
+ var idxs = [];
793
+ var syms = [];
794
+ var fc2 = new InternalFtoCubie();
795
+ var fc3 = new InternalFtoCubie();
796
+ for (var sidx = 0; sidx < 12; sidx += 3) {
797
+ InternalFtoCubie.FtoMult(InternalFtoCubie.symCube[sidx % 12], fc, fc2);
798
+ var rot;
799
+ for (rot = 0; rot < 12; rot++) {
800
+ InternalFtoCubie.FtoMult(fc2, InternalFtoCubie.symCube[rot], fc3);
801
+ if (fc3.ep[4] == 4) {
802
+ break;
803
+ }
804
+ }
805
+ idxs.push([
806
+ p1epMoves[1][phase1EdgeHash(fc3.ep)],
807
+ p1rlMoves[1][phase1CtrlHash(fc3.rl)]
808
+ ]);
809
+ syms.push([sidx, rot]);
810
+ }
811
+ return [idxs, syms];
812
+ }
813
+ function phase1ProcSol(sol, solsym, fc) {
814
+ for (var i2 = 0; i2 < sol.length; i2++) {
815
+ sol[i2] = phase1Moves[sol[i2][0]] + sol[i2][1];
816
+ }
817
+ var std = move2std(sol);
818
+ for (var i2 = 0; i2 < std[0].length; i2++) {
819
+ var move = std[0][i2];
820
+ sol[i2] = InternalFtoCubie.symMulM[InternalFtoCubie.symMulI[0][solsym[1]]][move >> 1] * 2 + (move & 1);
821
+ fc = InternalFtoCubie.FtoMult(fc, InternalFtoCubie.moveCube[sol[i2]], null);
822
+ }
823
+ solsym[1] = InternalFtoCubie.symMulI[solsym[1]][std[1]];
824
+ fc = InternalFtoCubie.FtoMult(pyraSymCube[~~(solsym[0] / 12)], InternalFtoCubie.symCube[solsym[0] % 12], fc, InternalFtoCubie.symCube[solsym[1]], null);
825
+ return [fc, sol, solsym[0], solsym[1]];
826
+ }
827
+ var N_PHASE1_SOLS = 1e3;
828
+ function solvePhase1(fc) {
829
+ if (!solv1) {
830
+ phase1Init();
831
+ }
832
+ var tt = performance.now();
833
+ var idxs = phase1GenIdxs(fc);
834
+ var syms = idxs[1];
835
+ idxs = idxs[0];
836
+ var p1sols = [];
837
+ solv1.solveMulti(idxs, 0, 12, function (sol, sidx) {
838
+ var param = phase1ProcSol(sol.slice(), syms[sidx].slice(), fc);
839
+ p1sols.push(param);
840
+ return p1sols.length >= N_PHASE1_SOLS;
841
+ });
842
+ tt = performance.now() - tt;
843
+ for (var i2 = 0; i2 < p1sols.length; i2++) {
844
+ p1sols[i2].push(tt);
845
+ }
846
+ return p1sols;
847
+ }
848
+ var phase2Moves = [0, 12, 14, 8, 10];
849
+ var p2epMoves = null;
850
+ var p2rlMoves = null;
851
+ var p2ccMoves = null;
852
+ var p2cc2ufBit = {};
853
+ var ckmv2 = null;
854
+ var solv2 = null;
855
+ var P2EPRL_MAXL = 11;
856
+ var p2symMap = [];
857
+ var ufStd2Raw = [];
858
+ var ufRaw2Std = [];
859
+ var p2ufCoord = new mathlib.Coord("c", 12, [3, 3, 3, 3]);
860
+ var cornExFacelets = [
861
+ [U + 2, R + 2, F + 2, L + 2],
862
+ [U + 5, B + 7, r + 5, R + 7],
863
+ [U + 7, L + 5, l + 7, B + 5],
864
+ [l + 2, D + 2, r + 2, B + 2],
865
+ [F + 5, D + 7, l + 5, L + 7],
866
+ [r + 7, D + 5, F + 7, R + 5]
867
+ ];
868
+ function phase2CpcoHash(fc) {
869
+ var ret = String.fromCharCode.apply(null, [].concat(fc.cp, fc.co));
870
+ if (!(ret in p2cc2ufBit)) {
871
+ var co = [];
872
+ for (var i2 = 0; i2 < 6; i2++) {
873
+ co[i2] = fc.co[i2] * 2;
874
+ }
875
+ var facelet = fc.toFaceCube();
876
+ mathlib.fillFacelet(cornExFacelets, facelet, fc.cp, co, 9);
877
+ var fc2 = new InternalFtoCubie().fromFacelet(facelet);
878
+ p2cc2ufBit[ret] = phase2CtHash(fc2.uf);
879
+ }
880
+ return ret;
881
+ }
882
+ function phase2ufStd(uf, symMap) {
883
+ var col1 = uf[0], col2 = -1;
884
+ for (var i2 = 1; i2 < 12; i2++) {
885
+ if (uf[i2] != col1) {
886
+ col2 = uf[i2];
887
+ break;
888
+ }
889
+ }
890
+ var sym = symMap[col1 * 4 + col2];
891
+ for (var i2 = 0; i2 < 12; i2++) {
892
+ uf[i2] = ~~(InternalFtoCubie.symCube[sym].uf[uf[i2] * 3] / 3);
893
+ }
894
+ return sym;
895
+ }
896
+ function getPhase2ufIdx(uf) {
897
+ var ufstd = [];
898
+ for (var i2 = 0; i2 < 12; i2++) {
899
+ ufstd[i2] = ~~(uf[i2] / 3);
900
+ }
901
+ var sym = phase2ufStd(ufstd, p2symMap);
902
+ return ufRaw2Std[p2ufCoord.get(ufstd)] << 4 | sym;
903
+ }
904
+ function phase2Init() {
905
+ var fc = new InternalFtoCubie();
906
+ p2epMoves = mathlib.createMoveHash(fc.ep.slice(), phase2Moves, phase2EdgeHash, ftoPermMove.bind(null, "ep"));
907
+ p2rlMoves = mathlib.createMoveHash(fc.rl.slice(), phase2Moves, phase2CtHash, ftoPermMove.bind(null, "rl"));
908
+ p2ccMoves = mathlib.createMoveHash(fc, phase2Moves, phase2CpcoHash, ftoFullMove);
909
+ var arr = [];
910
+ var arr2 = [];
911
+ var p2ufMoveStd = [[], [], [], [], []];
912
+ var ufStd2Bit = [];
913
+ var p2ccRecol = [];
914
+ for (var s = 0; s < 12; s++) {
915
+ var uf = InternalFtoCubie.symCube[s].uf;
916
+ var col1 = ~~(uf.indexOf(0) / 3);
917
+ var col2 = ~~(uf.indexOf(3) / 3);
918
+ p2symMap[col1 * 4 + col2] = s;
919
+ p2ccRecol[s] = [];
920
+ }
921
+ out: for (var i2 = 0; i2 < 42e3; i2++) {
922
+ p2ufCoord.set(arr, i2);
923
+ for (var j = 1; j < 12; j++) {
924
+ if (arr[j] > 1) {
925
+ continue out;
926
+ }
927
+ else if (arr[j] == 1) {
928
+ break;
929
+ }
930
+ }
931
+ ufRaw2Std[i2] = ufStd2Raw.length;
932
+ ufStd2Raw.push(i2);
933
+ }
934
+ for (var i2 = 0; i2 < ufStd2Raw.length; i2++) {
935
+ p2ufCoord.set(arr, ufStd2Raw[i2]);
936
+ var hash = 0;
937
+ for (var j = 0; j < 12; j++) {
938
+ hash |= arr[j] << j * 2;
939
+ }
940
+ ufStd2Bit[i2] = hash;
941
+ for (var m = 0; m < phase2Moves.length; m++) {
942
+ mathlib.permOriMult(arr, InternalFtoCubie.moveCube[phase2Moves[m]].uf, arr2);
943
+ var sym = phase2ufStd(arr2, p2symMap);
944
+ p2ufMoveStd[m][i2] = ufRaw2Std[p2ufCoord.get(arr2)] << 4 | sym;
945
+ }
946
+ }
947
+ var cc2Bit = [];
948
+ for (var key in p2ccMoves[1]) {
949
+ var idx = p2ccMoves[1][key];
950
+ cc2Bit[idx] = p2cc2ufBit[key];
951
+ var cpco = [];
952
+ for (var s = 0; s < 12; s++) {
953
+ var sc = InternalFtoCubie.symCube[s];
954
+ for (var i2 = 0; i2 < 6; i2++) {
955
+ var scpi = key.charCodeAt(i2);
956
+ cpco[i2] = sc.cp[scpi];
957
+ cpco[i2 + 6] = sc.co[scpi] ^ key.charCodeAt(i2 + 6);
958
+ }
959
+ var hash = String.fromCharCode.apply(null, cpco);
960
+ p2ccRecol[s][idx] = p2ccMoves[1][hash];
961
+ }
962
+ }
963
+ var p2necPrun = [
964
+ 0, 0, 3, 4, 5, 6, 8,
965
+ 0, 2, 3, 4, 5, 6, 8,
966
+ 1, 2, 4, 4, 5, 6, 8,
967
+ 1, 3, 4, 5, 6, 7, 8,
968
+ 3, 3, 4, 5, 6, 7, 9,
969
+ 4, 4, 5, 6, 7, 8, 9,
970
+ 5, 5, 6, 7, 8, 9, 10
971
+ ];
972
+ var N_P2EP = p2epMoves[0][0].length;
973
+ var N_P2RL = p2rlMoves[0][0].length;
974
+ var p2eprlPrun = [];
975
+ mathlib.createPrun(p2eprlPrun, 0, N_P2EP * N_P2RL, P2EPRL_MAXL - 2, function (idx2, move) {
976
+ var rl = ~~(idx2 / N_P2EP);
977
+ var ep = idx2 % N_P2EP;
978
+ return p2rlMoves[0][move][rl] * N_P2EP + p2epMoves[0][move][ep];
979
+ }, phase2Moves.length, 2);
980
+ ckmv2 = genCkmv(phase2Moves);
981
+ solv2 = new mathlib.Searcher(function (idx2) {
982
+ return ufStd2Bit[idx2[3] >> 4] == cc2Bit[p2ccRecol[idx2[3] & 15][idx2[2]]];
983
+ }, function (idx2) {
984
+ var xors = ufStd2Bit[idx2[3] >> 4] ^ cc2Bit[p2ccRecol[idx2[3] & 15][idx2[2]]];
985
+ xors = (xors | xors >> 1) & 5592405;
986
+ var necIdx = mathlib.bitCount(xors & 12632319) * 7 + mathlib.bitCount(xors & 4144896);
987
+ return Math.max(Math.min(P2EPRL_MAXL, mathlib.getPruning(p2eprlPrun, idx2[1] * N_P2EP + idx2[0])), p2necPrun[necIdx]);
988
+ }, function (idx2, move) {
989
+ var ufidx1 = p2ufMoveStd[move][idx2[3] >> 4];
990
+ var ufcol = InternalFtoCubie.symMult[ufidx1 & 15][idx2[3] & 15];
991
+ return [
992
+ p2epMoves[0][move][idx2[0]],
993
+ p2rlMoves[0][move][idx2[1]],
994
+ p2ccMoves[0][move][idx2[2]],
995
+ ufidx1 & ~15 | ufcol
996
+ ];
997
+ }, phase2Moves.length, 2, ckmv2);
998
+ }
999
+ function solvePhase2(solvInfos) {
1000
+ if (!solv2) {
1001
+ phase2Init();
1002
+ }
1003
+ var tt = performance.now();
1004
+ var idxs = [];
1005
+ for (var i2 = 0; i2 < solvInfos.length; i2++) {
1006
+ idxs.push([
1007
+ p2epMoves[1][phase2EdgeHash(solvInfos[i2][0].ep)],
1008
+ p2rlMoves[1][phase2CtHash(solvInfos[i2][0].rl)],
1009
+ p2ccMoves[1][phase2CpcoHash(solvInfos[i2][0])],
1010
+ getPhase2ufIdx(solvInfos[i2][0].uf)
1011
+ ]);
1012
+ }
1013
+ var sol2s = solv2.solveMulti(idxs, 0, 25);
1014
+ var sol = sol2s[0];
1015
+ var src = sol2s[1];
1016
+ var solvInfo = solvInfos[src];
1017
+ var fc = solvInfo[0];
1018
+ for (var i2 = 0; i2 < sol.length; i2++) {
1019
+ var move = phase2Moves[sol[i2][0]] + sol[i2][1];
1020
+ sol[i2] = InternalFtoCubie.symMulM[InternalFtoCubie.symMulI[0][solvInfo[3]]][move >> 1] * 2 + (move & 1);
1021
+ fc = InternalFtoCubie.FtoMult(fc, InternalFtoCubie.moveCube[move], null);
1022
+ }
1023
+ return [fc, sol, solvInfo[2], solvInfo[3], src, performance.now() - tt];
1024
+ }
1025
+ var phase3Moves = [8, 10, 12, 14];
1026
+ var p3epMoves = null;
1027
+ var p3ufMoves = null;
1028
+ var p3epPrun = null;
1029
+ var p3ufPrun = null;
1030
+ var ckmv3 = null;
1031
+ var solv3 = null;
1032
+ function phase3Init() {
1033
+ var fc = new InternalFtoCubie();
1034
+ p3epMoves = mathlib.createMoveHash(fc.ep.slice(), phase3Moves, phase3EdgeHash, ftoPermMove.bind(null, "ep"));
1035
+ p3ufMoves = mathlib.createMoveHash(new InternalFtoCubie(), phase3Moves, phase3CcufHash, ftoFullMove);
1036
+ p3epPrun = [];
1037
+ p3ufPrun = [];
1038
+ mathlib.createPrun(p3epPrun, 0, 81, 14, p3epMoves[0], 4, 2);
1039
+ mathlib.createPrun(p3ufPrun, 0, 11520, 14, p3ufMoves[0], 4, 2);
1040
+ ckmv3 = genCkmv(phase3Moves);
1041
+ solv3 = new mathlib.Searcher(null, function (idx) {
1042
+ return Math.max(mathlib.getPruning(p3epPrun, idx[0]), mathlib.getPruning(p3ufPrun, idx[1]));
1043
+ }, function (idx, move) {
1044
+ return [p3epMoves[0][move][idx[0]], p3ufMoves[0][move][idx[1]]];
1045
+ }, 4, 2, ckmv3);
1046
+ }
1047
+ function solvePhase3(solvInfo) {
1048
+ var fc = solvInfo[0];
1049
+ if (!p3epPrun) {
1050
+ phase3Init();
1051
+ }
1052
+ var tt = performance.now();
1053
+ var p3epidx = p3epMoves[1][phase3EdgeHash(fc.ep)];
1054
+ var p3ufidx = p3ufMoves[1][phase3CcufHash(fc)];
1055
+ var sol = solv3.solve([p3epidx, p3ufidx], 0, 25);
1056
+ for (var i2 = 0; i2 < sol.length; i2++) {
1057
+ var move = phase3Moves[sol[i2][0]] + sol[i2][1];
1058
+ sol[i2] = InternalFtoCubie.symMulM[InternalFtoCubie.symMulI[0][solvInfo[3]]][move >> 1] * 2 + (move & 1);
1059
+ fc = InternalFtoCubie.FtoMult(fc, InternalFtoCubie.moveCube[move], null);
1060
+ }
1061
+ return [fc, sol, solvInfo[2], solvInfo[3], performance.now() - tt];
1062
+ }
1063
+ function move2std(moves) {
1064
+ var sym = 0;
1065
+ var ret = [];
1066
+ var w2axis = [4, 5, 3, 2];
1067
+ var w2rot = [1, 10, 5, 11];
1068
+ for (var i2 = 0; i2 < moves.length; i2++) {
1069
+ var rot = 0;
1070
+ var axis = moves[i2] >> 1;
1071
+ var pow = moves[i2] & 1;
1072
+ if (axis >= 8) {
1073
+ rot = w2rot[axis - 8];
1074
+ axis = w2axis[axis - 8];
1075
+ }
1076
+ if (!pow) {
1077
+ rot = InternalFtoCubie.symMult[rot][rot];
1078
+ }
1079
+ ret.push(InternalFtoCubie.symMulM[sym][axis] * 2 + pow);
1080
+ sym = InternalFtoCubie.symMult[rot][sym];
1081
+ }
1082
+ return [ret, sym];
1083
+ }
1084
+ var move2str = ["U", "U'", "F", "F'", "r", "r'", "l", "l'", "D", "D'", "B", "B'", "R", "R'", "L", "L'"];
1085
+ function prettyMoves(moves) {
1086
+ var buf = [];
1087
+ for (var i2 = 0; i2 < moves.length; i2++) {
1088
+ buf[i2] = move2str[moves[i2]];
1089
+ }
1090
+ return buf.join(" ").replace(/l/g, "BL").replace(/r/g, "BR");
1091
+ }
1092
+ function FtoSolver() {
1093
+ }
1094
+ FtoSolver.prototype.solveFto = function (fc, invSol) {
1095
+ if (!solv1) {
1096
+ phase1Init();
1097
+ phase2Init();
1098
+ phase3Init();
1099
+ }
1100
+ var solvInfos = solvePhase1(fc);
1101
+ var solvInfo2 = solvePhase2(solvInfos);
1102
+ var solvInfo1 = solvInfos[solvInfo2[4]];
1103
+ this.sol1 = solvInfo1[1].slice();
1104
+ this.tt1 = solvInfo1[4];
1105
+ var sym1Idx = solvInfo1[2];
1106
+ this.sol2 = solvInfo2[1].slice();
1107
+ this.tt2 = solvInfo2[5];
1108
+ solvInfo2[0] = InternalFtoCubie.FtoMult(pyraSymCube[InternalFtoCubie.symMulI[0][~~(sym1Idx / 12)]], solvInfo2[0], null);
1109
+ var solvInfo3 = solvePhase3(solvInfo2);
1110
+ this.sol3 = solvInfo3[1].slice();
1111
+ this.tt3 = solvInfo3[4];
1112
+ var sol = [].concat(this.sol1, this.sol2, this.sol3);
1113
+ if (invSol) {
1114
+ for (var i2 = 0; i2 < sol.length; i2++) {
1115
+ sol[i2] ^= 1;
1116
+ }
1117
+ sol.reverse();
1118
+ }
1119
+ return prettyMoves(sol);
1120
+ };
1121
+ var solver = new FtoSolver();
1122
+ function solveFacelet(facelet, invSol) {
1123
+ var fc = new InternalFtoCubie();
1124
+ if (fc.fromFacelet(facelet) == -1) {
1125
+ return "FTO Solver ERROR!";
1126
+ }
1127
+ return solver.solveFto(fc, invSol);
1128
+ }
1129
+ return {
1130
+ solveFacelet,
1131
+ InternalFtoCubie,
1132
+ solver
1133
+ };
1134
+ })();
1135
+ var fto_scrambler = (function () {
1136
+ function getRandomScramble(rng) {
1137
+ currentRng = rng || Math.random;
1138
+ var fc = new ftosolver.InternalFtoCubie();
1139
+ fc.ep = mathlib.rndPerm(12, true);
1140
+ fc.uf = mathlib.rndPerm(12, true);
1141
+ fc.rl = mathlib.rndPerm(12, true);
1142
+ fc.cp = mathlib.rndPerm(6, true);
1143
+ mathlib.setNOri(fc.co, mathlib.rn(32), 6, -2);
1144
+ return ftosolver.solveFacelet(fc.toFaceCube(), true);
1145
+ }
1146
+ return {
1147
+ getRandomScramble
1148
+ };
1149
+ })();
1150
+ function initFtoSolver() {
1151
+ ftosolver.solver.solveFto(new ftosolver.InternalFtoCubie(), false);
1152
+ }
1153
+ function isFtoSolverInitialized() {
1154
+ return true;
1155
+ }
1156
+ function solveFtoFacelet(facelet, invSol = false) {
1157
+ return ftosolver.solveFacelet(facelet, invSol);
1158
+ }
1159
+ function solveFto(fc) {
1160
+ const internal = new ftosolver.InternalFtoCubie(fc.cp, fc.co, fc.ep, fc.uf, fc.rl);
1161
+ const scrambleOrSol = ftosolver.solver.solveFto(internal, false);
1162
+ return (0, moves_js_1.parseFtoAlgorithm)(scrambleOrSol);
1163
+ }
1164
+ function generateFtoRandomState(rng = Math.random) {
1165
+ const scrambleStr = fto_scrambler.getRandomScramble(rng);
1166
+ const moves = (0, moves_js_1.parseFtoAlgorithm)(scrambleStr);
1167
+ const targetState = (0, moves_js_1.applyFtoAlgorithm)(new state_js_1.FtoCubie(), moves);
1168
+ const facelets = (0, facelets_js_1.toFtoFacelets)(targetState);
1169
+ return {
1170
+ scramble: scrambleStr,
1171
+ moves,
1172
+ state: targetState,
1173
+ facelets
1174
+ };
1175
+ }