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#
#^<<<<<<<<<<<<<#
################