Avertissement: L'histoire racontée dans cette question est entièrement fictive et inventée uniquement dans le but de fournir une intro.
Mon patron a acheté un nouveau robot jouet et il veut que je l'aide à le programmer. Il veut pouvoir saisir des instructions de flèche simples pour le faire bouger. Ces instructions sont: ^ (pour aller de l'avant) <(pour tourner à gauche) et> (pour tourner à droite). Cependant, maintenant que j'ai programmé le robot, il veut des fonctionnalités supplémentaires. Il veut que je transforme toute séquence de flèches qu'il entre, de sorte que plutôt que de demander au robot de prendre le chemin indiqué, il se déplace vers l'emplacement souhaité, indiqué par l'endroit où il se retrouverait s'il avait pris le chemin entré, aussi efficacement que possible. Je fais appel à vous, membres de PP&CG, pour m'aider dans cette tâche.
Ta tâche:
Écrivez un programme ou une fonction pour convertir une chaîne composée de flèches en une chaîne qui arrivera à l'emplacement indiqué par l'entrée le plus rapidement possible. Le virage prend exactement le temps de reculer ou d'avancer.
Contribution:
Une chaîne de flèches, comme indiqué ci-dessus. Si vous le souhaitez, différents caractères peuvent être substitués aux flèches, mais assurez-vous d'inclure le fait que vous le faites dans votre réponse. Tous les cas de test utilisent normalement les flèches.
Sortie:
Une chaîne de flèches (ou vos caractères équivalents), qui emmènent le robot vers la destination souhaitée aussi efficacement que possible.
Cas de test:
Notez que les solutions proposées ne sont que des possibilités et que d'autres solutions peuvent être valides.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Notation:
La mémoire du robot est limitée, donc votre programme doit avoir le plus petit nombre d'octets possible.
la source
^<^^<^^<^^^^
->>^^>^
?Réponses:
Rétine ,
1037471 octetsEssayez-le en ligne! Le lien inclut des cas de test. Explication:
Transformez les virages à gauche en triples virages à droite.
Réduisez tous les tours modulo 4.
Annulez les mouvements dans des directions opposées.
Retournez un triple virage à droite en virage à gauche. Cela gère également le cas
>>^>^
qui doit devenir<^<^
.Supprimez les virages arrière inutiles.
la source
Mathematica, 135 octets
Prend une
List
chaîne en entrée.Explication
Réglez
j
sur 0 eti
sur 1.Pour chaque caractère en entrée ...
Si le personnage est
>
, multipliezi
par l'unité imaginaire. Si le personnage est>
, divisezi
par l'unité imaginaire. Si le personnage est^
, ajoutezi
àj
.Prenez les parties réelles et imaginaires de
j
. Cela donne les coordonnées cartésiennes du robot.Appliquez ce qui suit à ce résultat:
Défini
a
sur une fonction qui génère une chaîne avec(input)
ou un0
caractère^
s, la plus grande des deux.Un
List
composé de ...a
appliqué à la première entrée (partie réelle dej
)Si la deuxième entrée (partie imaginaire
j
) est plus grande que0
,>
. Dans le cas contraire,<
. Définissezs
le caractère résultant.a
appliquée à la valeur absolue de la deuxième entrée.Si la première entrée est inférieure à 0,
s
. Sinon, chaîne vide.Appliquer
a
aux temps d'entrée négatifs.Rejoignez les chaînes.
la source
Mathematica 119 octets
La position finale de JungHwan pour le code de chemin était plus courte que la mienne, donc en utilisant cela. Je pense qu'il y a probablement un moyen encore plus court de le faire ...
J'utilise la
AnglePath
fonction intégrée pour décider de la position finale. Je définis également les symboles L, F et R pour "<", "^" et ">", pour enregistrer quelques guillemets.Usage:
Sortie:
la source
Rubis , 130 octets
Comment ça marche
Essayez-le en ligne!
la source
J, 90 octets
Solution
explication
il y a une astuce intéressante en utilisant des nombres complexes (multiplier par i est une rotation à gauche de 90 degrés, et -i vous donne une droite).
nous prenons donc notre entrée sous forme de nombres complexes: un 1 représente "marcher en avant" et i / -i représentent les virages à gauche et à droite.
la position finale est calculée sans effort avec cette représentation. Notez que c'est la première partie (la plus à droite) de mon expression finale ci-dessus:
Cette courte ligne ci-dessus est ce qui résout le problème. Tout le reste est juste de savoir comment formater la réponse, et pourrait certainement être beaucoup plus bas.
Pour comprendre la courte ligne ci-dessus, notez que
*/\
(l'analyse des produits partiels) vous donne la liste des positions auxquelles vous êtes confronté à chaque index dans l'entrée: i est le nord, 1 et -1 sont l'est et l'ouest, et -i est le sud . Mais puisque nous commençons à faire face au nord, nous devons multiplier tous ceux par i qui, en J, est représenté parj.
(mâcher cette phrase pendant un moment).Nous ne fait « bouger » lorsque l'entrée d' origine est 1, donc nous multipliez ce résultat par le réseau par éléments booléen qui est 1 où l'entrée d' origine est 1 et 0 autrement:
=&1*
. Le résultat de cette multiplication est un tableau de "pas directionnels". Notre position finale est simplement la somme de ces étapes:+/
essai
Malheureusement, je ne peux pas faire fonctionner cela dans TIO pour une raison quelconque, mais le collage de ce qui suit dans la console J vérifiera que cela fonctionne:
la source
C # (.NET Core) , 349 octets
Essayez-le en ligne!
Prend une chaîne comme entrée et génère le chemin le plus court que l'entrée prendrait.
Non golfé et commenté
la source
JavaScript (Node.js) , 187 octets
Essayez-le en ligne!
Version golf avec espace blanc
-14 octets par @Neil
Non golfé:
la source
t&3
plutôtt%4
que parce que cela fonctionne avec négatift
afin que vous puissiez supprimer le4+
et le()
s.(x?"":t)+t
peut être écrit(x?t:t+t)
pour une sauvegarde sur 1 octet. Le code de déplacement semble beaucoup trop long. Je pense aussi que vous devriez probablement remplacerindexOf
et faireMath.abs
des comparaisons.indexOf
par une comparaison?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 octetsModifiez 1: -5 octets en permettant à la direction d'être en dehors de la plage 0-3 et en supprimant les espaces.
Modifiez 2: -4 octets en changeant l'entrée en (1, 2, 3) au lieu de (<, ^,>) puisque l'OP le permettait, ainsi qu'en changeant mon système de coordonnées pour me permettre de réduire mon calcul de distance.
Essayez-le en ligne!
Détermine les coordonnées finales via les valeurs du dictionnaire en cours d'exécution, puis imprime simplement le chemin direct vers l'objectif final.
la source
Perl 5 , 185 + 1 (-p) = 186 octets
Essayez-le en ligne!
la source
JavaScript (type document.getElementById ()), 343 caractères
étendu:
}
Usage:
alertes:
>^^>^
Un robot avec marche arrière aurait été utile.
la source