Fai riempire un labirinto da qualsiasi serpente (fino a quando non si blocca).
Il serpente
Il serpente inizia in un determinato punto di partenza, indicando EST . Si muove avendo sempre un muro o una parte del suo corpo immediatamente a SINISTRA della sua testa (" seguace del muro della regola della mano sinistra "), finché non si blocca perché tutte e quattro le direzioni intorno alla sua testa sono occupate. (Nota: un serpente bloccato non può riempire tutto lo spazio raggiungibile, ma non è questo l'obiettivo!)
La sfida
Scrivi un programma o una funzione che accetta un labirinto come input sotto forma di un testo 2D:
- L'input può essere in qualsiasi formato ragionevole: ad esempio un elenco di stringhe, una singola stringa con newline, un file.
- Il labirinto ha pareti ("
#"), spazi vuoti ("") ed esattamente un punto di partenza ("o"). Puoi scegliere di
- supponiamo che la prima e l'ultima riga e colonna siano interamente muri;
- o supponiamo che ogni input sia considerato avere uno strato esterno implicito di pareti
Si può presumere che il punto di partenza abbia un muro (o un muro implicito) direttamente sopra di esso (NORD) e che il serpente possa effettuare una mossa di partenza valida nella direzione EST o SUD.
- Puoi presumere che non siano presenti altri caratteri nel testo (tranne le nuove righe se il tuo input ne ha bisogno).
- Puoi presumere che tutte le linee abbiano la stessa lunghezza.
e stampa / restituisce un "labirinto pieno" come output, con un'istantanea del serpente nel momento in cui si è bloccato :
- Il corpo del serpente è rappresentato dai personaggi che
>v<^indicano dove si trova il suo segmento successivo - Il punto di partenza del serpente è la sua direzione all'inizio ("
>" a meno che non debba girare immediatamente) o unopersonaggio (non è necessario essere coerenti) - Il punto finale del serpente è un
opersonaggio
punteggio
Solito codice golf: vince il codice più corto
Esempio
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#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animato (a scopo illustrativo):
Modifica: nota che, in caso di dubbio, il serpente dovrebbe "mantenere la mano sinistra" sul muro su cui si trova già, seguendo gli angoli, senza saltare contro un muro a 1 isolato di distanza.
Grazie Jonathan Allan per averlo menzionato e Draco18s per l'istantanea esplicativa sopra.
Altri esempi
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#
#^<<<<<<<<<<<<<#
################

