import { PuzzleInterface, STANDARD_PALETTE } from "./constants"; import { randomCSSId } from "./strings"; export function MEGAMINX(): PuzzleInterface { const mega: PuzzleInterface = { palette: STANDARD_PALETTE, move: () => false, }; const ID = randomCSSId(); type FaceName = | "U" | "R" | "F" | "L" | "BL" | "BR" | "DR" | "DL" | "DBL" | "B" | "DBR" | "D"; const faces: Record = { U: ["U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U"], R: ["R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R"], F: ["F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F"], L: ["L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L"], BL: ["BL", "BL", "BL", "BL", "BL", "BL", "BL", "BL", "BL", "BL", "BL"], BR: ["BR", "BR", "BR", "BR", "BR", "BR", "BR", "BR", "BR", "BR", "BR"], DR: ["DR", "DR", "DR", "DR", "DR", "DR", "DR", "DR", "DR", "DR", "DR"], DL: ["DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL", "DL"], DBL: [ "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", "DBL", ], B: ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B"], DBR: [ "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", "DBR", ], D: ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D"], }; function update( NU: FaceName[], NR: FaceName[], NF: FaceName[], NL: FaceName[], NBL: FaceName[], NBR: FaceName[], NDR: FaceName[], NDL: FaceName[], NDBL: FaceName[], NB: FaceName[], NDBR: FaceName[], ND: FaceName[], ) { faces.U = NU; faces.R = NR; faces.F = NF; faces.L = NL; faces.BL = NBL; faces.BR = NBR; faces.DR = NDR; faces.DL = NDL; faces.DBL = NDBL; faces.B = NB; faces.DBR = NDBR; faces.D = ND; } const cycles = { R: (count: number) => { const times = ((count % 5) + 5) % 5; for (let i = 0; i < times; i += 1) { const NU = faces.F.map((v, p) => [1, 2, 6].some((e) => e === p) ? faces.U[p] : v, ); const NR = [3, 4, 0, 1, 2, 8, 9, 5, 6, 7, 10].map((n) => faces.DR[n]); const NF = [2, -1, -1, 0, 1, 7, -1, 9, 5, 6, 10].map((n, p) => n < 0 ? faces.F[p] : faces.DL[n], ); const NL = [...faces.L]; const NBL = [-1, 3, 4, 0, -1, 7, 8, 9, 5, -1, 10].map((n, p) => n < 0 ? faces.BL[p] : faces.U[n], ); const NBR = [1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 10].map((n) => faces.R[n]); const NDR = [2, 3, 4, 0, 1, 7, 8, 9, 5, 6, 10].map((n) => faces.D[n]); const NDL = [4, 0, 1, -1, -1, 9, 5, 6, -1, 8, 10].map((n, p) => n < 0 ? faces.DL[p] : faces.DBL[n], ); const NDBL = [2, 3, -1, -1, 1, 7, 8, -1, 5, 6, 10].map((n, p) => n < 0 ? faces.DBL[p] : faces.BL[n], ); const NB = [3, 4, 0, 1, 2, 8, 9, 5, 6, 7, 10].map((n) => faces.BR[n]); const NDBR = [1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 10].map( (n) => faces.DBR[n], ); const ND = [1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 10].map((n) => faces.B[n]); update(NU, NR, NF, NL, NBL, NBR, NDR, NDL, NDBL, NB, NDBR, ND); } }, D: (count: number) => { const times = ((count % 5) + 5) % 5; for (let i = 0; i < times; i += 1) { const NU = [...faces.U]; const NR = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, 10].map((n, p) => n < 0 ? faces.R[p] : faces.F[n], ); const NF = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, 10].map((n, p) => n < 0 ? faces.F[p] : faces.L[n], ); const NL = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, 10].map((n, p) => n < 0 ? faces.L[p] : faces.BL[n], ); const NBL = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, 10].map((n, p) => n < 0 ? faces.BL[p] : faces.BR[n], ); const NBR = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, 10].map((n, p) => n < 0 ? faces.BR[p] : faces.R[n], ); const NDR = [...faces.DL]; const NDL = [...faces.DBL]; const NDBL = [...faces.B]; const NB = [...faces.DBR]; const NDBR = [...faces.DR]; const ND = [1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 10].map((n) => faces.D[n]); update(NU, NR, NF, NL, NBL, NBR, NDR, NDL, NDBL, NB, NDBR, ND); } }, U: (count: number) => { const times = ((count % 5) + 5) % 5; for (let i = 0; i < times; i += 1) { const NU = [1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 10].map((n) => faces.U[n]); const NR = faces.R.map((n, p) => [0, 1, 5].some((p1) => p1 === p) ? faces.BR[p] : n, ); const NF = faces.F.map((n, p) => [0, 1, 5].some((p1) => p1 === p) ? faces.R[p] : n, ); const NL = faces.L.map((n, p) => [0, 1, 5].some((p1) => p1 === p) ? faces.F[p] : n, ); const NBL = faces.BL.map((n, p) => [0, 1, 5].some((p1) => p1 === p) ? faces.L[p] : n, ); const NBR = faces.BR.map((n, p) => [0, 1, 5].some((p1) => p1 === p) ? faces.BL[p] : n, ); const NDR = [...faces.DR]; const NDL = [...faces.DL]; const NDBL = [...faces.DBL]; const NB = [...faces.B]; const NDBR = [...faces.DBR]; const ND = [...faces.D]; update(NU, NR, NF, NL, NBL, NBR, NDR, NDL, NDBL, NB, NDBR, ND); } }, }; const lookup = { U: 0, R: 1, F: 2, L: 3, BL: 4, BR: 5, D: 6, DL: 7, DR: 8, DBR: 9, B: 10, DBL: 11, }; function getClass(fc: FaceName) { return "c" + lookup[fc]; } mega.move = function (moves: any[]) { moves.forEach((mv) => { if (mv[0] === 0) { if (mv[2] < 0) cycles.D(mv[1]); else cycles.U(-mv[1]); } else if (mv[0] === 1) cycles.R(mv[1]); }); }; mega.getImage = () => { const classMap: Map = new Map(); const paths = [ [ getClass(faces.U[0]), ``, ], [ getClass(faces.U[1]), ``, ], [ getClass(faces.U[2]), ``, ], [ getClass(faces.U[3]), ``, ], [ getClass(faces.U[4]), ``, ], [ getClass(faces.U[5]), ``, ], [ getClass(faces.U[6]), ``, ], [ getClass(faces.U[7]), ``, ], [ getClass(faces.U[8]), ``, ], [ getClass(faces.U[9]), ``, ], [ getClass(faces.U[10]), ``, ], [ getClass(faces.R[0]), ``, ], [ getClass(faces.R[1]), ``, ], [ getClass(faces.R[2]), ``, ], [ getClass(faces.R[3]), ``, ], [ getClass(faces.R[4]), ``, ], [ getClass(faces.R[5]), ``, ], [ getClass(faces.R[6]), ``, ], [ getClass(faces.R[7]), ``, ], [ getClass(faces.R[8]), ``, ], [ getClass(faces.R[9]), ``, ], [ getClass(faces.R[10]), ``, ], [ getClass(faces.F[0]), ``, ], [ getClass(faces.F[1]), ``, ], [ getClass(faces.F[2]), ``, ], [ getClass(faces.F[3]), ``, ], [ getClass(faces.F[4]), ``, ], [ getClass(faces.F[5]), ``, ], [ getClass(faces.F[6]), ``, ], [ getClass(faces.F[7]), ``, ], [ getClass(faces.F[8]), ``, ], [ getClass(faces.F[9]), ``, ], [ getClass(faces.F[10]), ``, ], [ getClass(faces.L[0]), ``, ], [ getClass(faces.L[1]), ``, ], [ getClass(faces.L[2]), ``, ], [ getClass(faces.L[3]), ``, ], [ getClass(faces.L[4]), ``, ], [ getClass(faces.L[5]), ``, ], [ getClass(faces.L[6]), ``, ], [ getClass(faces.L[7]), ``, ], [ getClass(faces.L[8]), ``, ], [ getClass(faces.L[9]), ``, ], [ getClass(faces.L[10]), ``, ], [ getClass(faces.BL[0]), ``, ], [ getClass(faces.BL[1]), ``, ], [ getClass(faces.BL[2]), ``, ], [ getClass(faces.BL[3]), ``, ], [ getClass(faces.BL[4]), ``, ], [ getClass(faces.BL[5]), ``, ], [ getClass(faces.BL[6]), ``, ], [ getClass(faces.BL[7]), ``, ], [ getClass(faces.BL[8]), ``, ], [ getClass(faces.BL[9]), ``, ], [ getClass(faces.BL[10]), ``, ], [ getClass(faces.BR[0]), ``, ], [ getClass(faces.BR[1]), ``, ], [ getClass(faces.BR[2]), ``, ], [ getClass(faces.BR[3]), ``, ], [ getClass(faces.BR[4]), ``, ], [ getClass(faces.BR[5]), ``, ], [ getClass(faces.BR[6]), ``, ], [ getClass(faces.BR[7]), ``, ], [ getClass(faces.BR[8]), ``, ], [ getClass(faces.BR[9]), ``, ], [ getClass(faces.BR[10]), ``, ], [ getClass(faces.D[0]), ``, ], [ getClass(faces.D[1]), ``, ], [ getClass(faces.D[2]), ``, ], [ getClass(faces.D[3]), ``, ], [ getClass(faces.D[4]), ``, ], [ getClass(faces.D[5]), ``, ], [ getClass(faces.D[6]), ``, ], [ getClass(faces.D[7]), ``, ], [ getClass(faces.D[8]), ``, ], [ getClass(faces.D[9]), ``, ], [ getClass(faces.D[10]), ``, ], [ getClass(faces.DL[0]), ``, ], [ getClass(faces.DL[1]), ``, ], [ getClass(faces.DL[2]), ``, ], [ getClass(faces.DL[3]), ``, ], [ getClass(faces.DL[4]), ``, ], [ getClass(faces.DL[5]), ``, ], [ getClass(faces.DL[6]), ``, ], [ getClass(faces.DL[7]), ``, ], [ getClass(faces.DL[8]), ``, ], [ getClass(faces.DL[9]), ``, ], [ getClass(faces.DL[10]), ``, ], [ getClass(faces.DR[0]), ``, ], [ getClass(faces.DR[1]), ``, ], [ getClass(faces.DR[2]), ``, ], [ getClass(faces.DR[3]), ``, ], [ getClass(faces.DR[4]), ``, ], [ getClass(faces.DR[5]), ``, ], [ getClass(faces.DR[6]), ``, ], [ getClass(faces.DR[7]), ``, ], [ getClass(faces.DR[8]), ``, ], [ getClass(faces.DR[9]), ``, ], [ getClass(faces.DR[10]), ``, ], [ getClass(faces.DBR[0]), ``, ], [ getClass(faces.DBR[1]), ``, ], [ getClass(faces.DBR[2]), ``, ], [ getClass(faces.DBR[3]), ``, ], [ getClass(faces.DBR[4]), ``, ], [ getClass(faces.DBR[5]), ``, ], [ getClass(faces.DBR[6]), ``, ], [ getClass(faces.DBR[7]), ``, ], [ getClass(faces.DBR[8]), ``, ], [ getClass(faces.DBR[9]), ``, ], [ getClass(faces.DBR[10]), ``, ], [ getClass(faces.B[0]), ``, ], [ getClass(faces.B[1]), ``, ], [ getClass(faces.B[2]), ``, ], [ getClass(faces.B[3]), ``, ], [ getClass(faces.B[4]), ``, ], [ getClass(faces.B[5]), ``, ], [ getClass(faces.B[6]), ``, ], [ getClass(faces.B[7]), ``, ], [ getClass(faces.B[8]), ``, ], [ getClass(faces.B[9]), ``, ], [ getClass(faces.B[10]), ``, ], [ getClass(faces.DBL[0]), ``, ], [ getClass(faces.DBL[1]), ``, ], [ getClass(faces.DBL[2]), ``, ], [ getClass(faces.DBL[3]), ``, ], [ getClass(faces.DBL[4]), ``, ], [ getClass(faces.DBL[5]), ``, ], [ getClass(faces.DBL[6]), ``, ], [ getClass(faces.DBL[7]), ``, ], [ getClass(faces.DBL[8]), ``, ], [ getClass(faces.DBL[9]), ``, ], [ getClass(faces.DBL[10]), ``, ], ]; paths.forEach((path) => { const val = path[1].replace(/(\d+(\.\d+)?)/g, (match) => { const num = parseFloat(match) / 10; return num.toFixed(2); }); if (classMap.has(path[0])) { classMap.get(path[0])!.push(val); } else { classMap.set(path[0], [val]); } }); return [ ``, ...Array.from(classMap.entries()).map(([cls, path]) => { return `${path.join("")}`; }), `UF `, ].join(""); }; return mega; }