Faça uma cobra encher qualquer labirinto (até ficar preso).
A cobra
A cobra começa em um determinado ponto de partida, apontando para o LESTE . Ele se move sempre tendo uma parede ou parte de seu corpo imediatamente à esquerda de sua cabeça (" seguidor de parede da regra da esquerda "), até ficar preso porque todas as quatro direções ao redor de sua cabeça estão ocupadas. (Nota: uma cobra presa pode não preencher todo o espaço acessível, mas esse não é o objetivo!)
O desafio
Escreva um programa ou função que aceite um labirinto como entrada na forma de um texto 2D:
- A entrada pode estar em qualquer formato razoável: por exemplo, uma lista de strings, uma única string com novas linhas, um arquivo.
- O labirinto possui paredes ("
#
"), espaços vazios ("") e exatamente um ponto de partida ("
o
"). Você pode optar por
- ou suponha que a primeira e a última linha e coluna sejam inteiramente paredes;
- ou assumir que toda entrada é considerada como tendo uma camada externa implícita de paredes
Você pode supor que o ponto inicial tenha uma parede (ou uma parede implícita) diretamente acima dela (NORTE) e que a cobra possa fazer um movimento inicial válido na direção LESTE ou SUL.
- Você pode supor que nenhum outro caractere esteja presente no texto (exceto novas linhas, se sua entrada precisar deles).
- Você pode assumir que todas as linhas têm o mesmo comprimento.
e imprime / retorna um "labirinto preenchido" como saída, com um instantâneo da cobra no momento em que ficou presa :
- O corpo da cobra é representado pelos caracteres
>v<^
apontando para onde seu próximo segmento é - O ponto de partida da cobra é sua direção no início ("
>
" a menos que tenha que virar imediatamente) ou umo
personagem (não precisa ser consistente) - O ponto final da cobra é um
o
personagem
Pontuação
Código habitual de golfe: o código mais curto vence
Exemplo
in:
#################################
# o #
# #
# ## ### ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ### ## #
# ## ##### ## #
# ## ##### ## #
# ## ### ## #
# ## ## #
# #
# #
#################################
out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^ ##>>>>>>v###o>>>>>v## vv#
#^^ ##>^ ##>>>>^## >v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##>^ ## ## >v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^ ##### v## vv#
#^^ ##^ ##### v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^<<<<<<<<<<<<<<<<## vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animado (para fins ilustrativos):
Edit: note que, em caso de dúvida, a cobra deve "manter a mão esquerda" na parede que já está, seguindo os cantos, sem pular para uma parede a 1 quarteirão de distância.
Agradeço a Jonathan Allan por mencioná-lo e a Draco18s pelo instantâneo explicativo acima.
Outros exemplos
in:
####################
# o# #
# ###
# #
# ## #
# ###
####################
out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^ v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
# o #####
# #####
# #
# ##
####################
out:
####################
# >>>>v#####
# v#####
# >>>>o#
# ##
####################
in:
################
#o #
# ########## #
# # # #
# # # #
# # # #
# # # # #
# # # #
# # # #
# # # #
# ############ #
# #
################
out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^# vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################
Respostas:
Carvão ,
9468 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Coloque a entrada em uma sequência. Isso pode ser evitado usando um formato de entrada menos conveniente.
Imprima a entrada sem mover o cursor e, em seguida, imprima
o
novamente, para que o cursor fique embaixo dela.Inicialize a direção atual.
Repita enquanto ainda houver um espaço livre em alguma direção.
Calcule se a cobra pode virar à esquerda ou se é forçada a virar à direita. O código
≦⊖θW¬⁼§KVθ ≦⊕θ
também funciona para isso na mesma contagem de bytes, embora seja considerado0
ativo, em vez de correto, portanto, o restante do código precisa ser adaptado.Emita o caractere do corpo apropriado na direção apropriada.
Restaure a cabeça. Isso também pode ser escrito como
Po
imprimir a cabeça sem mover o cursor a cada passagem pelo loop (mas isso permite que o loop seja implicitamente fechado para a mesma contagem de bytes).fonte
Python 2 ,
273253242 bytes-11 bytes graças ao ArBo
Experimente online!
Isso funciona pesquisando a string
'o '
e substituindo-a por'[>v<^]o'
, se estiver no labirinto.A mesma verificação também será feita no labirinto girado, imprimindo o labirinto preenchido quando a sequência não estiver mais lá.
A função
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
é usada para girar a gradefonte
Geléia ,
7256 bytesExperimente online!
Um programa completo que recebe a entrada como uma lista de cadeias e retorna uma lista de cadeias com a cobra final. Observe que o rodapé no TIO converte uma única sequência separada de nova linha na entrada desejada e restaura as novas linhas no final; isso é apenas por conveniência.
Solução um pouco inspirada no método usado pela resposta do @ Rod's Python 2 , embora a implementação seja muito diferente.
fonte
Rubi ,
126118 bytes-8 bytes salvos abusando em
+=
vez de procurar manualmenteo
novamente após reposicioná-lo.Experimente online!
fonte
Consulta T-SQL 2008,
373371366 bytesEu tinha uma lista de prioridades, sempre deslize para a esquerda, reta, direita. Mudei essa prioridade para sempre deslizar para trás, esquerda, reta, direita. O deslizar para trás sempre será bloqueado, portanto a prioridade ainda é a mesma, exceto o primeiro deslizamento. Ao abaixar a cobra inicialmente (C = 4), ela tenta deslizar para cima quando desliza para trás. Esse pequeno golpe me salvou 2 bytes. Porque eu não precisei adicionar 1 a ~ - ~ -c% 4.
Inseri duas quebras de linha para torná-lo legível
Eu tive que fazer alguns pequenos ajustes para executar isso online, a versão postada é executada no estúdio de gerenciamento do servidor MS-SQL.
Pressione Ctrl-T antes de executar no estúdio de gerenciamento do servidor MS-SQL; isso mostrará o resultado como texto.
Experimente online
fonte
Python 3 , 343 bytes
Experimente online!
-11 bytes graças ao ArBo
-4 bytes graças a Jonathan Frech
fonte
X
,Y
eF
paraX=0,1,0,-1;F,*Y=*X,0
, se não estou enganado. Além disso,import*
custa mais bytes do que economiza.*g,=map(...)
. Esys.stdin.readlines()
funciona talvez?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
,if g[r-X[L]][c-Y[L]]>" "
Em conformidade.05AB1E ,
5452 bytesE / S como uma única sequência de várias linhas.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Pitão , 161 bytes
Experimente online!
Porto da solução Python 3 do HyperNeutrino . Agora que terminei, estou pensando que talvez eu devesse ter portado a solução Python 2 do Rod, mas já gastei muito tempo nisso.
fonte