Beaucoup de vieux jeux Game Boy nécessitaient souvent une entrée de chaîne de la part de l'utilisateur. Cependant, il n'y avait pas de clavier. Cela a été géré en présentant à l'utilisateur un "écran de clavier" comme ceci:
Le « pointeur de caractère » commencerait sur la lettre A. L'utilisateur naviguerait à chaque caractère désiré avec le D-Pad quatre boutons de ( UP
, DOWN
, LEFT
et RIGHT
), puis appuyez sur BUTTON A
pour ajouter à la chaîne finale.
Notez s'il vous plaît:
- La grille s'enroule , donc appuyer
UP
sur la lettre A vous amènera à T. - Le 'pointeur de caractère' reste en place après avoir ajouté une lettre
Le défi
Le clavier ci-dessus a des options pour changer la casse et a une forme irrégulière. Donc, pour plus de simplicité, dans ce défi, nous utiliserons le clavier suivant (le coin inférieur droit est le caractère ASCII 32, un espace):
A B C D E F G
H I J K L M N
O P Q R S T U
V W X Y Z .
Taper sur des claviers comme celui-ci est extrêmement lent - donc, pour rendre cela plus facile, votre tâche consiste à écrire un programme qui indique à l'utilisateur le moyen le plus rapide possible de taper une chaîne donnée. S'il existe plusieurs moyens les plus rapides, il vous suffit d'en afficher un.
La clé de sortie doit être:
>
pourRIGHT
<
pourLEFT
^
pourUP
v
pourDOWN
.
pourBUTTON A
(ajouter la lettre actuelle à la chaîne)
Par exemple, une fois donnée la chaîne DENNIS
, la solution ressemblerait à ceci:
>>>.>.>>v..>>.>>>v.
Règles / Détails
- N'oubliez pas, la grille s'enroule!
- Vous pouvez soumettre un programme complet ou une fonction, tant qu'il prend la chaîne initiale et produit une chaîne de solution. Les espaces blancs / sauts de ligne ne sont pas pertinents tant que la sortie est correcte.
- Vous pouvez supposer que la saisie se composera uniquement de caractères saisissables sur le clavier spécifié, mais elle peut être vide.
- C'est le code-golf , donc le code le plus court l'emporte. Les échappatoires de code-golf standard s'appliquent.
Cas de test
Il existe généralement plusieurs solutions de même longueur. Pour chaque cas de test, j'ai inclus la longueur optimale et un exemple. Vous n'avez pas besoin d'imprimer la longueur dans votre réponse, juste la solution.
FLP.TKC -> 25 steps: <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX -> 23 steps: <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM -> 18 steps: <<.<..<vv.>.>>.<^.
MEGO -> 14 steps: <<v.<^.>>.>vv.
A CAT -> 17 steps: .<^.>>>v.<<.<<vv.
BOB -> 10 steps: >.<vv.>^^.
(space) -> 3 steps: <^.
(empty) -> 0 steps: (empty)
Vous pouvez voir mon générateur de testcase sur repl.it - veuillez m'informer s'il y a des bugs.
Merci à tous pour les soumissions! L'utilisateur ngn est actuellement le gagnant avec 61 octets, mais si quelqu'un peut trouver une solution plus courte, la petite coche verte peut être déplacée;)
Réponses:
Dyalog APL , 61 octets
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
suppose
⎕IO←0
⎕a,'.'
l'alphabet suivi d'un point⍵⍳⍨
trouver les caractères de l'argument en tant qu'indices 0..26 (' '
et tous les autres seront 27)⍺⊤
encoder en base 7 (notez que l'argument de gauche⍺
est lié à4 7
), obtenez une matrice 2 × n0,
ajouter des zéros à gauche2-/
différences entre les colonnes adjacentes↓
diviser la matrice en une paire de vecteursa←⍺|
les prendre respectivement modulo 4 et 7, assigner àa
b←a⌊⍺-a
faireb
le plus petit dea
et son inverse modulaire'^v' '<>'⌷¨⍨⊂¨a>b
choisissez^
ouv
pour le premier vecteur et<
ou>
pour le second, en fonction de l'endroit oùa
diffère deb
b⍴¨¨
répéter chacune de cesb
fois⍉↑
mélanger les deux vecteurs dans une seule matrice et la transposer, obtenir une matrice n × 2'.',⍨
ajouter.
-s à droite∊
aplatirla source
JavaScript (ES6), 147 octets
Un comportement intéressant de
substring
est qu'il échange les arguments si le second est inférieur au premier. Cela signifie que si je calcule le nombre optimal de pressions gauche / droite comme un nombre compris entre -3 et 3, je peux ajouter 3 et prendre la sous-chaîne de<<<>>>
départ à 3 et j'obtiendrai le nombre correct de flèches. Pendant ce temps, les pressions vers le bas / haut sont simplement gérées en recherchant un tableau en utilisant un bit à bit et de la différence dans les lignes avec 3; cette façon est légèrement plus courte car il y a moins d'éléments de tableau.la source
Rubis, 107 octets
Non testé dans le programme de test
la source
Mathematica, 193 octets
Le golf
Lisible
la source
Python 2, 298 octets
C'est plus long qu'il ne devrait l'être, mais ...
Toute aide serait grandement appréciée!
Prend la saisie entre guillemets.
l
renvoie l'emplacement d'un caractère sur le clavier.Les deux
if
instructions au milieu ded
sont pour vérifier s'il serait optimal de «boucler» autour du clavier.L'entrée y
s
a été"A"
ajoutée car la position initiale du curseur estA
.Nous parcourons la chaîne par paires, en éliminant la dernière (qui n'est pas une paire
[:-1]
:), en trouvant la distance minimale entre les deux moitiés de la paire.Merci à Flp.Tkc de m'avoir dit que je peux faire
a=abs
au lieu de le dire àabs
chaque fois!la source
Java 8, 1045 octets
Le golf
Lisible
Explication
La solution est une approche directe: une force brute mal optimisée. La méthode
g(...)
est une première recherche de profondeur de base passant par chaque permutation (haut, bas, gauche, droite). Avec quelques légères modifications dans la commande des cas de test, j'obtiens la sortie:la source