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#
#^<<<<<<<<<<<<<#
################
Réponses:
Fusain ,
9468 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Slurpez l'entrée dans une chaîne. Cela pourrait être évité en utilisant un format d'entrée moins pratique.
Imprimez l'entrée sans déplacer le curseur, puis imprimez à
o
nouveau de façon à ce que le curseur se retrouve en dessous.Initialisez la direction actuelle.
Répétez pendant qu'il y a encore un espace libre dans une certaine direction.
Calculez si le serpent peut tourner à gauche ou s'il est obligé de tourner à droite. Le code
≦⊖θW¬⁼§KVθ ≦⊕θ
fonctionne également pour cela pour le même nombre d'octets, bien qu'il considère0
comme supérieur au lieu de droite, de sorte que le reste du code doit être adapté.Sortez le caractère du corps approprié dans la direction appropriée.
Rétablissez la tête. Cela peut également être écrit comme
Po
qui imprime la tête sans déplacer le curseur à chaque passage à travers la boucle (mais cela permet à la boucle d'être implicitement fermée pour le même nombre d'octets).la source
Python 2 ,
273253242 octets-11 octets grâce à ArBo
Essayez-le en ligne!
Cela fonctionne en recherchant la chaîne
'o '
et en la remplaçant par'[>v<^]o'
, si elle est dans le labyrinthe.La même vérification sera également effectuée sur le labyrinthe tourné, imprimant le labyrinthe rempli lorsque la chaîne n'est plus là.
La fonction
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
est utilisée pour faire pivoter la grillela source
Gelée ,
7256 octetsEssayez-le en ligne!
Un programme complet qui prend l'entrée comme une liste de chaînes et renvoie une liste de chaînes avec le serpent final. Notez que le pied de page sur TIO convertit une seule chaîne séparée par des sauts de ligne en entrée souhaitée et restaure les sauts de ligne à la fin; c'est simplement pour des raisons de commodité.
Solution quelque peu inspirée par la méthode utilisée par la réponse Python 2 de @ Rod , bien que l'implémentation soit très différente.
la source
Rubis ,
126118 octets-8 octets enregistrés en abusant
+=
au lieu de chercher manuellement ào
nouveau après l'avoir repositionné.Essayez-le en ligne!
la source
Requête T-SQL 2008,
373371366 octetsJ'avais une liste de priorités, toujours glissée à gauche, droite, droite. J'ai changé cette priorité pour toujours glisser en arrière, à gauche, à droite, à droite. Le glissement vers l'arrière sera toujours bloqué, donc la priorité est toujours la même sauf la première glissade. En tournant le serpent vers le bas initialement (C = 4), il tente de se faufiler vers le haut lors de la contre-glissade. Ce petit coup m'a sauvé 2 octets. Parce que je n'avais pas besoin d'ajouter 1 à ~ - ~ -c% 4.
J'ai inséré 2 sauts de ligne pour le rendre lisible
J'ai dû faire quelques ajustements mineurs pour exécuter cela en ligne, la version publiée s'exécute dans MS-SQL Server Management Studio.
Appuyez sur Ctrl-T avant de l'exécuter dans MS-SQL Server Management Studio, cela affichera le résultat sous forme de texte.
Essayez-le en ligne
la source
Python 3 , 343 octets
Essayez-le en ligne!
-11 octets grâce à ArBo
-4 octets grâce à Jonathan Frech
la source
X
,Y
etF
àX=0,1,0,-1;F,*Y=*X,0
si je ne me trompe pas. En outre, celaimport*
vous coûte plus d'octets qu'il n'en économise.*g,=map(...)
. Et çasys.stdin.readlines()
marche peut-être?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
, Enif g[r-X[L]][c-Y[L]]>" "
conséquence.05AB1E ,
5452 octetsE / S à la fois comme une seule chaîne multiligne.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Pyth , 161 octets
Essayez-le en ligne!
Port de la solution Python 3 d' HyperNeutrino . Maintenant que j'en ai terminé, je pense que j'aurais peut-être dû porter la solution Python 2 de Rod à la place, mais j'ai déjà passé beaucoup trop de temps à ce sujet.
la source