Prémisse
Donc, récemment, j'avais environ une demi-heure d'avance pour un rendez-vous et j'ai décidé d'attendre dehors. J'ai également déterminé qu'il serait étrange que je me tienne immobile devant la maison. Par conséquent, j'ai décidé de faire une promenade rapide, dans une zone limitée. J'ai également conclu que si je commençais à tourner en rond, cela rendrait évident que je flânais. J'ai donc été inspiré pour créer mon premier défi Code Golf.
spécification
Vous recevrez une liste, une carte de la zone, qui contiendra soit " "
ou "#"
, qui représentent des espaces libres et des obstacles en quelque sorte. Les espaces libres ne peuvent être traversés qu'une seule fois et il faut 1 minute pour le traverser. Votre position initiale sera signifiée par une "@"
tradition par roguelike, et la cible sera représentée par un "$"
car c'est ce que vous allez perdre là-bas. Vous recevrez également un entier qui représentera le nombre de minutes que vous devez perdre avant de ne pas avoir l'air de vous emparer. Lorsque vous atterrissez sur le"$"
, il devra s'agir du nombre exact de minutes (donc si vous comptez à rebours, il devra être 1 sur une tuile adjacente et 0 sur la tuile). Il sera toujours possible d'atteindre la destination. Votre programme ou fonction devra renvoyer une liste indiquant le chemin le plus court avec <,>, ^ et v pour représenter les quatre directions possibles.
Exemples
Contribution:
[[" ", " ", " ", " "],
["@", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
et
5
Sortie:
[[">", ">", ">", "v"],
["^", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
Contribution:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
et
7
Sortie:
[[" ", "#", " ", " ", " "],
[" ", "#", ">", "v", " "],
["v", "#", "^", "$", " "],
[">", ">", "^", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
Contribution:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
et
17
Sortie:
[[" ", "#", " ", "v", "<"],
[" ", "#", " ", "v", "^"],
["v", "#", " ", "$", "^"],
[">", ">", "v", ">", "^"],
[" ", "#", "v", "^", "<"],
[" ", "#", ">", ">", "^"]]
Règles
- Des échappatoires standard s'appliquent
- Chaque tuile ne doit être déplacée qu'une seule fois
- Le temps exact doit être passé sur le tableau
- Un seul chemin doit être affiché dans le cas de plusieurs chemins
- Ceci est une question de code de golf, donc la réponse la plus courte gagne
- Selon la question de user202729 dans les commentaires, vous pouvez supposer une entrée valide.
Ajoutez un commentaire si des précisions supplémentaires sont nécessaires
la source
Réponses:
JavaScript (ES6), 171 octets
Prend une entrée dans la syntaxe de curry
(a)(n)
. Sorties en modifiant la matrice d'entrée.Essayez-le en ligne!
Commenté
la source
Python 2 ,
310256 octetsMerci @cairdcoinheringaahing pour
except:0
-3 octetsMerci @Mnemonic pour -8 octets
Merci @JonathanAllan pour -3 octets
Merci @ovs pour -5 octets
Essayez-le en ligne!
Quelques explications:
try-except
est utilisé pour s'assurer que les deuxx
et lesy
coordonnées sont dans les limites. Une exception sera levée lors de l'accès àG[y][x]
. Python est trop bon et les indices négatifs sont acceptables, donc une vérificationx>-1<y
est ajoutée.T=[r[:]for r in G]
utilisé pour créer une copie desG
valeurs par~-i/2
et~-(i^2)/2
sont utilisés pour générer des paires(-1, 0), (0, 1), (0, -1), (1, 0)
, qui se déplaçaient dans la grille (il devrait toujours y avoir un chemin plus court!)R+=[G]*(0==c<'$'==G[y][x])
vérifier, qui'$'
est atteint en nombre d'étapes requis.R
est utilisé pour obtenir ce résultat à partir d'appels de fonction récursifs.for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
Trouvéx
ety
d''@'
en entrée et la fonction appelS
.print R[0]
R
peut contenir plus d'une solution, donc sortez juste en premierla source
if G[y][x]=='$':
parif'$'==G[y][x]:
.R+=(G[y][x]=='$')*(c==0)*[G]
un autre octet.if(x>-1<y)*(G[y][x]in' @'):
y+cmp(i%2,i/2)
seraity+~-(i^2)/2
; il pourrait bien être encore plus court.Python 2 ,
264261251249 octetsEssayez-le en ligne!
la source