Haz que una serpiente llene cualquier laberinto (hasta que se atasque).
La serpiente
La serpiente comienza en un punto de partida dado, apuntando hacia el ESTE . Se mueve siempre teniendo una pared o una parte de su cuerpo inmediatamente a la IZQUIERDA de su cabeza (" seguidor de la pared de la regla izquierda "), hasta que se atasca porque las cuatro direcciones alrededor de su cabeza están ocupadas. (Nota: una serpiente atascada no puede llenar todo el espacio accesible, ¡pero ese no es el objetivo!)
El reto
Escriba un programa o función que acepte un laberinto como entrada en forma de texto 2D:
- La entrada puede estar en cualquier formato razonable: por ejemplo, una lista de cadenas, una sola cadena con líneas nuevas, un archivo.
- El laberinto tiene paredes ("
#
"), espacios vacíos ("") y exactamente un punto de partida ("
o
"). Puedes elegir
- supongamos que la primera y la última fila y columna son completamente paredes;
- o suponga que cada entrada se considera que tiene una capa externa implícita de paredes
Puede suponer que el punto de partida tiene un muro (o un muro implícito) directamente encima (NORTE) y que la serpiente puede hacer un movimiento inicial válido en la dirección ESTE o SUR.
- Puede suponer que no hay otros caracteres presentes en el texto (excepto las nuevas líneas si su entrada los necesita).
- Puede suponer que todas las líneas tienen la misma longitud.
e imprime / devuelve un "laberinto lleno" como salida, con una instantánea de la serpiente en el momento en que se atascó :
- El cuerpo de la serpiente está representado por los caracteres que
>v<^
apuntan hacia dónde está su próximo segmento - El punto de partida de la serpiente es su dirección al inicio ("
>
" a menos que tenga que girar de inmediato) o uno
personaje (no es necesario ser coherente) - El punto final de la serpiente es un
o
personaje.
Tanteo
Código de golf habitual: gana el código más corto
Ejemplo
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#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animada (con fines ilustrativos):
Editar: tenga en cuenta que, en caso de duda, la serpiente debe "mantener su mano izquierda" en la pared en la que ya está, siguiendo las esquinas, sin saltar a una pared a 1 cuadra de distancia.
Gracias Jonathan Allan por mencionarlo, y Draco18s por la instantánea explicativa anterior.
Otros ejemplos
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#
#^<<<<<<<<<<<<<#
################