Vous êtes sur une station spatiale intergalactique avancée. Un de vos amis qui est mineur dans l’étude de la gravité vient de créer un jeu qui consiste à utiliser la microgravité comme moyen de déplacer une balle.
Elle vous tend un petit contrôleur avec quatre flèches directionnelles et un labyrinthe ressemblant à une structure avec un ballon assis à gauche. Elle commence à expliquer le fonctionnement du jeu.
- Vous avez 2 boutons directionnels, gauche
<
et droite>
. - Vous avez également 2 boutons de gravité, de haut en
^
basv
(au moins de votre cadre de référence) - Vous utiliserez ces boutons fléchés pour déplacer la balle sur votre écran.
"Maintenant, il y a des règles à suivre." elle dit
- Toutes les plates-formes doivent être traversées avant d'arriver à la tasse
\ /
- Les flèches
< > ^ v
seront utilisées pour spécifier le mouvement de la balle - La gravité est
^ v
(de haut en bas). Cela déplace le ballon jusqu'à la prochaine plate-forme dans cette direction. (La distance n'est pas calculée pour monter et descendre) - Perdre le ballon, c'est mauvais! Ne tombez pas sur le bord et ne modifiez pas la gravité trop tôt pour que votre balle n'atteigne jamais une plateforme.
- Le mouvement est compté en pas de
< >
- La balle peut entrer dans la coupe de n'importe quelle direction tant que la Règle 1 est suivie
- Vous devez spécifier la direction de la gravité afin que votre balle ne flotte pas
- Le mouvement peut être aléatoire tant que les règles 1 et 4 sont suivies
- Pour les cas qui ne peuvent pas être résolus, indiquez False ou Invalid.
Exemple simple de ballon, plateforme et coupe:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Exemple de nouveau passage sur la même plate-forme.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Exemple de gravité de commutation
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Tâche
Votre tâche est de créer un programme qui utilisera une représentation ASCII d’un cours. Et la sortie d' une série de flèches <>^v
représentant la direction et l' attraction gravitationnelle de déplacer une boule o
dans l' ensemble platforms
dans une tasse.
Les règles de golf standard s'appliquent
Cas de test
Entrée (situation dans laquelle la gravité est activée)
---- --/ \
--- --
o
------ -----
Sortie
^>>v>>>>>^>>>>>v>>>>^>>>
Entrée (une situation où la direction est changée)
---
o
----
---
-----
--\ /
Sortie
v>>>>>>^>>>v<<<<<v>>>
Entrée (situation dans laquelle vous devez traverser deux fois la même plate-forme)
o
------
------
------
\ /------
Sortie
v>>>>>><<<<<<>>>>>>><<<<<<
Mauvais cas, le programme doit produire Falsy pour ces
Le ballon n'a aucun moyen de se rendre à la prochaine plateforme
o
--- ---
La balle flotterait dans l'espace
---
o
---
Une situation où la balle arrive à la coupe, mais toutes les plates-formes ne sont pas traversées.
o
----
----
\ /----
la source
Réponses:
Pyth, 431 octets
C’est mon premier programme Pyth (c’est en fait mon premier programme dans n’importe quel langage de code-golf), ce qui signifie qu’il peut probablement encore être amélioré.
Essayez-le ici (le dernier cas de test a besoin de trop de temps, il doit être testé avec une installation Pyth locale).
Dex Hex du code (utilisé
xxd -r <filename>
pour décoder):Explication
L'idée principale de ce programme était d'utiliser des expressions régulières pour modifier les entrées. Pour économiser de l'espace, toutes ces expressions régulières sont contenues dans une chaîne compressée. La première étape du programme consiste à décompresser la chaîne et à la diviser dans une expression régulière unique et les chaînes de remplacement correspondantes.
Le contenu de la variable
J
est alors:La fonction
r
applique les substitutions de regex de la liste stockée dansJ
l'indexG
à toutes les chaînes de la listeH
. Il revient dès qu'une des chaînes a été changée.La fonction
i
est similaire à fonctionnerr
avec 2 différences. Il applique les substitutions sur une liste transposée (verticale plutôt que horizontale). Il effectue également les substitutions à plusieurs reprises tant que tout est changé.La fonction
g
vérifie si l'expression régulière de la liste stockée dansJ
l'indexG
peut être trouvée dans une chaîne quelconque de la listeH
.Le reste du code contient la logique de programme réelle. Il effectue une recherche approfondie des mouvements possibles jusqu'à ce qu'une solution soit trouvée. La position dans l'arbre de recherche est uniquement définie par la direction de la gravité et une copie modifiée de l'entrée du programme. Pour éviter le traitement de la même position à plusieurs reprises, les positions traitées sont stockées dans la liste globale
K
. Les positions qui doivent encore être traitées sont stockées avec la partie correspondante de la solution dans la listeY
.La modification de l'entrée et l'initialisation de
K
etY
est effectuée par le code suivant:La modification d’entrée fait quelque chose comme ce qui suit. L'entrée:
est transformé en:
Les valeurs ont la signification suivante:
-
Plate-forme qui doit encore être visitée=
Plateforme qui n'a plus besoin d'être visitéeM
Tasse pouvant être entrée avec la gravité réglée sur "down"W
Coupe pouvant être entrée avec la gravité réglée sur "up"V
Sans danger pour se déplacer à cet endroit avec la gravité réglée sur "vers le bas"A
Sans danger pour se déplacer à cet endroit avec la gravité réglée à "up"X
Coffre-fort pour se déplacer à cet endroit indépendamment du réglage de la gravité6
Ball sur un endroit qui serait marqué commeV
9
Ball sur un endroit qui serait marqué commeA
0
Ball sur un endroit qui serait marqué commeX
La logique utilise des expressions régulières pour effectuer les mouvements. Dans l'exemple ci-dessus, si la gravité est réglée sur "up", nous pouvons remplacer "9A" par "A9" par une expression régulière pour déplacer le ballon vers la droite. Cela signifie qu'en essayant d'appliquer l'expression rationnelle, nous pouvons trouver tous les mouvements possibles.
La fonction
X
effectue des mouvements à billes verticale en fonction du réglage de la gravité actuelle, stocke le résultat dans les listes mondialesK
etY
, et vérifie si une solution a été trouvée.La fonction
(
implémente des contrôles pour les 4 boutons directionnels / gravité. Vous ne pouvez appuyer sur les boutons de gravité que si la gravité actuelle change et si la balle est dans un endroit sûr pour modifier la gravité. Vous ne pouvez appuyer sur les touches directionnelles que si vous pouvez vous déplacer en toute sécurité à l'endroit correspondant.Enfin la boucle principale. Le premier élément de
Y
est supprimé à plusieurs reprises et des contrôles sont effectués pour tous les déplacements possibles.la source
Y
liste sera vide, la pop générera une erreur et la#
boucle se terminera.