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
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)
R F2 U3
?