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#
#^<<<<<<<<<<<<<#
################
Respuestas:
Carbón ,
9468 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Sorba la entrada en una cadena. Esto podría evitarse utilizando un formato de entrada menos conveniente.
Imprima la entrada sin mover el cursor, y luego imprima hacia arriba
o
nuevamente, de modo que el cursor termine debajo de ella.Inicializa la dirección actual.
Repita mientras todavía haya un espacio libre en alguna dirección.
Calcule si la serpiente puede girar a la izquierda o si se ve obligada a girar a la derecha. El código
≦⊖θW¬⁼§KVθ ≦⊕θ
también funciona para esto para el mismo número de bytes, aunque se considera0
como arriba en lugar de correcto, por lo que el resto del código debe adaptarse.Salida del carácter del cuerpo apropiado en la dirección adecuada.
Restaurar la cabeza. Esto también se puede escribir como
Po
que imprime la cabeza sin mover el cursor cada vez que pasa por el bucle (pero esto permite que el bucle se cierre implícitamente para el mismo recuento de bytes).fuente
Python 2 ,
273253242 bytes-11 bytes gracias a ArBo
Pruébalo en línea!
Esto funciona buscando la cadena
'o '
y reemplazándola por'[>v<^]o'
, si está en el laberinto.La misma comprobación también se realizará en el laberinto girado, imprimiendo el laberinto lleno cuando la cadena ya no esté allí.
La función
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
se usa para rotar la cuadrículafuente
Jalea ,
7256 bytesPruébalo en línea!
Un programa completo que toma la entrada como una lista de cadenas y devuelve una lista de cadenas con la serpiente final. Tenga en cuenta que el pie de página en TIO convierte una sola cadena separada de nueva línea en la entrada deseada y restaura las nuevas líneas al final; esto es solo por conveniencia.
Solución algo inspirada en el método utilizado por la respuesta Python 2 de @ Rod , aunque la implementación es muy diferente.
fuente
Ruby ,
126118 bytes-8 bytes guardados al abusar en
+=
lugar de buscarlos manualmenteo
nuevamente después de reposicionarlos.Pruébalo en línea!
fuente
Consulta T-SQL 2008,
373371366 bytesTenía una lista de prioridades, siempre deslizar hacia la izquierda, recta, derecha. Cambié esa prioridad para siempre deslizarme hacia atrás, izquierda, derecha, derecha. El deslizamiento hacia atrás siempre estará bloqueado, por lo que la prioridad sigue siendo la misma, excepto el primer deslizamiento. Al bajar la serpiente inicialmente (C = 4), intenta deslizarse hacia arriba cuando retrocede. Este pequeño truco me ahorró 2 bytes. Porque no necesitaba agregar 1 a ~ - ~ -c% 4.
Inserté 2 saltos de línea para que sea legible
Tuve que hacer algunos ajustes menores para ejecutar esto en línea, la versión publicada se ejecuta en el estudio de administración del servidor MS-SQL.
Presione Ctrl-T antes de ejecutarlo en el estudio de administración del servidor MS-SQL, esto mostrará el resultado como texto.
Pruébalo en línea
fuente
Python 3 , 343 bytes
Pruébalo en línea!
-11 bytes gracias a ArBo
-4 bytes gracias a Jonathan Frech
fuente
X
,Y
yF
queX=0,1,0,-1;F,*Y=*X,0
si no me equivoco. Además, leimport*
cuesta más bytes de los que ahorra.*g,=map(...)
. ¿Ysys.stdin.readlines()
funciona quizás?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]]>" "
En consecuencia.05AB1E ,
5452 bytesE / S tanto como una sola cadena de varias líneas.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Pyth , 161 bytes
Pruébalo en línea!
Puerto de la solución Python 3 de HyperNeutrino . Ahora que he terminado con esto, estoy pensando que tal vez debería haber portado la solución Rod's Python 2, pero ya pasé demasiado tiempo en esto.
fuente