Una secuencia de movimiento es una secuencia de movimientos (giros) en un Cubo de Rubik (para la notación, mira abajo). Además de la secuencia de movimiento vacía, hay muchas otras secuencias de movimiento que no tienen ningún efecto en el cubo. Llamamos a estas secuencias de movimiento secuencias de identidad.
Es obvio determinar algunas de estas secuencias de identidad, como U2 R R' U2
o U D2 U' D2
. En el primero, se realizan dos movimientos aleatorios U2 R
y luego se deshacen inmediatamente R' U2
. El segundo es similar. Los primeros dos movimientos aleatorios U D2
y luego se deshacen, pero en orden inverso U' D2
. Esto solo funciona, porque el movimiento U
afecta solo a las piezas de la capa superior y el movimiento D2
solo afecta a las piezas de la capa inferior. Puede ver una visualización de estas dos secuencias de movimiento.
Otras secuencias de identidad pueden no ser obvias en absoluto. Por ejemplo la secuencia R' U' R' F' U F U' R' F R F' U' R U2 R
. Es bastante largo, pero tampoco tiene ningún efecto en el cubo.
Mover notación
Un movimiento describe el giro de una capa de una de las seis caras del cubo. Un movimiento consiste en una letra que representa la cara seguida de un sufijo opcional que representa el ángulo de giro.
Las letras y sus caras correspondientes son U (arriba - el lado hacia arriba), D (abajo - el lado hacia abajo), R (derecha - el lado hacia la derecha), L (izquierda - el lado hacia la izquierda) , F (Delantero - el lado hacia usted) y B (Atrás - el lado hacia afuera).
Si no hay sufijo, la cara se gira 90 grados en sentido horario, el sufijo '
significa que la cara se gira 90 grados en sentido antihorario y el sufijo 2
significa que la cara se gira 180 grados en sentido horario.
Si tiene algún problema con la notación, solo use http://alg.cubing.net , donde puede visualizar tales secuencias de movimiento.
El reto
Su tarea es escribir un programa, que determina si una secuencia de movimiento es una identidad o no.
Puede escribir un programa completo o una función. Debería recibir una cadena que contenga una secuencia de movimiento (los movimientos están separados por espacios) como entrada (a través de STDIN, argumento de línea de comandos, argumento de solicitud o función) y salida (a través del valor de retorno o STDOUT) un valor booleano o un entero correspondiente ( Verdadero - 1 - secuencia de identidad / Falso - 0 - no secuencia de identidad).
Si el sufijo '
crea problemas en su lenguaje de programación, puede usar un símbolo diferente, pero no en el dígito. R F2 U3
No se permite.
Este es codegolf, por lo tanto, el código más corto (en bytes) gana.
Casos de prueba
"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False
fuente
R F2 U3
?U3
, podrías simplemente convertir el sufijo en un dígito.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Respuestas:
Haskell,
263261247243 caracteresAlgoritmo bastante sencillo; cada cubelet está hecho de 1,2,4 u 8 trozos que codifican su posición y orientación; 4 trozos por cubelet de borde, 8 por cubelet de esquina, 7 cubelets son estacionarios.
c
c recoge cada palabra de la entrada en una secuencia de turnos CW y!
envía cada fragmento de acuerdo con un turno.i
es la i posición dentity.f
es la principal f unción.No estoy muy contento con la
c
función homp, pero tampoco puedo encontrar una manera de acortarla (@Nimi lo hizo, sin embargo)fuente
c(x:"2")=[x,x]
yc(x:_)=[x,x,x]
. Guarda 2 bytes.i=sequence[s,s,s]
y cambia todas las tuplas a listas (es decir, se(x,y,z)
convierte en[x,y,z]
), ahorrará ~ 9 caracteres. En línea ahorra 4 más. Al dejar el_
caso, se!
salvan otros 11.i
, gracias. No estoy seguro de lo que quiere decir con líneai
: tenga en cuenta que aparece dos veces en la definición def
. No estoy seguro de lo que quieres decir con dejar el_
estuche: dejarlo_->a
completamente o moverlo a la parte superior produce una excepción de patrón no exhaustiva, y moverlo a la parte superior no guarda ningún personaje de todos modos. Sin embargo, logré guardar 5 caracteres allí.Cúbicamente ,
64 bytesYo gano: P
El bloc de notas se inicializa a cero. La octava "cara" contiene 1 si el cubo no está resuelto y 0 en caso contrario.
Pruébalo en línea!
fuente
J -
232, 220, 381, 315296 bytesEsta solución codifica todas las operaciones como permutaciones de caras y funciona en función del hecho de que todos los giros de caras son realmente iguales, bajo una rotación de todo el cubo.
Editar : un poco más de golf
Aparte de los intentos anteriores, esto tiene en cuenta la rotación de esquinas.
f
es solo una función auxiliar.r
Hace la rotación de una cara. una cara se codifica de la siguiente manera:Este orden facilita la codificación de rotaciones y giros.
t
es un adverbio que tuerce la cara bajo una cierta rotación de cubo, seleccionando la cara.X
yY
son adverbios que toman como argumento izquierdo el número de en esa dirección de todo el cubo.La siguiente línea define todas las rotaciones: 3 caracteres por rotación: el nombre, el número de rotaciones y la dirección.
La última línea define el verbo de prueba
T
, convirtiendo 3 y'
en notación de potencia, cambiando el orden de operación agregando el vector de prueba y finalmente excitando todo.Más detalles a petición.
fuente
Python 3: 280 caracteres
Este no es un participante en el desafío. Primero porque hice el desafío yo mismo y segundo porque no es mi código. Todos los créditos pertenecen a Stefan Pochmann , quien descubrió esta increíble forma de simular un Cubo de Rubik. Solo practiqué golf y algunos cambios menores con respecto al desafío.
La idea detrás de esto es la siguiente.
s
representa la ubicación de las piezas deUF
,UR
y así sucesivamente. Por ejemplo:s = ['DF', 'BL', ...]
significa que la piezaUF
está en la posiciónDF
, la piezaUR
está en la posiciónBL
, ...¿Cómo cambia la posición de una pieza al hacer un movimiento? Si hace un
U
movimiento, todas las pegatinas (colores) de laU
capa, que miraban hacia la cara frontal, se mueven hacia la cara izquierda. Las pegatinas de la cara izquierda se mueven hacia atrás, estas hacia la derecha y estas hacia la cara frontal. Codificada porFLBR
. Algunos ejemplos: seUF
mueve aUL
, seUFR
mueve a,ULF
etc. Por lo tanto, aplicar un movimiento es simplemente traducir las caras de las piezas en la capa correspondiente.fuente