Estoy tratando de juntar un código javascript rápido y sucio para darme la cantidad de posibles permutaciones de piezas en un cubo de rubik dada una restricción como "1 pieza de borde está resuelta". (apegándome a 3x3 por simplicidad) Cuando ejecuto las 12 piezas de borde normales y las 8 esquinas a través de mi función, me da un número que es 4000 mayor de lo que puedo encontrar, debería ser la respuesta. (La función me da 43,252,003,274,489,860,000 pero https://www.youtube.com/watch?v=z2-d0x_qxSM dice que debería ser 43,252,003,274,489,856,000)
Mi código:
// 3x3x3 Rubik's Cube edgepieces = 12; cornerpieces = 8; centerpieces = 6; // total possible permutations in general function numCombos(edges, corners) { result = ((factorial(edges) * (factorial(corners)) / 2) * (2 ** (edges - 1)) * (3 ** (corners - 1))); return result; } // n! function factorial(x) { if (x == 0) { return 1; } else { return x * factorial(x - 1); } } console.log(numCombos(edgepieces, cornerpieces) + '\n');He seguido un par de arreglos diferentes para el algoritmo de resultado central y todos me dan este resultado final. ¿Qué me estoy perdiendo?
Puede usar valores BigInt para evitar problemas de precisión de punto flotante:
// 3x3x3 Rubik's Cube edgepieces = 12n; cornerpieces = 8n; centerpieces = 6n; // total possible permutations in general function numCombos(edges, corners) { result = ((factorial(edges) * (factorial(corners)) / 2n) * (2n ** (edges - 1n)) * (3n ** (corners - 1n))); return result; } // n! function factorial(x) { if (x == 0) { return 1n; } else { return x * factorial(x - 1n); } } console.log(numCombos(edgepieces, cornerpieces) + '\n');Los números de punto flotante de doble precisión tienen 53 bits de precisión, que son casi 16 dígitos de precisión. [1] Espera un resultado con 17 dígitos de precisión. Es posible que el número ni siquiera pueda ser representado por un doble.
La solución simple es usar números BigInt en lugar de números de coma flotante.