Introducción:
Un cubo de Rubik 3x3x3 tiene permutaciones posibles, que es aproximadamente 43 quintillones . Es posible que haya escuchado sobre este número antes, pero ¿cómo se calcula realmente?
Un cubo de Rubik 3x3x3 tiene seis lados, cada uno con nueve pegatinas. Sin embargo, al mirar las piezas (externas) en lugar de las pegatinas, tenemos seis piezas centrales; piezas de ocho esquinas; y doce piezas de borde. Como los centros no se pueden mover, podemos ignorarlos en los cálculos. En cuanto a las esquinas y bordes:
- Hay( ) formas de organizar las ocho esquinas. Cada esquina tiene tres orientaciones posibles, aunque solo siete (de las ocho) pueden orientarse independientemente; la orientación de la esquina octava / final depende de las siete anteriores, dadas ( ) posibilidades.
- Hay ( ) formas de organizar los doce bordes. La mitad de lases porque los bordes siempre deben estar en una permutación pareja exactamente cuando las esquinas están Once aristas se pueden voltear de forma independiente, con la inversión de la doceava / última arista dependiendo de las once anteriores, dadas ( ) posibilidades.
Al poner esto juntos, tenemos la siguiente fórmula:
Fuente: Wikipedia - Permutaciones del cubo de Rubik
Aunque esto puede parecer bastante complejo, sigue siendo bastante sencillo para un Cubo de 3x3x3. Para cubos pares, la fórmula es ligeramente diferente; Esta es la fórmula para un cubo 4x4x4, por ejemplo:
Que es aproximadamente 7.40 quattuordecillion en la escala corta .
Y para cubos NxNxN más grandes (es decir, el récord mundial actual 33x33x33), la fórmula se ampliará bastante. Sin embargo, para no hacer esta introducción demasiado larga, pongo estos enlaces aquí, donde las permutaciones del Cubo 4x4x4 y algunos Cubos NxNxN de otro tamaño se explican con una fórmula resultante:
Quizás ya se esté preguntando: ¿existe una fórmula general basada en para cualquier cubo x x ? Ciertamente lo hay. Aquí hay tres algoritmos completamente diferentes, todos dando exactamente los mismos resultados basados en N :
1: Fórmula de Chris Hardwick:
2: Fórmula trigonométrica de Christopher Mowla:
3: Fórmula de los primos de Christopher Mowla:
donde es .
Fuente: Cubers-reddit - Fórmulas de conteo matemático de número de posiciones, número de Dios, etc.
Reto:
Elija e implemente una de estas tres fórmulas (o su propia derivada), que dado un entero de entrada en el rango , genera el resultado correcto.
Reglas de desafío:
- Puede usar otra fórmula además de estas tres, pero tenga en cuenta que se ha demostrado que estas tres son correctas. Si usa otra fórmula, agregue un enlace de donde la obtuvo (o si se le ocurre, agregue una explicación detallada). Y comprobaré todos los enteros en el rango si la salida es correcta. Quizás se pueda encontrar inspiración en los oeis para esta secuencia: A075152 .
- Si su idioma genera automáticamente un resultado científico (es decir, lugar del número después de la fórmula 4x4x4), esto está permitido. Pero agregue un código adicional a su respuesta para convertir este redondeo científico en un resultado exacto para que se puedan verificar los resultados, ya que los errores de redondeo debido a la precisión de coma flotante durante la ejecución de la fórmula en su código no están permitidos; exacto.
- Su programa / función debe ser correcto para al menos las entradas en el rango (aunque, dado que ya da como resultado un número enorme, cualquier mayor probablemente funcionará también si puede generar esto uno correctamente).
- No está permitido recorrer todas las permutaciones posibles con un contador, ya que eso nunca generaría nada en un período de tiempo razonable. Solo la implementación de una fórmula (ya sea una de las tres proporcionadas, una derivada de una de ellas o una fórmula completamente nueva) u otro método que brinde los resultados correctos en un período de tiempo razonable (sin codificación, por supuesto) ) esta permitido. Pensé en agregar un tiempo restringido para hacer cumplir esto, pero personalmente estoy en contra del tiempo restringido en combinación con el código de golf , por lo que no lo haré. Aún así, asegúrese de que su programa dé las respuestas, y si por algún motivo es demasiado lento para TIO, agregue algunas capturas de pantalla con la salida de su máquina local como verificación.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba:
Aquí los casos de prueba para en el rango (siéntase libre de usar los enlaces WolframAlpha anteriores para casos de prueba más grandes):
n=2
3674160
n=3
43252003274489856000
n=4
7401196841564901869874093974498574336000000000
n=5
282870942277741856536180333107150328293127731985672134721536000000000000000
n=6
157152858401024063281013959519483771508510790313968742344694684829502629887168573442107637760000000000000000000000000
n=7
19500551183731307835329126754019748794904992692043434567152132912323232706135469180065278712755853360682328551719137311299993600000000000000000000000000000000000
n=8
35173780923109452777509592367006557398539936328978098352427605879843998663990903628634874024098344287402504043608416113016679717941937308041012307368528117622006727311360000000000000000000000000000000000000000000000000
n=9
14170392390542612915246393916889970752732946384514830589276833655387444667609821068034079045039617216635075219765012566330942990302517903971787699783519265329288048603083134861573075573092224082416866010882486829056000000000000000000000000000000000000000000000000000000000000000
n=10
82983598512782362708769381780036344745129162094677382883567691311764021348095163778336143207042993152056079271030423741110902768732457008486832096777758106509177169197894747758859723340177608764906985646389382047319811227549112086753524742719830990076805422479380054016000000000000000000000000000000000000000000000000000000000000000000000000000000000
NOTA: Dado que este es un desafío de código de golf , básicamente se reduce a: implementar una de estas tres fórmulas (o una derivada / su propio método que aún produce los resultados correctos) lo más breve posible.
floor