Oh non! Nemo, notre petit poisson clown est perdu dans cet océan ASCII et son père Marlin essaie de le retrouver.
Votre tâche consiste à amener Marlin à Nemo en toute sécurité. Mais attention, nous avons une frénésie d'alimentation Bruce en liberté, alors mieux vaut l'éviter à tout prix!
Détails
Vous obtenez une grille océanique ASCII rectangulaire contenant uniquement des alphabets en minuscules a-z
. Cet océan aura nemo
, marlin
et à l' bruce
intérieur sous la forme d'un polyomino continu, toujours à partir de la cellule la plus haute de la première colonne de polyomino. Ainsi, par exemple, parmi tous les tétrominos possibles, ceux valides sont répertoriés dans l'extrait ci-dessous
Mais des formulaires comme ceux-ci ne sont pas valides et ne seront pas présents dans l'entrée:
omen
ne
mo
nem
o
o
m
en
nem
o
n
eo
m
Enfin, votre tâche consiste à trouver un chemin entre la marlin
tuile polyomino et la nemo
tuile polyomino en vous assurant qu'aucune cellule de votre chemin n'est adjacente à la bruce
tuile polyomino. Votre sortie doit remplacer tous les alphabets qui ne font pas partie de la marlin
tuile, de la nemo
tuile et du chemin les reliant tous les deux par un caractère de la plage ASCII imprimable (y compris l'espace) autre que les minuscules a-z
.
Exemple
Si l'océan d'entrée est le suivant:
oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv
(les 3 polyominos étant:
...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............
)
Une solution valide peut alors ressembler à:
...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............
L'extrait ci-dessous contient quelques autres exemples:
Remarques
- La grille sera toujours un rectangle parfait et ne contiendra qu'une seule tuile polyomino de
nemo
,marlin
etbruce
. - Votre chemin ne doit pas traverser
bruce
ou l'une des 4 cellules adjacentes (haut, bas, gauche et droite) d'une cellule de labruce
tuile. - Il est toujours garanti qu'il y aura au moins un chemin valide de
marlin
ànemo
. - Il n'y a aucune exigence de chemin le plus court ici, alors allez-y!
- Même si vous n'avez pas besoin de trouver le chemin le plus court, aucune cellule du chemin (chemin n'incluant pas le marlin ou le nemo) ne peut être adjacente à plus de deux autres cellules du chemin.
- Le chemin ne doit pas passer par le
marlin
ou lesnemo
tuiles, car cela dérouterait alors les petits poissons dans le choix d'une direction. - Comme d'habitude, vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou son équivalent le plus proche), un argument de ligne de commande ou un paramètre de fonction, et en produisant une sortie via STDOUT (ou son équivalent le plus proche), une valeur de retour ou un paramètre de fonction (out).
- Si la saisie sur plusieurs lignes n'est pas possible, vous pouvez supposer que la grille est jointe par le
|
caractère au lieu de\n
. Vous pouvez également prendre l'entrée comme un tableau de lignes de grille.
Il s'agit du code golf, donc l'entrée la plus courte en octets l'emporte.
la source
k
précède lel
marlin était visible? (faisant le chemin du n à marlin vers nemo)Réponses:
Matlab 560
560 octets lors de la suppression de tous les espaces inutiles, de tous les points-virgules et de tous les commentaires. Pourrait être joué au golf beaucoup plus mais je suis fatigué en ce moment (peut-être demain ...) Bonne nuit à tous.
PS: J'ai supposé que le chemin devait avoir une connectivité à 4 quartiers ('+').
Fonction d'appel: (les nouvelles lignes ne sont pas nécessaires)
Production:
Comment ça fonctionne
Extraire des noms
La première partie est d'extraire les noms par exemple
nemo
, ce qui est fait par la fonctionq()
. La fonction marque d'abord tout comme 0, puis les occurrences première lettre du nom comme1
, puis la deuxième lettre comme2
s'il y a un1
dans le voisinage, puis la troisième et ainsi de suite. Après cela, il ne devrait y ennemo
avoir qu'un4
. De là, nous revenons en arrière jusqu'à ce que nous retrouvions le1
, puis supprimons tous les autres nombres qui étaient supérieurs à cela, nous récupérons donc un joli masque où les lettresnemo
sont masquées. Nous faisons cela pour les trois noms et pouvons ensuite rechercher un chemin.Trouver le chemin
Nous partons des positions de Marlins et envoyons une onde de choc à travers l'image du trou pas à pas. À chaque étape, nous augmentons le compteur de distance et marquons les «pixels» sous le front d'onde avec la distance actuelle. (Comme cela se fait généralement avec les algorithmes de chemin le plus court.) Ce front d'onde est évidemment bloqué par la zone de Bruce, donc il circulera autour de lui. Cette étape est répétée jusqu'à ce qu'une limite supérieure soit atteinte. Cette limite supérieure (certes très lâche) est maintenant la circonférence de «l'image» (les chemins les plus courts seront de toute façon beaucoup plus courts). Dans le cas de test, cela ressemble à ceci:
Commencez maintenant par les
nemo
pixels et diminuez le compteur de distance à chaque étape et ajoutez un voisin avec la distance inférieure suivante (selon la carte de distance que nous avons calculée plus tôt) à notre chemin.la source
Python 2 - 658
Très très inefficace en temps et en mémoire. La fonction pour identifier les motifs est la fonction récursive S, et la fonction pour trouver les chemins est le C, qui est fondamentalement une implémentation A * horriblement inefficace.
Pour les tests, utilisez celui-ci (très légèrement) moins golfé (qui calcule le chemin une fois pour chaque tuile)
la source