Les labyrinthes de glace ont été l'un de mes agrafes préférées des jeux Pokémon depuis leurs débuts dans Pokémon Gold et Silver. Votre tâche sera de créer un programme qui résout ces types de problèmes.
Les labyrinthes de glace sont principalement constitués, comme leur nom l'indique, de glace. Une fois que le joueur se déplace dans une direction sur la glace, il continuera de se déplacer dans cette direction jusqu'à ce qu'il heurte un obstacle. Il y a aussi du sol qui peut être déplacé librement et empêchera tout joueur de le traverser. Le dernier obstacle est la pierre. La pierre ne peut pas occuper le même espace que le joueur et si le joueur tente d'y pénétrer, il cessera de bouger avant de pouvoir.
Vous recevrez un conteneur de valeurs bidimensionnel, comme une liste de listes ou une chaîne séparée par des sauts de ligne, contenant 3 valeurs distinctes pour chacun des 3 types de revêtements de sol (glace, sol et pierre). Vous recevrez également deux paires (ou d'autres conteneurs de deux valeurs équivalentes) qui indiquent une coordonnée de départ et d'objectif dans le labyrinthe. Ceux-ci peuvent être zéro ou un indexé.
Vous devez produire une liste de mouvements (4 valeurs distinctes avec une bijection sur N, E, S, W) qui feraient arriver le joueur à la fin une fois exécuté.
L'entrée aura toujours un périmètre de pierre fermé autour du labyrinthe afin que vous n'ayez pas à vous soucier de la sortie du labyrinthe du joueur
C'est du golf de code donc le moins d'octets gagne
Cas de test
Ici .
représentera la glace, ~
représentera le sol et O
représentera une pierre. Les coordonnées sont 1 indexées. Chaque lettre de la solution représente la direction commençant par cette lettre (par exemple N
= Nord)
Contribution
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Production
N
Contribution
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Production
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Contribution
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Production
E,S,S,W,N,E,N
Contribution
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Production
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
la source
Réponses:
Mathematica, 247 octets
Avec des sauts de ligne:
Mon idée immédiate était de représenter les positions de la glace et du sol sous forme de nœuds dans un graphique avec des arêtes dirigées correspondant à des mouvements légaux, puis à les utiliser
FindPath
. On pourrait penser que déterminer les démarches légales serait la partie facile et trouver la solution serait la partie difficile. Pour moi, c'était le contraire. Ouvert aux suggestions sur la façon de calculer les bords.Le premier argument
#
est un tableau 2D où0
représente la glace,1
représente le sol et2
représente la pierre.Le deuxième argument
#2
et le troisième argument#3
sont les points de départ et d'arrivée, respectivement, dans le formulaire{row,column}
.
est le caractère à usage privé de 3 octetsU+F4A1
représentant\[Function]
.Explication
Définit une fonction
p
qui prend une listex
du formulaire{row,column}
et des sorties#[[row,column]]
; c'est-à-dire la valeur glace / sol / pierre à cette coordonnée.Définit une fonction
m
qui prend une position de départc
et un vecteur de directionv
et détermine récursivement où vous vous retrouveriez. Sic+v
c'est de la glace, alors nous continuons à glisser à partir de ce point, donc il revientm[c+v,v]
. Sic+v
c'est du sol, alors nous allons versc+v
et nous arrêtons. Sinon (sic+v
c'est de la pierre ou hors limites), vous ne bougez pas. Notez que cela est uniquement destiné à être appelé sur des positions de glace ou de sol.Définit la liste
g
des positions de la glace et du sol (p
valeur inférieure à2
).Définit une fonction
a
qui prend une position de départc
et retourne les résultats de se déplacer dans les{1,0}
,{-1,0}
,{0,1}
, et les{0,-1}
directions. Il peut y avoir une redondance. Encore une fois, cela suppose que celac
correspond à de la glace ou du sol.Définit la liste
e
des arêtes dirigées représentant les déplacements légaux. Pour chaque position#
dansg
, calculez la table des arêtes#->c
pour chaquec
entréea@#
. Puis, comme nous allons nous retrouver avec une sous-liste pour chaque position#
, j'aplatis le premier niveau. Il peut y avoir des boucles et des bords multiples.Graph[e]
est le graphique où les nœuds sont les positions légales (glace ou sol) et les bords représentent des mouvements légaux (pouvant se cogner contre une pierre et ne pas bouger). Nous utilisons ensuiteFindPath
pour trouver un chemin de#2
à#3
représenté sous forme de liste de nœuds. PuisqueFindPath
peut prendre des arguments supplémentaires pour trouver plus d'un chemin, le résultat sera en fait une liste contenant un seul chemin, donc je prends le premier élément en utilisant[[1]]
. Ensuite je prendsDifferences
les coordonnées successives etNormalize
les. Ainsi est le haut{-1,0}
, le bas est{1,0}
, la droite est{0,1}
et la gauche est{0,-1}
.Cas de test
la source
JavaScript (ES6) 180
183Utiliser un BFS , comme je l'ai fait pour résoudre ce défi connexe
Entrée
La carte du labyrinthe est une chaîne multiligne, utilisant
O
ou0
pour la pierre,8
pour le sol et tout chiffre différent de zéro inférieur à 8 pour la glace (7
regardez bien).Les positions de début et de fin sont basées sur zéro.
Sortie
Une liste de décalage, où -1 est
W
, 1 estE
, négatif inférieur à -1 estN
et un positif supérieur à 1 estS
Moins golfé
Tester
la source