Vous êtes piégé dans ce labyrinthe 5x5 - chaque pièce est étiquetée de 1 à 25 et la sortie est dans la salle 1.
On vous donne en entrée la pièce dans laquelle vous vous trouvez. Votre tâche consiste à sortir la séquence de mouvements la plus courte (nord, est, sud, ouest) nécessaire pour atteindre la pièce 1.
Les mouvements peuvent être sortis dans le format de votre choix (liste, chaîne, tableau ...) tant que vous utilisez les caractères n,w,e,s
.
Voici tous les cas de test:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
La réponse la plus courte en octets gagne!
Réponses:
Python 2 , 64 octets
Essayez-le en ligne!
Une fonction qui imprime une direction par ligne, se terminant par une erreur.
La constante
0x1211252b5375
code dans la base 4 la direction qued
nous parcourons à partir de chaque numéro de pièce sous la forme d'un nombre compris entre 0 et 3. Le chiffre d'extraction>>2*n-4&3
est également conçu pour donner une erreur de décalage négative lors de lan=1
terminaison du code. Nous mettons à jour le numéro de la piècen
via un décalage calculé à partir de la directiond
asd*3+d%2-5
, qui mappe:la source
try
/except
) pour pouvoir continuer l'exécution après avoir appelé cette fonction.Python 2 ,
9593 octetsEssayez-le en ligne!
Pourrait raser
32 octets si l'étiquetage de pièce indexé 0 est autorisé.la source
05AB1E ,
3029 octets-1 octet grâce à une coïncidence miraculeuse avec des nombres premiers
Essayez-le en ligne!
la source
1
une entrée1
, au lieu d'une chaîne vide (une solution simple serait d'ajouter un interligneõ?
). A part ça, belle réponse!Rubis ,
7262 octetsEssayez-le en ligne!
Comment?
L'astuce consiste à utiliser 2 constantes pour créer l'étape suivante pour chaque cellule, puis à résoudre récursivement le problème.
Les 2 constantes 18139004 et 4267088 sont des chaînes binaires donnant la direction du prochain mouvement, en extrayant un seul bit des deux pour chaque cellule, on peut obtenir:
Plus facile que de se déplacer et de masquer un seul grand nombre binaire à mon humble avis.
Lorsque nous obtenons la direction, nous extrayons la lettre correspondante de la chaîne "en sw":
Et procéder récursivement sur la cellule [n + x]
la source
JavaScript (ES7),
6258 octetsPort de la réponse de xnor .
Essayez-le en ligne!
la source
Perl 5 (
-n
), 94 octets-5 octets grâce à Grimy
TIO
la source
Perl 5 , 79 octets
Essayez-le en ligne!
la source
JavaScript,
807371 octetsAdapté de la solution Python de Chas alors faites-
+1
lui plaisir aussi.Essayez-le en ligne!
1 octet économisé grâce à Arnauld .
la source
Fusain ,
4340 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Basé sur les réponses de @ ChasBrown et @ xnor. Explication:
Entrez dans la pièce.
Définissez la variable de boucle
i
à un de moins que le numéro de la pièce et répétez pendant qu'elle est différente de zéro.Extrayez la direction de la chaîne compressée
0113130113220112010102010
. (Le premier0
n'est qu'un chiffre de remplissage.)Imprimez la direction.
Utilisez la formule @ xnor pour calculer le nouveau numéro de chambre.
la source
Gelée ,
3029 octetsEssayez-le en ligne!
Un lien monadique prenant la cellule de départ et renvoyant une chaîne avec les directions.
J'adore le fait que le dictionnaire de Jelly a un mot comme «Kennesaw» (une ville au nord-ouest d'Atlanta, en Géorgie), utilisé ici parce que l'indexation avec
[5, 1, -5, -1] + 1
donnenesw
!Explication
la source
PHP , 110 octets
Une solution qui n'est pas un port de grande réponse de Chas Brown ou grande réponse xnor . Je sais que c'est plus long mais je voulais avoir une solution différente!
Essayez-le en ligne!
J'ai créé une chaîne de mappage qui a 2 caractères pour chaque cellule du tableau. Le premier caractère de chaque cellule est un déplacement (n / e / s / w) ou
0
et le code ASCII mod 30 du deuxième caractère renverra un autre numéro de cellule que nous devrions suivre son déplacement en mode récursif jusqu'à ce que nous arrivions à quitter la cellule (cell < 2
).Par exemple pour une entrée de 8:
8
sont:w%
w
et continuer les mouvements pour la cellule de%
%
est de 37 dont le mod 30 sera 7, donc la prochaine cellule à suivre est7
.7
sont:n
(le dernier caractère est un espace, code ASCII = 32)n
et continuer avec des mouvements pour la cellule de 32 mod 30 qui est2
.2
sont:w<
(dernier code ASCII de caractère = 60)w
et continuer avec des mouvements pour une cellule de 60 mod 30 qui est0
.2
, la boucle s'arrête!wnw
PHP , 75 octets
Cette version est écrite par Grimy , elle est 35 octets plus courte que ma réponse d'origine car il / elle est plus intelligent! Commentaire de Grimy: "4 * 25 <256, vous n'avez donc besoin que d'un octet par cellule, pas de 2"
Essayez-le en ligne!
PHP , 71 octets
Ce port de la réponse d' Arnauld qui est le port de la réponse de xnor , mais comme une boucle au lieu d'une fonction récursive, car il s'avère plus court en PHP.
Essayez-le en ligne!
la source
C (clang) , 81 octets
Essayez-le en ligne!
Merci à @ Tommylee2k suggestion -8! + appel récursif
C (clang) , 90 octets
Essayez-le en ligne!
Similaire à toutes les solutions non compressées.
la source
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 octetsPort de la réponse Python 2 de @ChasBrown .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce de mes 05AB1E (quatre sections) de comprendre pourquoi
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
est"a wwswsnwwseenwwenwnwnenwn"
;Ž₁9
est22449
;Ž₁9₂в
est[1,7,5,11]
; et'€Ã
est"news"
.la source
western
soit meilleure. ; pBash , 120 octets
Essayez-le en ligne!
J'ai joué pendant un certain temps en essayant de compresser la chaîne en bits, mais le décodage nécessiterait plus de caractères que le nombre enregistré.
Comment ça fonctionne:
La chaîne $ S contient un seul caractère (n, w, s, e) pour chaque pièce indiquant la direction à prendre pour déplacer une pièce vers la sortie, en sautant les pièces 0 et 1.
La chaîne $ N a le delta à ajouter / soustraire du numéro de pièce actuel pour chaque changement de direction (n: -5, w: -1, s: +5, e: +1)
Commencez avec $ i égal au numéro de chambre indiqué sur la ligne de commande ($ 1). Attribuez le caractère à l'index $ i dans la chaîne $ S à $ d. Récupérez la valeur delta de $ N pour la direction à prendre vers la pièce suivante, en l'affectant à $ j.
Imprimez la prochaine direction pour saisir $ d.
Ajoutez / soustrayez le delta de $ j à / de $ i.
Boucle jusqu'à ce que nous quittions la chambre # 2 (alors que $ i> 1).
la source
Stax , 31 octets
Exécuter et déboguer
la source
Kotlin , 112 octets
Essayez-le en ligne!
la source