Défi
Compte tenu de la taille de la grille, de la position des obstacles, de la position du joueur et de la position cible, votre tâche consiste à trouver un chemin pour que le joueur atteigne la cible et évite les obstacles en même temps (si nécessaire).
Contribution
- N : taille de la grille
N x N
- P : Position du joueur
[playerposx, playerposy]
- T : Position de la cible
[targetposx, targetposy]
- O : Positions des obstacles
[[x1, y1], [x2, y2],...,[xn, yn]]
Production
Chemin : un chemin que le joueur peut utiliser pour atteindre la cible[[x1, y1], [x2, y2],...,[xn, yn]]
Règles
- Le point se
[0,0]
trouve dans le coin supérieur gauche de la grille. - La position du joueur sera toujours sur le côté gauche de la grille.
- La position de la cible sera toujours sur le côté droit de la grille.
- La grille aura toujours au moins un obstacle.
- Vous pouvez supposer qu'aucun obstacle ne chevauche le joueur ou la position cible.
- Vous n'avez pas nécessairement besoin de trouver le chemin min.
- Le joueur ne peut se déplacer qu'à gauche, à droite, en haut et en bas et non en diagonale.
- Vous pouvez prendre l'entrée de n'importe quelle manière pratique.
- Vous pouvez supposer qu'il existe toujours un chemin pour que le joueur atteigne la cible.
- Évidemment, pour chaque entrée, il existe plusieurs chemins valides, choisissez-en un.
- Supposons
N > 2
que la grille soit au moins3 x 3
.
Exemples
Entrée: 9
, [6, 0]
, [3, 8]
, [[0, 5], [2, 2], [6, 4], [8, 2], [8, 7]]
Sortie possible:[[6, 0], [6, 1], [6, 2], [6, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [4, 8], [3, 8]]
Entrée: 6
, [1, 0]
, [3, 5]
, [[1, 2], [2, 5], [5, 1]]
Sortie possible:[[1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [2, 4], [3, 4], [3, 5]]
Remarque
Notez que X
c'est pour les lignes et Y
pour les cols. Ne les confondez pas avec les coordonnées d'une image.
Éditer
Comme l'a souligné @digEmAll, en raison des règles #2
et #3
, playerY = 0
et targetY = N-1
. Donc, si vous le souhaitez, vous pouvez prendre en entrée uniquement playerX
et et targetX
(si cela rend votre code plus court).
la source
Réponses:
JavaScript (ES6), 135 octets
Prend l'entrée comme
(width, [target_x, target_y], obstacles)(source_x, source_y)
, où obstacles est un tableau de chaînes au"X,Y"
format.Renvoie un tableau de chaînes au
"X,Y"
format.Essayez-le en ligne!
Commenté
la source
R , 227 octets
Essayez-le en ligne!
Pas vraiment court, et ne donnant certainement pas le chemin le plus court (par exemple, vérifiez le premier exemple).
Il effectue essentiellement une recherche récursive en profondeur et s'arrête dès que la cible est atteinte, imprimant le chemin.
Merci à JayCe pour l'amélioration du formatage de sortie
la source
x1 y1 x2 y2 ... xn yn
: Dwrite(t(mx),1,N)
au lieu deprint
ing :)Python 2 ,
151149 octetsEssayez-le en ligne!
la source
Haskell ,
133131130 octetsEssayez-le en ligne! (avec quelques tests)
Une fonction
!
prenant en entréen :: Int
taille de la grillep :: [Int]
position du joueur en tant que liste[xp, yp]
o :: [[Int]]
position des obstacles sous forme de liste[[x1, y1], [x2, y2], ...]
t :: [[[Int]]]
(implicite) la position de la cible en tant que liste[[[xt, yt]]]
(triple liste juste pour plus de commodité)et renvoyer un chemin valide sous forme de liste
[[xp, yp], [x1, y1], ..., [xt, yt]]
.En prime, il trouve (l'un des) chemin (s) le plus court (s) et fonctionne pour la position de n'importe quel joueur et cible. En revanche, c'est très inefficace (mais les exemples fournis fonctionnent dans un laps de temps raisonnable).
Explication
iterate
[[xt, yt]]
L'expression apparemment obscure
[id, map (+ 1)] <*> [[x - 1,y], [x, y - 1]]
n'est qu'une version "golfy" (-1 octet) de[[x + 1, y], [x, y + 1], [x - 1, y], [x, y - 1]]
.la source
Rétine 0,8,2 , 229 octets
Essayez-le en ligne! Je ne sais pas si le format d'E / S est admissible. Explication:
Dupliquez chaque cellule. La copie de gauche est utilisée comme zone de travail temporaire.
Marquez le début du labyrinthe comme visité.
Marquez la fin du labyrinthe comme étant vide.
Tant qu'il existe des cellules de travail disponibles, pointez-les vers les cellules adjacentes précédemment visitées.
Tracez le chemin de la sortie au début en utilisant les cellules de travail comme guide.
Supprimez les cellules de travail.
la source
JavaScript, 450 octets
Prend l'entrée comme
(n, {playerx, playery}, {targetx, targety}, [{obstaclex, obstacley}])
. Renvoie un tableau de{hopx, hopy}
.Voici une version discrète sur mon mess:
la source