Odwróć każde słowo w linii w vimie

9

Twoim zadaniem jest zbudowanie skryptu vim lub zapewnienie sekwencji naciśnięć klawiszy, które będą działały w jednym wierszu tekstu z maksymalnie 140 drukowalnymi znakami ASCII (w dowolnym miejscu pliku, z kursorem rozpoczynającym się w dowolnym miejscu w linii) i odwracają każdą spację oddzielony ciąg w zdaniu, utrzymując ciągi w tej samej kolejności.

Na przykład dane wejściowe:

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

powinien zwrócić:

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

Zwycięzcą jest skrypt z najmniejszą liczbą znaków lub sekwencja najmniejszej liczby naciśnięć klawiszy, aby osiągnąć ten wynik.

Joe Z.
źródło
1
„Na potrzeby tego pytania jest to tylko vim” wydaje się tak arbitralnym ograniczeniem językowym, jak publikowanie normalnego wyzwania golfowego i proszenie tylko o odpowiedzi w C. ( I nie wydaje mi się, że jestem sam z tą opinią. )
Martin Ender
27
Dlaczego RACECAR nie jest cofany?
orlp
3
Ponieważ to jest palindrom. Spróbuj to odwrócić samodzielnie.
Joe Z.
2
Wow, jestem głupia. Derp.
orlp
7
@orlp Lol. Myślałem, że żartujesz.
mbomb007

Odpowiedzi:

9

28 25 24 naciśnięcia klawiszy

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

Zakładam, że makro rekurencyjne Ctrl- rliczy się jako jedno naciśnięcie klawisza.

Najtrudniejsze było upewnienie się, że makro pozostaje w tej samej linii i nie niszczy reszty pliku.

orlp
źródło
Możesz użyć cEzamiast ct , jeśli to nie kończyło makra. Ale można użyć Wzamiast f lzaoszczędzić 2 uderzeń.
Caek
@Caek Wrong x2. Zgadnij, co cErobi, gdy kursor znajduje się na początku a retcarahc-041? I zgadnij, co Wrobi, kiedy jesteśmy na końcu linii?
orlp
Zwróć uwagę na stolicę E. małe litery ebędą szły do ​​kreski, stolica Eszłyby do następnej przestrzeni. Właśnie próbowałem to potwierdzić.
Caek
spróbuj: :set ri<Enter>^qqct <C-r>"<Esc>W@qq@qza 23.
Caek
@ Caek To nie zadziała. A jeśli chodzi o to E, wiem co to robi. Mówiłem o tym, cE<C-r><Esc>że zamieni się a retcarahc-041w 140-character a, AKA zamieni słowa.
orlp
3

24 naciśnięcia klawiszy

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

Wiem, że to pytanie jest bardzo stary, ale uwielbiam vimgolf więc nie mogłam nie pisać odpowiedź na jedną z kilku specyficznych wyzwań vim na miejscu. Ponadto to rozwiązanie jest powiązane z rozwiązaniami firmy Orlp.

Tak jak powiedział Orlp, najtrudniejszą częścią było upewnienie się, że reszta bufora nie została zmodyfikowana. Gdyby nie to ograniczenie, moglibyśmy po prostu zrobić:

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

(19 klawiszy), ale potrzebujemy trochę więcej, aby zachować bezpieczeństwo bufora. To zakłada środowisko unixowe.

James
źródło