As cobras ficam assim:
>>>v
@ ^ v
^ >>>^ v
^ v
^<<<<<<<<<
A cobra pode cruzar-se como neste caso:
@
^
>^>v
^<<
Para que um cruzamento seja válido, os caracteres de ambos os lados devem estar se movendo na mesma direção. O caso de
@
>^v
^<
pode ser considerado pouco claro e inválido.
A saída é uma sequência de WASD
representações que vão da cabeça à cauda ( @
).
Dada uma cobra que não retrocede e não é ambígua, você pode escrever um programa que produza a sequência de movimentos que a cobra realiza?
Isso é código-golfe, então a resposta mais curta ganha!
Casos de teste:
(Nota: @
pode ser substituído por qualquer caractere que não esteja v^<>
)
Entrada:
>>>>v
v
v<< @
v ^
>>>>>^
Resultado: ddddssaassdddddww
Entrada:
@>>v
^ v
^ v
^<<<
Resultado: dddsssaaawww
Entrada:
>>>v
v @
v ^
>>>>v ^
>>>>^
Resultado: dddsssddddsddddwww
Entrada:
@<< v
^ v
v<^<<
v ^
>>^
Resultado: ssaaaassddwwwwaa
Entrada:
@v<v
^v^v
^v^<
^<
Resultado: ssawwasssawww
Respostas:
Java,
626539536529 bytes-87 bytes, salvando alguns em muitos lugares. Obrigado ao Sr. Public por apontar alguns.
-3 bytes porque não consigo remover todos os espaços na primeira tentativa (obrigado mbomb007)
+8 bytes para corrigir neste caso:
-15 bytes por declaração de variável com carregamento antecipado
Versão legível:
Toma uma corda como
v @\n>>>^
. Cria um caminho que começa em cada coordenada e depois retorna o mais longo. A orientação necessária para os caminhos sobrepostos foi a parte mais difícil.fonte
Ruby, 217
Isso começa no
@
e caminha para trás, procurando vizinhos que apontam para a posição atual (z
). Para escolher o caminho certo nos cruzamentos de quatro direções, favorece os vizinhos que apontam na mesma direção (max_by{...}
). Se nenhum vizinho imediato for encontrado, ele assume que deve ter havido um cruzamento e alcança um nível de cada vez até encontrar um (until n
ec+=1
). Esse processo se repete para o número de segmentos do corpo (sem incluir a cabeça) (.scan(/\w/){...}
).O caso de teste que eu adicionei ao quebra-cabeça continuou me atrapalhando, então fui do 182 para 218. Esses caracteres extras estavam todos assegurando que meus movimentos horizontais não fossem para as próximas linhas / anteriores. Gostaria de saber se posso lidar com isso de uma maneira melhor.
Ungolfed:
fonte