Sempre que você faz um movimento no Cubo de Rubik, há um movimento inverso que desfaz o primeiro movimento. Por esse motivo, todo algoritmo (conjunto de movimentos) possui um algoritmo reverso que desfaz o primeiro algoritmo.
O objetivo deste desafio é encontrar o inverso de um determinado algoritmo.
Especificação:
A entrada consiste em uma matriz de movimentos individuais. Cada movimento é uma sequência de comprimento 1 ou 2. É claro que você pode usar qualquer formato de entrada que faça mais sentido no seu idioma. Cada movimento consiste na estrutura X
ou X'
ou X2
, onde X
é uma letra maiúscula ou minúscula.
Para reverter X
, basta substituí-lo por X'
. Da mesma forma, X'
torna-se X
. X2
por outro lado, não é alterado.
Para criar a saída, inverta cada movimento e, em seguida, inverta a matriz.
Exemplos (cadeias separadas por espaços):
R
=> R'
D U'
=> U D'
S T A C K
=> K' C' A' T' S'
A2 B2
=> B2 A2
Pontuação:
Isso é código-golfe, então a menor quantidade de bytes ganha. Não são permitidas brechas padrão.
fonte
R2
->R2'
ouB
->B3
permitido?X3
ouX1
teria sido uma boa adição ao desafio.D2R2
como um caso de teste ...Respostas:
Python 2 ,
71575453 bytes-15 bytes graças a ovs! -3 bytes graças a Rod.
Experimente online!
E / S de sequência, 70 bytes
Experimente online!
fonte
V ,
1310 bytesExperimente online!
3 bytes salvos graças a @nmjmcman apontando meu recurso favorito. Explicação:
fonte
ä
representa um regex quando compilado no vim?:g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>
Mais informações sobre como o V comprime expressões regulares podem ser encontradas aquiRetina 0.8.2 ,
2726 bytesExperimente online! O link inclui casos de teste. Explicação: O primeiro estágio adiciona um apóstrofo após cada alfanumérico. Isso resulta em apóstrofos duplos (com ou sem um 2 inclusivo) que precisam ser removidos. A etapa final reverte os movimentos.
fonte
O$^
é na verdade ainda a melhor maneira de reverter uma lista de partidas, então a contagem de bytes é realmente inalterada na Retina 1.JavaScript (ES6), 45 bytes
A solução mais curta é usar o Array IO. Uso simples e apropriado da destruição de argumentos.
A saída da string é de +8 bytes para
.join` `
.Entrada de sequência, saída de matriz: 69 bytes
fonte
.reverse()
com::reverse
economia de 1 byte mas fazendo ES7Gelatina , 11 bytes
Um link monádico que retorna uma lista de listas de caracteres (uma "matriz" de "cadeias").
Experimente online! (O rodapé evita esmagar a saída, exibindo a lista dividida em espaços.)
Quão?
fonte
JavaScript (ES6), 46 bytes
Recebe entrada como uma matriz de movimentos.
Teste-o
Digite uma lista de movimentos separados por vírgula.
Explicação
Função anônima tomando a matriz de movimentos como argumento via parâmetro
a
.Mapeie a matriz, passando cada string por uma função, onde
m
está a string atual.Verifique se a sequência contém um segundo segundo caractere (
"'"
ou"2"
).Se tentar converter essa cadeia de caracteres em um número inteiro. Se a string é
"2"
, ela se torna2
verdadeira. Se a corda é"'"
, ela se tornaNaN
, o que é falsey.Se o teste anterior for verdadeiro, basta retornar
m
.Caso contrário, retorne o primeiro caractere de
m
.Se a sequência não contiver um segundo caractere, retorne
m
anexado com a'
.Inverta a matriz modificada.
fonte
Python ,
5148 bytesUma função sem nome, recebendo e retornando listas de strings.
Experimente online!
Inverte a lista de entrada com
a[::-1]
; anexa a'
a cada entrada comv+"'"
; chefia cada um com 1 ou 2 caracteres, dependendo do original ter'
ou não um[:2-("'"in v)]
.fonte
Python 3 ,
918972706965 bytesExperimente online! (Com caixas de teste)
Aparentemente, você não precisa receber entrada e saída como seqüências de caracteres, portanto, é possível uma solução de 69 bytes
fonte
len(i)==1
len(i)-2
é menor do quelen(i)==1
(lembre-0 é Falsey)Haskell , 43 bytes
Experimente online! Declara uma função anônima
map f.reverse
. Vinculeg
e use comog["S","T","A","C","K"]
.fonte
PHP , 81 bytes
Experimente online!
fonte
05AB1E , 13 bytes
Experimente online!
Explicação
fonte
J, 25 bytes
J lida bem com isso, além da infeliz sequência de escape necessária para representar uma única citação:
Precisamos representar a lista usando dados em caixa, pois é uma mistura de itens de um e dois caracteres, portanto:
&.>
- "em desmarcar", que significa desmarcar cada elemento, execute a operação a seguir (ou seja, os símbolos explicados abaixo) e, em seguida, reencaixe quando terminar(''''={:)
"se o segundo caractere for uma aspas simples" ....@.
(O verbo da agenda de J, um tipo de declaração ternária generalizada ou uma declaração de caso) "execute o segundo item na lista da agenda, caso contrário, execute o primeiro"}:
(o segundo item da lista da agenda), "remova o último caractere", ou seja, as aspas simples`(Verbo de ligação de J) Você pode pensar nisso como o separador de itens da agenda
,&''''
(primeiro item da lista da agenda) "adicione uma única citação ao final"|.
"marcha ré"Experimente online!
fonte
R , 51 bytes
Experimente online!
fonte
Ruby , 44 bytes
Experimente online!
fonte
Java 8,
141128126 bytesRecebe a entrada como única,
String
sem espaços (ieRUR'URU2R'U
).Explicação:
Experimente online.
Exemplo das etapas acima, com as seguintes entradas:
RUR'URU2R'U
RUR'URU2R'U
→R'U'R'''U'R'U'2'R'''U'
R'U'R'''U'R'U'2'R'''U'
→R'U'RU'R'U'2'RU'
R'U'RU'R'U'2'RU'
→'R'UR'U'R'U'2R'U
'R'UR'U'R'U'2R'U
→'R'UR'U'R2UR'U
'R'UR'U'R2UR'U
→U'RU2R'U'RU'R'
fonte