Uma sequência de movimentos é uma sequência de movimentos (voltas) no Cubo de Rubik (para a notação, veja abaixo). Além da sequência de movimentação vazia, há muitas outras seqüências de movimentação que não têm nenhum efeito no cubo. Chamamos essas seqüências de movimento de sequências de identidade.
Algumas dessas seqüências de identidade são óbvias para determinar, como U2 R R' U2
ou U D2 U' D2
. No primeiro, dois movimentos aleatórios são feitos U2 R
e depois desfeitos imediatamente R' U2
. O segundo é semelhante. Primeiros dois movimentos aleatórios U D2
e depois são desfeitos, mas em ordem inversa U' D2
. Isso só funciona, porque o movimento U
afeta apenas as partes da camada superior e o movimento D2
afeta apenas as partes da camada inferior. Você pode ver uma visualização dessas duas seqüências de movimento.
Outras sequências de identidade podem não ser óbvias. Por exemplo, a sequência R' U' R' F' U F U' R' F R F' U' R U2 R
. É bem longo, mas também não tem efeito no cubo.
Mover notação
Um movimento descreve a volta de uma camada de uma das seis faces do cubo. Um movimento consiste em uma letra representando a face seguida por um sufixo opcional representando o ângulo de virada.
As letras e suas faces correspondentes são U (Para cima - o lado voltado para cima), D (Para baixo - o lado voltado para baixo), R (Direita - lado voltado para a direita), L (Esquerda - lado voltado para a esquerda) , F (Frente - o lado voltado para você) e B (Traseira - o lado voltado para você).
Se não houver sufixo, o rosto será girado 90 graus no sentido horário, o sufixo '
significa, o rosto será girado 90 graus no sentido anti-horário e o sufixo 2
significa que o rosto será girado 180 graus no sentido horário.
Se você tiver algum problema com a notação, basta usar http://alg.cubing.net , onde você pode visualizar essas seqüências de movimento.
O desafio
Sua tarefa é escrever um programa que determine se uma sequência de movimentação é uma identidade ou não.
Você pode escrever um programa completo ou uma função. Ele deve receber uma sequência contendo uma sequência de movimentação (as movimentações são separadas por espaços) como entrada (via STDIN, argumento da linha de comandos, argumento de prompt ou função) e saída (via valor de retorno ou STDOUT) um valor booleano ou um número inteiro correspondente ( Verdadeiro - 1 - sequência de identidade / Falso - 0 - não sequência de identidade).
Se o sufixo '
criar problemas na sua linguagem de programação, você poderá usar um símbolo diferente, mas não no dígito. R F2 U3
não é permitido.
Este é um codegolf, portanto o código mais curto (em bytes) vence.
Casos de teste
"" -> 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
, você pode simplesmente converter o sufixo em um dígito.
R2 D2
.
That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
R F2 U3
?