Vous êtes un voyageur traversant le désert entre deux villes. Vous ne pouvez pas transporter suffisamment d'eau pour traverser sans vous arrêter. Ceci est une variation d'un puzzle classique.
Les règles
Un désert ressemble à ceci: une grille WxH d'espace principalement vide. L'espace marqué S
est l'endroit où vous commencez, E
c'est l'endroit où vous voulez finir, et un carré marqué du nombre N contient N unités d'eau. Carrés marqués d'une .
retenue d'eau nulle.
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Vous commencez en S avec 5 unités d'eau.
Vous pouvez transporter au maximum 5 unités d'eau.
À chaque tour
- déplacer un carré vers le haut, le bas, la gauche ou la droite,
- consommez 1 unité d'eau que vous transportez,
- ramasser ou déposer un certain nombre d'unités d'eau.
Un tour est transcrite ainsi: (direction)(+|-)(units of water)
, +
vous indique ramassez l' eau, -
que vous laisser tomber.
Exemple tourne:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
Si vous effectuez ces mouvements en commençant par S dans l'exemple ci-dessus, le désert ressemble à ceci après.
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Vous ne pouvez pas prendre plus d'eau que ce qui est déjà sur votre place. Lorsque vous récupérez l'eau, déduisez ce nombre d'unités du nombre de tuiles.
Vous ne pouvez ramasser de l'eau que pour un maximum de 5 unités.
Aucune tuile ne peut contenir plus de 9 unités, sauf S qui détient des unités à l'infini.
Vous ne pouvez laisser tomber autant d'eau que vous en avez actuellement.
L'eau au sol reste inchangée jusqu'à ce que vous la récupériez.
Si vous revenez à S, vous pouvez ramasser n'importe quelle quantité d'eau sans l'appauvrir.
Si vous atteignez E, vous gagnez . Vous gagnez toujours si vous consommez votre dernière unité d'eau sur E.
Si, après votre tour, vous n'avez plus d'eau et que vous n'êtes pas sur E, vous mourrez .
Entrée et sortie
Votre programme recevra une carte de départ de taille arbitraire en STDIN
tant qu'art ASCII dans le format ci-dessus. Vous pouvez supposer qu'il est rectangulaire, c'est-à-dire toutes les lignes de la même longueur, qu'il y a exactement un S
et un E
carré, toutes les lignes se terminent par \n
, et l'ensemble de STDIN sera conforme à cette expression régulière:/^[SE1-9\.\n]+$/
Votre programme écrira la sortie suivante dans STDOUT:
- la liste des coups,
- l'état final de la carte.
Vous pouvez afficher la liste des mouvements dans n'importe quel format pratique.
L'état final de la carte sera imprimé dans le même format que l'entrée, sauf qu'il montrera en plus l'itinéraire que vous avez suivi à travers le désert en marquant toutes les tuiles visitées #
, si cette tuile ne contient pas d'eau et n'est pas S ou E (c'est-à-dire c'est .
).
EXEMPLE d' entrée:
.....S.
.......
.......
E......
....8..
EXEMPLE sortie gagnante:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
Non-trivialité
Lorsque vous publiez votre code, publiez un exemple d'entrée de carte pour lequel votre code trouve une solution qui satisfait aux conditions de non-trivialité suivantes:
- S et E sont séparés d'au moins 10 mouvements.
- Tout carré qui contient initialement N unités d'eau doit être entouré d'une bordure de largeur N dans laquelle se trouvent tous les carrés
.
(pas d'eau, pas S ou E)
EXEMPLE
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
Si vous augmentez la quantité d'eau sur n'importe quelle tuile, ce qui précède devient trivial.
Exigences
Vraisemblablement, votre programme rencontrera un certain nombre de tentatives infructueuses avant de trouver une solution, le cas échéant.
- Votre programme doit éventuellement résoudre tout apport résoluble.
- Je veux vous regarder mourir - votre programme affichera les mouvements et la carte finale de l'itinéraire vers la mort pour chaque tentative infructueuse de trouver une solution.
- Si vous rencontrez une solution gagnante, imprimez la sortie complète pour cela et terminez.
- Exécutez jusqu'à ce qu'une solution soit trouvée, mais n'essayez pas la même solution deux fois - tous les décès doivent se faire par des voies distinctes.
- Utilisez ceci une entrée de test:
(il faut au moins un coup pour déposer une cache d'eau à un certain point médian).
S........
.........
.........
........E
Le code le plus court qui est publié avec une entrée de démonstration non triviale qu'il résout gagne.