Le puzzle:
Considérez un jeu console / portable avec un d-pad où vous devez entrer un nom en quelque sorte. Cela est apparu dans de nombreux jeux plus anciens avant que l'utilisation de QWERTY ne soit popularisée dans les consoles (par exemple, je pense que la Wii utilise une disposition de clavier QWERTY pour la saisie). En règle générale, le clavier à l'écran ressemble à l'effet de *:
Défaut:
0 1 2 3 4 5 6 7 8 9
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 _ + ^ =
Avec le boîtier basculé:
0 1 2 3 4 5 6 7 8 9
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 - + ^ =
Autrement dit, toutes les clés alphanumériques et les éléments suivants:
_
: Un seul espace
-
: Un tiret
+
: Changer la casse pour la lettre suivante uniquement
^
: Basculer le verrouillage des majuscules (c'est-à-dire, changer la casse de toutes les lettres)
=
: Entrer, terminer
* Évidemment, j'ai remplacé des clés comme "BKSP" et "ENTER" par des versions plus courtes
Et puis le matériel comprendrait un d-pad (ou une certaine forme de contrôle où vous pouvez aller up
, down
, left
et right
)
L'écran vous permet également généralement de passer d'un côté directement à l'autre. Autrement dit, si vous étiez concentré sur la lettre J
, appuyer sur right
vous permettrait de passer à la lettre A
.
Chaque fois que je saisissais mon nom, j'essayais toujours de trouver le moyen le plus rapide de le faire.
Objectif:
Votre programme prendra une entrée de chaîne qui peut inclure n'importe quel caractère alphanumérique, y compris un espace et un trait d'union, et votre objectif est de produire le plus petit nombre de touches sur le pavé numérique pour sortir la chaîne requise.
Considérations:
Vous n'avez pas besoin d'inclure la touche enfoncée pour appuyer sur le caractère réel.
La mise au point commence toujours à la toucheA
Entrée =
doit être enfoncée à la fin
Exemple:
input: Code Golf
output: 43
Expliqué:
A
-> C
= 2
C
-> ^
= 6 (se déplaçant vers la gauche)
^
-> o
= 5
o
-> d
= 2
d
-> e
= 1
e
-> +
= 5
+
-> _
= 1
_
-> +
= 1
+
-> G
= 3
G
-> o
= 3
o
-> l
= 3
l
-> f
= 5
f
-> =
= 6
Notez qu'il est plus rapide de frapper +
deux fois pour a _
et a G
que de frapper ^
une fois, puis de revenir en arrière.
La soumission gagnante (je vais autoriser au moins 1w) sera la solution la plus courte (en octets). Comme c'est ma première question, j'espère que c'est clair et pas trop difficile.
Réponses:
Rubis (369 octets)
Prend l'entrée de la ligne de commande.
Sauvegardé un tas d'octets grâce à @Charlie :)
la source
j=(K.index(c.upcase) or 36)
peut être remplacé parj=K.index(c.upcase)||36
pour économiser 4 octets.def d(x,y)
peut être remplacé pardef d x,y
pour enregistrer un octet, et il en va de mêmedef v
.v(...) if
àv(...)if
un autre octet. Sur la dernière ligne,v(...)
peut être remplacé parv ...
pour enregistrer 1 octet ettrue
par!!0
pour enregistrer un autre octet.&&
par&
et||
par|
.K=...
) peut être remplacée par une plage (K='0123456789'+('A'..'Z').to_a.join+' +^='
)Swift 1.2,
812588670 octetsEdit: Suppression de 224 octets en remplaçant les grands tableaux de nombres par une plage et en le convertissant à la place en tableau.
Edit2: Ajout d'une boucle verticale
Pour l'exécuter, placez le code dans un
.swift
fichier et exécutez-le avecswift <filename> <your name>
Cela utilise l'approche simple où les deux «claviers» sont stockés sous forme de tableaux.
B:(I)->(I,I)={a in(a%10,a/10)}
Convertit un index du tableau en position x, y sur le clavier virtuel.func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f) return abs(d-b)+min(abs(c-a),abs(10-(c-a)))}
Prend un index de début / fin et renvoie le nombre minimum de mouvements pour passer d'une fois à l'autre (en tenant compte de l'habillage horizontal)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
Est la fonction récursive principale qui effectue la plupart des calculs. Il calcule la distance entre la position actuelle au caractère cible, à moins que le cas devrait changer, il calcule à la fois le déplacement et les bouchons de verrouillage des méthodes et prend la plus petite.swift codegolf.swift Code Golf
Impressions en cours d'exécution43
la source
Python
679661619602589576539520496482 octetsExécutez ceci et il demandera une entrée (sans texte d'invite). Pour l'entrée,
Code Golf
il imprime43
.Programme complet:
Sortie étendue du programme complet:
la source
C 675 octets
Prend l'entrée de l'argument de ligne de commande. Utilise récursif principal:
la source