Inversez chaque mot d'une ligne dans vim

9

Votre tâche consiste à créer un script vim ou à fournir une séquence de touches qui fonctionnera sur une seule ligne de texte avec jusqu'à 140 caractères ASCII imprimables (n'importe où dans un fichier, avec le curseur commençant n'importe où sur la ligne) et inversez chaque espace - chaîne séparée dans la phrase tout en gardant les chaînes dans le même ordre.

Par exemple, l'entrée:

roF emos nosaer m'I gnisu a retcarahc-041 timil no siht noitseuq neve hguoht ti t'nseod evlovni .rettiwT RACECAR  

devrait retourner:

For some reason I'm using a 140-character limit on this question even though it doesn't involve Twitter. RACECAR  

Le script avec le moins de caractères ou la séquence du moins de touches pour atteindre ce résultat est le gagnant.

Joe Z.
la source
1
"Aux fins de cette question, c'est uniquement vim" semble une restriction de langage aussi arbitraire que de publier un défi de golf de code normal et de demander uniquement des réponses en C. ( Et je ne semble pas être seul avec cette opinion. )
Martin Ender
27
Pourquoi RACECAR n'est-il pas inversé?
orlp
3
Parce que c'est un palindrome. Essayez de l'inverser vous-même.
Joe Z.
2
Wow, je suis stupide. Derp.
orlp
7
@orlp Lol. Je pensais que tu plaisantais.
mbomb007

Réponses:

9

28 25 24 touches

:se ri<CR>^qqct <C-r>"<Esc>f l@qq@q

Macro récursive, je suppose que Ctrl- rcompte comme une frappe.

Le plus difficile a été de s'assurer que la macro reste sur la même ligne et ne détruit pas le reste du fichier.

orlp
la source
Vous pouvez utiliser à la cEplace de ct , si cela ne met pas fin à la macro. Mais vous pouvez utiliser Wau lieu de f lpour enregistrer 2 coups.
Caek
@Caek Wrong x2. Devinez quoi cEfaire lorsque le curseur est au début de a retcarahc-041? Et devinez quoi Wfaire quand nous sommes à la fin de la ligne?
orlp
Notez le capital E. les minuscules eiraient jusqu'au tiret, les majuscules Eiraient jusqu'au prochain espace. Je viens de l'essayer pour confirmer.
Caek
essayez: :set ri<Enter>^qqct <C-r>"<Esc>W@qq@qpour 23.
Caek
@Caek Cela ne fonctionnera pas. Et en ce qui concerne E, je sais ce que cela fait. Je faisais allusion à ce qui cE<C-r><Esc>se transformerait a retcarahc-041en 140-character a, AKA cela échangerait les mots.
orlp
3

24 touches

ma:s/ /\r/g
V'a:!rev
gvJ

Je sais que cette question est très ancienne, mais j'aime vimgolf, donc je ne pouvais pas ne pas poster de réponse sur l'un des rares défis spécifiques à vim sur le site. De plus, cette solution est liée à celle d'Orlp.

Tout comme Orlp l'a dit, la partie la plus difficile était de s'assurer que le reste du tampon n'était pas modifié. Sans cette restriction, nous pourrions simplement faire:

:s/ /\r/g
!{rev
V}J

(19 frappes) mais nous avons besoin d'un peu plus pour le garder en sécurité. Cela suppose un environnement Unix.

James
la source