Isenção de responsabilidade: a história contada nesta pergunta é inteiramente fictícia e inventada apenas com o objetivo de fornecer uma introdução.
Meu chefe comprou um novo robô de brinquedo e quer que eu ajude a programá-lo. Ele deseja inserir instruções simples de flecha para que ela se mova. Estas instruções são: ^ (para avançar) <(para virar à esquerda) e> (para virar à direita). No entanto, agora que programei o robô, ele deseja funcionalidades adicionais. Ele quer que eu transforme qualquer sequência de setas que ele insere, para que, em vez de fazer com que o robô siga o caminho indicado, ele se mova para o local desejado, indicado pelo local em que terminaria se seguisse o caminho inserido com a mesma eficiência. possível. Peço a vocês, membros do PP&CG, que me ajudem nessa tarefa.
Sua tarefa:
Escreva um programa ou função para converter uma sequência composta por setas em uma sequência que chegue ao local indicado pela entrada o mais rápido possível. Virar leva exatamente o tempo que se move para trás ou para frente.
Entrada:
Uma sequência de setas, como indicado acima. Se desejar, caracteres diferentes podem ser substituídos pelas setas, mas certifique-se de incluir o fato de fazê-lo em sua resposta. Todos os casos de teste usam as setas normalmente.
Saída:
Uma sequência de setas (ou caracteres equivalentes) que levam o robô ao destino desejado da maneira mais eficiente possível.
Casos de teste:
Observe que as soluções oferecidas são apenas possibilidades e que outras soluções podem ser válidas.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Pontuação:
A memória do robô é limitada, portanto, seu programa deve ter a menor contagem de bytes possível.
fonte
^<^^<^^<^^^^
->>^^>^
?Respostas:
Retina ,
1037471 bytesExperimente online! O link inclui casos de teste. Explicação:
Vire à esquerda e vire à direita em triplo
Reduza todas as voltas no módulo 4.
Cancele os movimentos em direções opostas.
Vire uma volta tripla à direita novamente para a esquerda. Isso também lida com o caso do
>>^>^
qual precisa se tornar<^<^
.Exclua curvas desnecessárias à direita.
fonte
Mathematica, 135 bytes
Leva um
List
das strings como entrada.Explicação
Defina
j
como 0 e definai
como 1.Para cada caractere na entrada ...
Se o personagem for
>
, multipliquei
pela unidade imaginária. Se o personagem for>
, dividai
pela unidade imaginária. Se o personagem for^
, adicionei
aj
.Pegue as partes reais e imaginárias de
j
. Isso fornece a coordenada cartesiana do robô.Aplique o seguinte a este resultado:
Conjunto
a
como uma função que gera uma sequência com(input)
ou0
caractere^
s, o que for maior.Um
List
composto por ...a
aplicado à primeira entrada (parte real dej
)Se a segunda entrada (parte imaginária
j
) é maior do que0
,>
. De outra forma,<
,. Definas
para o caractere resultante.a
aplicado ao valor absoluto da segunda entrada.Se a primeira entrada for menor que 0,
s
,. Caso contrário, sequência vazia.Aplique
a
aos tempos de entrada negativos.Junte as cordas.
fonte
Mathematica 119 Bytes
A posição final de JungHwan para o código do caminho era mais curta que a minha, então, usando isso. Eu acho que provavelmente existe uma maneira ainda mais curta de fazer isso ...
Eu uso a
AnglePath
função interna para decidir a posição final. Também defino os símbolos L, F e R para "<", "^" e ">", para salvar alguns caracteres de aspas.Uso:
Saída:
fonte
Ruby , 130 bytes
Como funciona
Experimente online!
fonte
J, 90 bytes
solução
explicação
há um truque interessante usando números complexos (multiplicar por i é uma rotação esquerda de 90 graus e -i fornece uma correta).
então tomamos nossa entrada como números complexos: um 1 representa "avançar" e i / -i representa curvas à esquerda e à direita.
a posição final é calculada sem esforço com essa representação. Observe que esta é a primeira parte (mais à direita) da minha expressão final acima:
Essa pequena linha acima é o que resolve o problema. Tudo o resto é apenas descobrir como formatar a resposta e certamente poderia ser significativamente mais eficiente.
Para entender a linha curta acima, observe que
*/\
(a varredura de produtos parciais) fornece uma lista das posições que você está enfrentando em cada índice da entrada: i é norte, 1 e -1 são leste e oeste e -i é sul . Mas desde que começamos a olhar para o norte, temos que multiplicar todos aqueles por i que, em J, é representado porj.
(mastigue essa frase por um momento).Nós só realmente "move" quando a entrada original é 1, para que em seguida, multiplicar esse resultado elemento a elemento pela matriz booleano que é 1, onde a entrada original é 1 e 0 caso contrário:
=&1*
. O resultado dessa multiplicação é uma matriz de "etapas direcionais". Nossa posição final é simplesmente a soma dessas etapas:+/
teste
Infelizmente, não consigo fazer isso funcionar no TIO por algum motivo, mas colar o seguinte no console J verificará se ele funciona:
fonte
C # (.NET Core) , 349 bytes
Experimente online!
Pega uma string como entrada e gera o caminho mais curto que a entrada seguiria.
Ungolfed & Commented
fonte
JavaScript (Node.js) , 187 bytes
Experimente online!
Versão golfada com espaço em branco
-14 bytes por @Neil
Ungolfed:
fonte
t&3
em vez det%4
por que funciona com o negativot
de modo que você pode remover os4+
e os()
s.(x?"":t)+t
pode ser gravado(x?t:t+t)
para economizar 1 byte. O código de mudança de direção parece muito longo. Também acho que você provavelmente deveria substituirindexOf
eMath.abs
com comparações.indexOf
por uma comparação?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 bytesEdite 1: -5 bytes, permitindo que a direção esteja fora do intervalo de 0 a 3 e removendo o espaço em branco.
Edite 2: -4 bytes alterando a entrada para (1, 2, 3) em vez de (<, ^,>) desde que o OP o permitia, bem como alterando meu sistema de coordenadas para reduzir meu cálculo de distância.
Experimente online!
Determina as coordenadas finais através dos valores do dicionário que estão sendo executados e, em seguida, apenas imprime o caminho direto para a meta final.
fonte
Perl 5 , 185 + 1 (-p) = 186 bytes
Experimente online!
fonte
JavaScript (tipo document.getElementById ()), 343 caracteres
expandido:
}
Uso:
alertas:
>^^>^
Um robô com reverso teria sido útil.
fonte