Faites remplir un labyrinthe par un serpent (jusqu'à ce qu'il se coince).
Le serpent
Le serpent commence à un point de départ donné, pointant vers l' Est . Il se déplace en ayant toujours un mur ou une partie de son corps immédiatement à GAUCHE de sa tête (" suiveur de mur de règle de gauche "), jusqu'à ce qu'il se coince parce que les quatre directions autour de sa tête sont occupées. (Remarque: un serpent coincé ne peut peut-être pas remplir tout l'espace accessible, mais ce n'est pas le but!)
Le défi
Écrivez un programme ou une fonction qui accepte un labyrinthe en entrée sous la forme d'un texte 2D:
- L'entrée peut être dans n'importe quel format raisonnable: par exemple une liste de chaînes, une seule chaîne avec des retours à la ligne, un fichier.
- Le labyrinthe a des murs ("
#
"), des espaces vides ("") et exactement un point de départ ("
o
"). Vous pouvez choisir de
- soit supposer que la première et la dernière ligne et colonne sont entièrement des murs;
- ou supposer que chaque entrée est considérée comme ayant une couche extérieure implicite de murs
Vous pouvez supposer que le point de départ a un mur (ou un mur implicite) directement au-dessus (NORD) et que le serpent peut effectuer un mouvement de départ valide dans la direction EST ou SUD.
- Vous pouvez supposer qu'aucun autre caractère n'est présent dans le texte (sauf les retours à la ligne si votre saisie en a besoin).
- Vous pouvez supposer que toutes les lignes ont la même longueur.
et imprime / retourne un "labyrinthe rempli" en sortie, avec un instantané du serpent au moment où il s'est coincé :
- Le corps du serpent est représenté par les caractères
>v<^
pointant vers l'endroit où se trouve son prochain segment - Le point de départ du serpent est soit sa direction au départ ("
>
" à moins qu'il n'ait à tourner immédiatement) soit uno
personnage (pas besoin d'être cohérent) - Le point final du serpent est un
o
personnage
Notation
Golf de code habituel: le code le plus court gagne
Exemple
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#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animé (à des fins d'illustration):
Edit: notez qu'en cas de doute, le serpent doit "garder sa main gauche" sur le mur sur lequel il se trouve, en suivant les coins, sans sauter sur un mur à 1 pâté de maisons.
Merci Jonathan Allan pour l'avoir soulevé, et Draco18s pour l'instantané explicatif ci-dessus.
Autres exemples
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#
#^<<<<<<<<<<<<<#
################