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
fonte
R F2 U3
?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)
Respostas:
Haskell,
263261247243 caracteresAlgoritmo bastante direto; cada cubeta é feita de 1,2,4 ou 8 pedaços que codificam sua posição e orientação; 4 pedaços por cubeta de borda, 8 por cubeta de canto, 7 cubelets são estacionários.
c
c hompa cada palavra da entrada em uma sequência de curvas CW e!
envia cada parte de acordo com uma curva.i
é o i posição dentidade.f
é o principal f unção.Não estou muito feliz com a
c
função homp, mas também não consigo encontrar uma maneira de reduzi-la (@Nimi, no entanto)fonte
c(x:"2")=[x,x]
ec(x:_)=[x,x,x]
. Salva 2 bytes.i=sequence[s,s,s]
e alterar todas as tuplas para listas (ou seja:(x,y,z)
torna - se[x,y,z]
), ele salvará ~ 9 caracteres. Inlining, economiza mais 4. Largando o_
caso de!
salva outra 11.i
, obrigado. Não sabe ao certo o que você quer dizer com inliningi
- observe que ele aparece duas vezes na definição def
. Não sei ao certo o que você quer dizer com retirar a_
caixa - deixar_->a
completamente de fora ou movê-lo para o topo gera uma exceção de padrão não exaustiva, e movê-lo para o topo não salva nenhum caractere. Eu consegui salvar 5 caracteres lá, no entanto.Cubicamente ,
64 bytesEu ganho: P
O bloco de notas é inicializado em zero. A oitava "face" contém 1 se o cubo não for resolvido e 0 caso contrário.
Experimente online!
fonte
J -
232, 220, 381, 315296 bytesEssa solução codifica todas as operações como permutações de face e funciona com base no fato de que todas as torções de face são realmente as mesmas, sob uma rotação de todo o cubo.
Edit : um pouco mais de golfe
Além das tentativas anteriores, isso não ter rotação canto em conta.
f
é apenas uma função auxiliar.r
faz a rotação de uma face. um rosto é codificado da seguinte maneira:essa ordem facilita a codificação de rotações e torções.
t
é um advérbio que torce a face sob uma determinada rotação do cubo, selecionando a face.X
eY
são advérbios que tomam como argumento esquerdo o número nessa direção de todo o cubo.A próxima linha define todas as rotações: 3 caracteres por rotação: o nome, o número de rotações e a direção.
A última linha define o verbo de teste
T
, convertendo 3 e'
para notação Power, invertendo a ordem de operação anexando o vetor de teste e, finalmente, extraindo a coisa toda.Mais detalhes mediante solicitação.
fonte
Python 3: 280 caracteres
Este não é um participante do desafio. Em primeiro lugar, porque eu próprio o desafio e, em segundo lugar, porque não é o meu código. Todos os créditos pertencem a Stefan Pochmann , que descobriu essa maneira impressionante de simular um cubo de Rubik. Eu só pratiquei golfe e algumas pequenas mudanças em relação ao desafio.
A idéia por trás disso é a seguinte.
s
representa a localização das peças deUF
,UR
e assim por diante. Por exemplo:s = ['DF', 'BL', ...]
significa que a peçaUF
está na posiçãoDF
, a peçaUR
está na posiçãoBL
, ...Como a posição de uma peça muda, ao fazer um movimento. Se você fizer uma
U
-move, todos os carros (cores) daU
-layer, que enfrentou a face frontal, movimento para a face esquerda. Os adesivos da face esquerda movem-se para trás, para a direita e para a frente. Codificado porFLBR
. Alguns exemplos:UF
move paraUL
,UFR
move paraULF
e assim por diante. Portanto, aplicar um movimento é simplesmente traduzir as faces das peças na camada correspondente.fonte