Um Cubo de Rubik 3 × 3 × 3 padrão e resolvido possui 6 faces de cores diferentes, onde cada face é uma grade de quadrados 3 × 3 de uma cor. A face branca é oposta ao amarelo, o vermelho oposto a laranja, o azul oposto a verde e, quando o branco aponta para cima, o vermelho fica à esquerda do azul:
Imagine uma formiga sentada no quadrado central do rosto branco, de frente para o rosto vermelho. Você pode dar a ele 3 comandos:
- Avançar (
^
) - dê um passo na direção em que ele está voltado para o próximo quadrado da grade, passando por cima de uma borda do cubo, se necessário. - Direita (
>
) - gire para a direita (sentido horário) 90 °, permanecendo no mesmo quadrado da grade. - Esquerda (
<
) - gire para a esquerda (sentido anti-horário) 90 °, permanecendo no mesmo quadrado da grade.
Dada uma lista arbitrária de comandos, encontre as cores dos quadrados que a formiga visita (sem incluir o quadrado inicial branco).
Por exemplo, a sequência de comandos
^^>^^<^^^
tem um caminho parecido com este:As cores dos quadrados da grade visitados em ordem, sem contar o quadrado inicial, são
white red red green green green yellow
, ou sãowrrgggy
.
Escreva um programa ou função que capte uma sequência de caracteres de comando <^>
e imprima ou retorne uma sequência de caracteres wyrobg
(branco, amarelo, vermelho laranja, azul, verde) que corresponda ao caminho da formiga sobre o cubo.
O código mais curto em bytes vence. O desempatador é a resposta anterior.
Notas
- O cubo está no ar e a formiga possui pulvilos eficazes, para que ele possa atravessar todo o cubo.
- O cubo sempre permanece em seu estado resolvido.
- A cor de um quadrado é registrada somente após o movimento no quadrado, não na rotação. O quadrado branco inicial não deve ser gravado.
- Uma única nova linha à direita opcional pode estar presente na entrada e / ou saída.
Casos de teste
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
fonte
Respostas:
Perl,
156143134128127125120119117113109 bytesInclui +1 para
-p
Execute com a string de controle no STDIN, por exemplo
rubic.pl
:Explicação
Versão antiga:
O desafio desta pergunta é encontrar um sistema de coordenadas que facilite o rastreamento da posição e direção da formiga e ainda assim obter facilmente a identidade do rosto.
O sistema que escolhi foi colocar
(x,y)
coordenadas padrão na face em que a formiga está, de modo que a formiga esteja sempre voltada nay
direção negativa com o centro da face(0,0)
. Assim:Se
y
já era,-1
a formiga deixará a face atual e passará para a próxima. No novo sistema de coordenadas,x
mantém seu valor, masy'
passa a 1.Isso fornece um sistema de coordenadas fácil dentro de uma face. Eu também preciso de algo para os próprios rostos. Lá eu uso uma matriz que consiste em
Então a matriz inicial é
(g,b,o,y,r,w)
. Mover para a próxima face corresponde à rotação dos 4 últimos elementos, portanto, passar do branco para o vermelho faz isso(g,b,w,o,y,r)
. Virar à direita é uma permutação dos 5 primeiros elementos a dar(o,r,b,y,g,w)
. Virar à esquerda é uma permutação simular, mas também pode ser feito girando à direita 3 vezes, aplicando essa permutação 3 vezes. E não girar também pode ser feito aplicando a permutação 8 vezes. De fato, virar à direita também pode ser feito aplicando a permutação 5 vezes.Sabendo disso, o programa é bastante simples:
Portanto, para essa última declaração, as rotações levam à string vazia e os passos adiante levam à face atual. Portanto,
$_
é substituído pelos rostos visitados em cada etapa.fonte
@1
é um abuso incrível do que parece ser um recurso horrível da linguagem.use strict
. Obrigado pelo módulo 3 por sinal.Braquilog , 287 bytes
Espera que uma string contenha os movimentos como Entrada e nenhuma Saída, por exemplo
brachylog_main("^^>^^<^^^",_).
,wrrgggy
gravará em STDOUT.Explicação
Código SWI-Prolog equivalente
Se você não quiser se preocupar com o compilador do Brachylog, poderá executar esta solução no SWI-Prolog usando o seguinte código (é isso que é gerado pelo compilador do Brachylog):
fonte
PowerShell, 882 bytes
Uso
Salve o código em um script e chame-o assim na linha de comando. Supondo que o diretório de trabalho seja o diretório atual.
Código
Menos código de golfe com explicação
Utilizando muitas variáveis de letra única usadas para registrar o estado atual da formiga (cor, posição e orientação). A formiga está sempre voltada para cima. Quando uma instrução de rotação é lida, o cubo é transposto nessa direção. Matrizes de transposição codificadas permanentemente usadas para determinar a nova posição com base na posição atual.
O código satisfaz todos os exemplos em questão.
fonte
Tcl / Tk, 422 bytes
Infelizmente, não posso diminuí-lo. Versão não ofuscada:
Ele funciona mantendo uma lista de cores de células horizontais e verticais. ^ <e> são todos os comandos que permutam adequadamente as listas. A célula atual é a primeira em cada lista.
fonte
Ruby, 132
Infelizmente, esse sistema de posições é muito semelhante a outras respostas disponíveis.
x
ez
acompanhe sua posição na face atual,+x
sendo a direção da viagem. O avanço é semprex+=1
, e os limites de cada face são divisíveis por 3 (não nos importamos com o número, apenas seu módulo com 3).m
é a face atual (isso salva alguns bytes)g
é organizado[left, right, behind, opposite, front]
de modo que nós não precisamos de mudançag[0..1]
em^
<
é feito simplesmente fazendo>
três vezes.fonte
Java,
619605 bytesBem, aqui não vai nada ...
Pelo menos ele venceu o PowerShell!
-14 bytes graças a @KevinCruijssen
Explicação:
Ao contrário de algumas das outras respostas, que usavam um sistema de coordenadas 2-d, usei um sistema 3-d para rastrear onde a formiga estava.
A direção também foi mantida em 3-d para facilitar a troca de lados e o movimento.
Cada face tinha uma das coordenadas, x, y ou z, definida como 2 (ou -2 para a face oposta) para indicar qual era a face.
A troca de faces foi realizada verificando se a formiga estava prestes a disparar (posição e cabeçalho têm um valor igual, mas não 0), verifique se "cairia" na diagonal para a próxima e altere o cabeçalho para não ser -diagonal. Isso foi surpreendentemente fácil.
Virar era mais difícil. Certificar-se de que sempre seguisse a mesma direção exigia uma declaração if-else extra na verificação de cada caractere, custando-me muitos bytes. Além disso, os eixos "para cima" e "direito" precisavam ser codificados para cada lado.
Código ungolfed
(Inalterado da edição anterior para maior clareza no método)
fonte
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 byte); 2x'^'
->94
(-2 bytes); 3x==0
-><1
(-3 bytes); 2x==1
-><2
(-2 bytes); etc para==2
,==3
,==4
,==5
.