Nous savons tous que les programmeurs ont tendance à être paresseux. Afin de maximiser votre temps libre, vous décidez d'écrire un programme qui génère un nombre minimal de frappes pour le texte introduit.
Entrée : Texte à convertir en touches. Vous pouvez décider comment saisir le texte (STDIN / lecture d'un fichier fourni dans les arguments)
Sortie : Les actions nécessaires au format suivant:
- Ils doivent être numérotés
H
it: appuyer sur une touche et la relâcher immédiatementP
ress: appuyer sur une touche et ne pas la relâcher (ce ne sera jamais optimal lorsque la touche estR
relâchée lors de la prochaine frappe)R
elease: relâcher uneP
touche pressée
Exemple :
Contribution:
Hello!
Sortie:
Une solution naïve serait:
1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift
Ce serait plus efficace:
1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o
Environnement:
- L'éditeur utilise une police monospaced
- Le texte est enveloppé à 80 caractères
- La flèche vers le haut et la flèche vers le bas préservent la colonne, même s'il y a des lignes plus courtes entre les deux.
- Le presse-papiers est supposé vide
- Le verrouillage numérique est supposé être activé
- Le verrouillage des majuscules est supposé être désactivé
- La majuscule ne fonctionne que pour les lettres (c.-à-d. Pas de majuscule)
Touches de raccourci / raccourcis :
- Home: Aller au début de la ligne en cours
- End: Aller à la fin de la ligne en cours
- Ctrl+ A: Marquez tout
- Ctrl+ C: Copie
- Ctrl+ X: Couper
- Ctrl+ V: Coller
- Shift+ Déplacement du curseur: marquage
- Ctrl+ F: Ouvre une boîte de dialogue de recherche.
- Correspondance de texte stupide, pas d'expressions régulières
- Sensible aux majuscules et minuscules
- Recherches en boucle
- Saisie de texte sur une seule ligne pour la recherche
- L'entrée est préremplie avec la sélection actuelle, sauf s'il y a une nouvelle ligne entre les deux, l'entrée complète est sélectionnée
- Copier / Coller fonctionne comme d'habitude
- Appuyez sur pour Entereffectuer la recherche, en sélectionnant la première correspondance après la position actuelle du curseur.
- F3: Répéter la dernière recherche
- Ctrl+ H: Ouvre une boîte de dialogue de remplacement
- Correspondance de texte stupide, pas d'expressions régulières
- Sensible aux majuscules et minuscules
- Tout remplacer, avec une enveloppe
- Saisie de texte sur une seule ligne
- L'entrée de recherche est préremplie avec la sélection actuelle. Sauf s'il y a une nouvelle ligne entre les deux, l'entrée complète est sélectionnée.
- L'entrée de remplacement est vide
- Copier / Coller fonctionne comme d'habitude
- Tab saute à l'entrée de remplacement
- Appuyez sur pour Entereffectuer le remplacement complet. Le curseur est placé après le dernier remplacement
Règles :
- Les solutions doivent être un programme complet qui compile / analyse et exécute sans autre modification
- Le clavier affiché ci-dessus est le clavier à utiliser
- Il n'est pas nécessaire de gérer les caractères qui ne peuvent pas être saisis avec.
- Chaque clé doit être relâchée à la fin
- Le curseur n'a pas besoin d'être à la fin du fichier à la fin
Notation :
Votre score est la somme des actions nécessaires pour taper les textes suivants. Le gagnant est la solution avec le score le plus bas. J'utilise ma solution naïve 1371 + 833 + 2006 = 4210
. Batte-le! Je choisirai un gagnant dans deux semaines.
1 Ma solution naïve
number = 1
H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"
strokes = (text) ->
shiftActive = no
for char in text
if /^[a-z]$/.test char
if shiftActive
R "Shift"
shiftActive = no
H char
else if /^[A-Z]$/.test char
unless shiftActive
P "Shift"
shiftActive = yes
H char.toLowerCase()
else
table =
'~': '`'
'!': 1
'@': 2
'#': 3
'$': 4
'%': 5
'^': 6
'&': 7
'*': 8
'(': 9
')': 0
'_': '-'
'+': '='
'|': '\\'
'<': ','
'>': '.'
'?': '/'
':': ';'
'"': "'"
'{': '['
'}': ']'
if table[char]?
unless shiftActive
P "Shift"
shiftActive = yes
H table[char]
else
H switch char
when " " then "Space"
when "\n" then "Enter"
when "\t" then "Tab"
else
if shiftActive
R "Shift"
shiftActive = no
char
R "Shift" if shiftActive
input = ""
process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input
2 répétition facile
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
3 répétition plus complexe
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Vous pouvez utiliser le programme de relecture que j'ai écrit pour tester vos solutions (Remarque: il ne prend pas encore en charge la recherche / remplacement, tout le reste devrait fonctionner).
la source
Réponses:
Haskell 1309 + 457 + 1618 = 3384
Enfin, une réponse (le score s’est considérablement amélioré une fois que j’ai réalisé qu’il y avait des onglets dans votre premier test: il fallait éditer la question pour voir ceux-ci). Compiler avec
ghc
, entrée de fourniture sur stdin. Exemple:J’ai essayé des choses évidentes comme Dijkstra, mais c’était beaucoup trop lent, même après avoir réduit le branchement aux seuls mouvements utiles, à savoir: afficher la clé suivante ou copier depuis le début de la ligne (Maj + Début, Ctrl + C, Fin), ou coller.
Ainsi, cette approche utilise un presse-papiers de longueur fixe, copie lorsqu'un préfixe de ligne est sur le point de devenir "utile", et continue à utiliser ce préfixe tant qu'il est possible de le coller sur plus de lignes que les préfixes des lignes qu'il atteint ensuite. Lorsqu'il ne peut pas utiliser le Presse-papiers, il a recours à la solution naïve. Il est donc garanti de le vaincre une fois que la longueur choisie dépasse le coût d'une copie.
Le score minimum est atteint lorsque la longueur du préfixe est choisie pour correspondre à "Je ne vais jamais". Il existe des moyens d'améliorer la situation, mais j'en ai assez de lire Rick Astley.
la source