Podemos representar un cubo de Rubik como una red de la siguiente manera (cuando se resuelve):
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
Cada letra representa el color correspondiente ( W
es blanco, G
verde , etc.)
Se ha demostrado que hay exactamente (~ quintillones) diferentes permutaciones en las que puede estar un cubo de Rubik.
Su tarea es tomar un número entero entre y y generar la permutación correspondiente, de la manera que se muestra arriba. Puede elegir cómo se ordenan las permutaciones, pero se debe mostrar el algoritmo que utiliza para generar una permutación única y correcta para cada entrada posible.
Reglas de permutación no válidas
Tomado de esta página
Para empezar, el centro de cada cara de 3x3 debe permanecer igual, ya que el cuadrado central en un Cubo de Rubik no se puede girar. Se puede rotar todo el cubo, cambiando donde parece estar una cara, pero esto no afecta la red del cubo.
Si decimos que cada permutación tiene una paridad, basada en la paridad del número de permutas para alcanzar esa permutación, podemos decir
Cada pieza de esquina tiene tres orientaciones posibles. Se puede orientar correctamente (0), en sentido horario (1) o en sentido antihorario (2). La suma de las orientaciones de las esquinas siempre es divisible por 3.
Cada rotación legal en el Cubo de Rubik siempre voltea un número par de aristas, por lo que no puede haber una sola pieza orientada incorrectamente.
Teniendo en cuenta la permutación de todas las esquinas y bordes, la paridad general debe ser uniforme, lo que significa que cada movimiento legal siempre realiza el equivalente de un número par de intercambios (ignorando la orientación)
Por ejemplo, las siguientes tres redes son salidas no válidas:
WWW
WWW
WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
YYY
YYY
YYY
(Too many whites/not enough reds)
WRW
WRW
WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
YYY
GGY
YYY
(There are two red/green center squares and no white/yellow center squares.
In all valid permutations, the center squares are all different colours)
WWW
WWW
WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
YYY
YYY
YYB
(The yellow/orange/blue corner is rotated into an impossible permutation)
Reglas
- Debes demostrar, como quieras, que el algoritmo es válido. No tiene que enumerar cada permutación, siempre que demuestre la validez de su algoritmo.
- Usted debe incluir algún tipo de prueba de la validez de su respuesta. Esta prueba puede probar la validez en cualquier método de prueba aceptado, excepto para enumerar todas las posibilidades.
- Puede optar por utilizar un método de entrada alternativo si lo desea, siempre que:
- La entrada está limitada
- Cada entrada corresponde a una salida única
- Explica claramente el formato de entrada y cómo corresponde a cada salida
- Puede cambiar los caracteres utilizados para usar 6 caracteres ASCII diferentes, entre 33 (
!
) y 126 (~
), en lugar deWGRBOY
- Puede imprimir de la forma que desee, siempre que forme una representación clara de un cubo en el que se puedan mostrar las 6 caras, incluida una red de cubos válida, una sola cadena forrada o una representación 3D. Si no está seguro acerca de un formato específico, no dude en preguntar en los comentarios.
Este es un código de golf, por lo que gana el código más corto, en bytes, en cada idioma.
Ejemplo de salidas válidas
YYY
YYY
YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
WWW
WWW
WWW
(The `W` and `Y` faces have been swapped)
ZZZ
+++
+}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
7bb
[7Z
[7Z
(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
Then, the moves L, R, U and F' have been applied, in that order.
Notice that each centre square is different, and corresponds to the same colour as in the mapping)
fuente
Respuestas:
Carbón ,
334297 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese el entero en la variable
q
.Divide
q
por 3⁷, poniendo el resto adentroe
. Luego, considerándoloe
como un número en la base 3, sufije un dígito parae
que sus dígitos (en la base 3) sumen un múltiplo de 3. Esto permitee
definir las rotaciones de las esquinas.Divide
q
por 8 !, poniendo el resto adentroz
. (8! Se almacena temporalmented
para guardar un byte). Esto permitez
definir las posiciones de las esquinas.Divide
q
por 2¹¹, poniendo el resto adentroh
. Luego, considerandoh
como un número en la base 2, sufije un dígito parah
que sus dígitos (en la base 2) sumen un múltiplo de 2. Esto permiteh
definir los volteos de los bordes.Pase sobre una representación de cadena de los centros.
Salte a la posición de cada centro e imprímalo.
Mantenga un registro de la paridad de las posiciones de las esquinas en variable
w
.Crea una variedad de posiciones de esquina.
Crea una variedad de colores de esquina.
Haga un bucle dos veces, una vez para las esquinas, una vez para los bordes, en lo sucesivo denominados "cubos".
Pase sobre la matriz de colores del cubo.
Extraiga la siguiente posición del cubo
z
, actualizando la paridad enw
. Use esta paridad para el último pero un borde. Esto asegura que la suma de paridad de los bordes y esquinas sea uniforme.Imprima el cubo en esa posición, ajustado para la siguiente rotación o voltee según corresponda.
Retire la rotación o voltee de
e
.Crea una variedad de posiciones de borde. Esto se usará la segunda vez a través del ciclo.
Crea una variedad de colores de borde.
Sobrescribir las variables de esquina
z
ye
con las variables de borde correspondienteq
yh
para que los bordes se permutan y se volcó durante la segunda pasada del bucle.fuente
Rubí ,
570408 bytesPruébalo en línea!
Versión original, con matrices de números mágicos en lugar de cuerdas mágicas
Pruébalo en línea!
Una función anónima que en su forma actual toma una entrada de dos enteros, que parece estar permitida: "puede elegir un método de entrada alternativo". La primera es la permutación en el rango de 0 a
12!*8!/2 - 1
y la segunda es la orientación de las piezas en el rango de 0 a2**11 * 3*7 - 1
. La salida en el estado resuelto es la siguiente cadena:Golf adicional
Hay aproximadamente 10 caracteres más para guardar ajustando el formato de salida a la siguiente forma. Pero esto reduciría la legibilidad, por lo que no lo haré en este momento
Explicación
Permutación
Internamente, el estado resuelto está representado por la serie de números octales en la matriz
a
. La entradag
se divide por los números12..1
con el módulo que se utiliza para seleccionar y eliminar un bordea
y colocarloz
. Una vez hecho esto, solo quedan las esquinasa
, por lo queg
se divide por los números8..1
con el módulo que se utiliza para quitar una esquinaa
y colocarlaz
.Como no hay información suficiente para determinar el orden de las dos últimas esquinas, el valor de
g
se habrá dividido a cero en el momento en que las alcance, por lo que siempre se agregaránz
en el orden original. Luego se realiza una verificación para determinar si la permutación general es par o impar, y si es necesario, se intercambian las dos últimas esquinas para hacer que la permutación sea pareja.Orientación
Hay varias formas diferentes de decidir si una esquina o borde está en la orientación correcta si no está en su ubicación resuelta. Para el propósito de esta respuesta, una esquina se considera en su orientación correcta si se muestra
0
o1
en la cara superior o inferior. Por lo tanto, girar la cara superior o inferior no cambia la orientación de la esquina. Girar las otras caras cambia la orientación, pero de tal manera que la suma de paridad general permanece sin cambios. Los bordes se consideran en la orientación correcta si muestran a2
o4
al frente / atrás o a3
o5
hacia la izquierda / derecha. Esto significa que la rotación de la parte superior o inferior en un cuarto de vuelta voltea los cuatro bordes, pero la rotación de las otras caras deja el estado de cambio sin cambios.La entrada contiene información explícita para todos menos el primer borde y la última esquina. Se
h%2048
suman los 11 bits menos significativos y se usa el módulo para determinar la orientación del primer borde.h
se multiplica por 2 agregándolo a sí mismo y el valor para la orientación del primer borde se agrega como el bit menos significativo. La orientación de la última esquina se encuentra restando progresivamente la orientación de las otras esquinasj
. Para la última esquina (dondei/19
=1
)j%3
se agrega el valor deh
(que se habrá reducido a cero) y esto determina la orientación de la última esquina.La cadena
b
viene preinicializada con el texto para los centros de las caras.h
se divide por2
doce veces y luego por3
ocho veces, y los módulos se utilizan para determinar la orientación de las piezas. En cada caso, el númeroz
se convierte en una cadena con el número apropiado de dígitos (2 o 3) y la cadena se duplica. Esto permite que la rotación correcta de los dígitos que encuentra el módulo se extraiga de la cadena mediante indexación y se agregue ab
Monitor
Finalmente, las etiquetas en bruto se copian
b
en un formato más legible para los humanos als
usar los números mágicos en la tabla de índice.fuente