Sur les consoles de jeux modernes et autres appareils sans claviers traditionnels, essayer de saisir du texte est un cauchemar. Devoir taper avec quelques boutons et un joystick sur un clavier virtuel est ennuyeux, et j'aime faire le moins de mouvements / pressions de bouton possible.
Le clavier que vous utiliserez ressemble à ceci:
+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
+---+---+---+---+---+---+---+---+---+---+
| q | w | e | r | t | y | u | i | o | p |
+---+---+---+---+---+---+---+---+---+---+
| a | s | d | f | g | h | j | k | l | - |
+---+---+---+---+---+---+---+---+---+---+
| z | x | c | v | b | n | m | _ | @ | . |
+---+---+---+---+---+---+---+---+---+---+
Les opérations suivantes peuvent être utilisées:
L
: déplacer un carré vers la gauche du clavier (retour à la ligne)R
: déplacer un carré vers la droite du clavier (retour à la ligne)U
: déplacer un carré vers le haut sur le clavier (retour à la ligne)D
: déplacer un carré vers le bas sur le clavier (retour à la ligne)Y
: insérer un espaceB
: déplace le pointeur d'insertion d'un espace vers la gauche (ne fait rien si le pointeur est au début)F
: déplace le pointeur d'insertion d'un espace vers la droite (ne fait rien si le pointeur est à la fin)C
: basculer le verrouillage des majusculesA
: insère le caractère sélectionné à la position du pointeur d'insertion
Étant donné une chaîne d'entrée contenant uniquement des caractères ASCII pouvant être saisis à l'aide du clavier et des commandes (correspondances [a-zA-Z0-9 [email protected]]*
) ci-dessus , émettez une séquence de commandes qui aboutira à la chaîne de sortie. La position initiale du curseur se trouve sur la 1
touche (en haut à gauche) et le verrouillage des majuscules est initialement désactivé.
Notation
Pour une chaîne donnée, une approche naïve serait, pour chaque caractère de la chaîne, de naviguer jusqu'au caractère du clavier par le chemin le plus court, de basculer le verrouillage des majuscules si nécessaire et de sélectionner le caractère. Une telle approche naïve générerait une commande de longueur (length of input string) + (sum of Manhattan distances on keyboard between consecutive non-space characters) + (number of times the string alternates between lowercase and uppercase characters) + (1 if string starts with an uppercase letter else 0)
. Par exemple, l'approche naïve pour 101
entraînerait ALARA
une commande de longueur 5 et Noob 5
entraînerait DDDRRRRRCAUURRRCAADDLLLLAYUUUA
une commande de longueur 30.
Votre soumission, cependant, cherche à faire mieux que l'approche naïve. Pour chaque chaîne d'entrée, votre soumission recevra des points égaux au nombre de commandes que l'approche naïve utilise moins le nombre de commandes sorties par votre soumission. Votre score global sera la somme des scores individuels.
Règles
- Les soumissions seront exécutées sur un espace de travail virtuel gratuit Cloud9 . L'espace de travail a 512 Mo de RAM, 2 Go d'espace disque, 8 processeurs Intel (R) Xeon (R) à 2,50 GHz (les informations complètes sur le processeur, trouvées en exécutant
cat /proc/cpuinfo
, peuvent être trouvées ici ), et exécutent Ubuntu 14 bits 64 bits. Sûr. Vous pouvez demander l'accès à l' espace de travail de test afin d'exécuter et de noter votre soumission, ou je peux le noter pour vous. - Les soumissions seront exécutées une fois par cas de test. Le stockage de l'état entre les exécutions est interdit. Les soumissions ne peuvent pas écrire ou lire à partir de fichiers autres que le fichier source (qui ne peuvent pas être modifiés entre les exécutions), à l'exception possible de la lecture d'un fichier d'entrée si nécessaire.
- Les soumissions sont limitées à 1 minute d'exécution pour chaque scénario de test. Les soumissions peuvent produire plusieurs solutions, mais seule la dernière solution valide dans le délai imparti sera utilisée pour la notation. Le fait de ne pas produire de solutions valides dans le délai imparti entraînera un score de 0 pour ce cas de test.
- Veuillez inclure des instructions sur la façon d'appeler votre soumission, ainsi que tous les outils / bibliothèques qui doivent être installés qui ne sont pas inclus avec une installation standard d'Ubuntu 14.04.
- Le gagnant sera la soumission avec le plus grand score. En cas d'égalité, la soumission avec la meilleure complexité algorithmique l'emportera. Si l'égalité n'est toujours pas résolue, la première soumission à atteindre le score et la complexité algorithmique l'emportera.
- Les soumissions peuvent ne pas être optimisées pour les cas de test. Je me réserve le droit de modifier les cas de test si je pense qu'il y a un besoin.
Cas de test
Format: input string => naive score
(si vous voyez des erreurs dans ces derniers, veuillez laisser un commentaire avec la correction)
101 => 5
quip => 12
PPCG => 15
Mego => 25
Noob 5 => 26
penguin => 27
867-5309 => 32
2_sPoOkY_4_mE => 60
The Nineteenth Byte => 76
[email protected] => 95
8xM3R__5ltZgrkJ.-W b => 98
correcthorsebatterystaple => 104
verylongRUNSOFCAPSandnocaps => 118
This is an English sentence. => 122
WNtza.akjzSP2GI0V9X .0epmUQ-mo => 131
Programming Puzzles and Code Golf => 140
Réponses:
C
Le score est de 193.
Compilez avec comme "gcc virtualKeyboard.c". Exécutez-le sans arguments "./a.out". Il lit l'entrée de stdin et écrit la sortie dans stdout.
la source
C99
Voici ma tentative de solution. Obtenu un score de 62.
Semblait fonctionner correctement pour les mots plus petits et j'ai juste supposé que les plus grands fonctionnent correctement aussi car ils sont trop gros pour que je puisse les tester manuellement.
Compiler avec "gcc -std = gnu99" L'
utilisation est "virtualKeyboard" string ""
la source
Noob 5
estRRRRRUCALCAYRRRRARRRRDBBBAA
, qui produitN33b @
, et votre deuxième sortie pourLLDAAYRRRRAUBBARBBBCA
, qui produit4oo3 e
. En l'état, votre score actuel est de 5, car votre programme imprime uniquement des séquences de commandes valides pour les 3 premiers cas de test.