Contexte
Vous vous réveillez pour vous retrouver perdu dans un labyrinthe à une dimension! Un génie mystique (ou quelque chose) apparaît et explique que la sortie se trouve devant vous, mais qu'entre vous et la sortie est une série de défis. En avançant, vous réalisez que tous les prétendus défis ne sont que des portes verrouillées. Vous voyez d’abord une porte avec un trou de clé en forme de té; sans cette clé, revenez sur vos pas et recherchez une clé de T
forme.
Frustré, vous trouvez sur le sol une soupe de clés alphabet, dont aucune ne correspond à la porte que vous avez rencontrée. Par un coup de génie (ou d'idiotie), vous décidez que la t
clé en forme de minuscule pourrait bien s'insérer dans la fente si vous l'enfoncez assez fort. Lorsque vous approchez la porte avec la t
clé minuscule dans la main, le T
trou devient vert et la porte se dissout devant vous.
Une baisse, beaucoup plus à faire ...
Défi
Le but de ce défi est de marquer le nombre de pas nécessaires pour sortir du labyrinthe.
La saisie de ce défi est le labyrinthe: une chaîne ne contenant que des caractères [A-Za-z^$ ]
. Glossaire:
^
- L'espace de départ. L'entrée contiendra exactement un^
.$
- La sortie (liberté!). L'entrée contiendra exactement un$
.[A-Z]
- Les lettres majuscules signifient des portes. Vous ne pouvez passer par cette porte que si vous avez déjà recueilli la clé requise.[a-z]
- Les lettres minuscules désignent les touches. Vous collectez ces clés en accédant à l'espace contenant la clé.
Il y aura au plus une de chaque lettre majuscule dans l'entrée. Cela signifie que le nombre total de portes sera compris entre 0 et 26 inclus.
Chaque porte verrouillée [A-Z]
aura exactement une clé minuscule correspondante [a-z]
. Il peut y avoir un nombre quelconque d'espaces ( ) dans l'entrée.
Toutes les portes seront à droite du début et à gauche de la sortie. Ainsi, il n'y aura pas de portes superflues. Toutes les entrées seront solubles.
Le résultat de ce défi sera un nombre, le nombre de pas nécessaires pour sortir du labyrinthe.
Algorithme
Votre approche méthodique pour sortir de ce lieu misérable est la suivante:
- Commencez au début (
^
) et avancez (à droite) en collectant les clés que vous rencontrez. - Lorsque vous rencontrez une porte, si vous avez la bonne clé, vous avancez vers la porte. Si vous ne possédez pas la bonne clé, vous récupérez les clés que vous rencontrez jusqu'à ce que vous trouviez la clé de la dernière porte que vous ne pouviez pas ouvrir.
- Une fois que vous avez récupéré la clé de la porte gênante actuelle, vous retournez à droite et continuez.
- Répétez cette procédure jusqu'à ce que vous passiez à la sortie (
$
).
Les golfeurs expérimentés comprendront que votre code n'a pas à implémenter cet algorithme spécifique tant qu'il génère le même résultat que si vous l'aviez exécuté.
Compte
Chaque fois que vous passez d'une case à une autre, cela compte pour une étape. Le virage à 180º ne comporte aucune étape supplémentaire. Vous ne pouvez pas avancer sur une porte sans la clé requise. Vous devez marcher sur une clé pour la récupérer et vous devez vous diriger vers la sortie pour gagner. Après votre premier déplacement, l’espace de départ ( ^
) se comporte comme tout autre espace normal.
Exemples
Dans ces exemples, j'ai laissé les espaces comme des soulignés pour la lisibilité humaine.
L'entrée est _a_^_A__$__
. La sortie est 11
. Vous 1
faites un pas en avant, remarquez que vous n’avez pas de clé pour la A
porte, puis sur votre visage. Vous marchez en arrière jusqu'à occuper l'espace contenant le a
( 3
pas en arrière, maintenant 4
total). Vous avancez ensuite jusqu'à occuper l'espace contenant la sortie ( 7
pas en avant, 11
total).
L'entrée est b__j^__a_AJB_$
. La sortie est 41
Vous faites deux allers-retours distincts à l’arrière du labyrinthe, l’un pour récupérer la j
clé et le suivant pour obtenir la b
clé.
L'entrée est __m__t_^__x_T_MX_$____
. La sortie est 44
. Vous ne ferez aucun voyage supplémentaire pour obtenir la x
clé, car vous la récupérerez du début à la fin T
.
L'entrée est g_t_^G_T$
. La sortie est 12
. Vous ne pouvez pas vous déplacer dans l’ G
espace sans clé, et immédiatement sur votre visage. Vous avez la chance de récupérer la t
clé sur le chemin de la g
clé et d'ouvrir ainsi les deux portes sur votre chemin vers la liberté.
L'entrée est _^_____$
. La sortie est 6
. C'était facile.
Directives d'E / S et critère gagnant
Les règles d'E / S standard s'appliquent. Ceci est un défi de code-golf .
A
dansbA^aB$
ne serait pas superflu non plus . ;)Réponses:
CJam, 45
Essayez-le en ligne
Explication:
la source
Pyth, 51 octets
additionnez la distance entre la porte et sa clé (doublée pour effectuer l'aller-retour), en ignorant les clés "imbriquées" et la distance du début à la fin:
même algorithme en python2.7:
la source
Python 2,
155154134128 octetsEdit: Merci à @ user2357112 et @loovjo pour leurs commentaires qui m'ont aidé à réduire de
20 à26 octets ma solution!la source
i
c'est inutile?i
suit la position de la porte en cours de traitement et est nécessaire si sa clé n'a pas encore été récupérée (c'est-à-dire sik
- la position de la clé - est inférieure àf
- la plus à gauche où nous avons marché - nous devons ajouter2*(i-k-1)
étapes vers notre total (en marchant à gauche pour obtenir la clé, et en revenant à la porte) ...?i
être remplacé parl.index(d)
à la cinquième ligne et la cession supprimée à la quatrième?e
et distinctesf
semblent redondantes. En outre, vous pouvez enregistrer un groupe de caractères en enregistrantl.index
une variable.x
est redondant aussi. Devinez mon golf noob-iness montre. :) Merci pour l'aide!C, 136 octets
la source
PHP 5.3, 123 octets
Ceci est mon premier post sur Code Golf, espérons-le, il est d'une qualité de golf suffisamment élevée pour un premier post. Certainement un défi amusant et une question géniale!
Ce programme abuse gentiment du fait que PHP n’a pas besoin de pré-déclarer les variables avant de les utiliser.
Il s’est également avéré que la solution finale devait commencer à 0 et réinitialiser le nombre de pas lorsque le caractère de début est trouvé, plutôt que de commencer par le '^'.
Tous les conseils sont les bienvenus!
la source
JavaScript (ES6), 110 octets
Réponse du port de @ Rob's Pyth.
la source
Python 2.7,
234199179la source
AWK, 174 octets
Il y a probablement un algorithme plus strict, mais c'est ce que j'ai proposé.
Notez que j'utilise
gawk
. Certaines implémentations deAWK
ne peuvent pas diviser une chaîne de""
cette façon.la source
C #, 309 octets
Version non-golfée:
Rien d'extraordinaire ici, il suffit de parcourir la chaîne et de changer de direction en fonction du caractère et si la clé est contenue dans une chaîne de clés.
m = la chaîne de labyrinthe
k = la chaîne de clés
f = la direction (true est en avant dans le labyrinthe)
b = la clé à rechercher lors d'un retour en arrière
c = espace réservé pour m [j] pour économiser des octets en raison d'une utilisation fréquente
j = l'index de caractère de la chaîne à regarder
t = le compte
Encore relativement nouveau dans le golf alors si vous voyez quelque part je peux le réduire, faites le moi savoir!
la source