Переверните каждое слово в строке в vim

9

Ваша задача - создать скрипт vim или предоставить последовательность нажатий клавиш, которая будет работать с одной строкой текста, содержащей до 140 печатных символов ASCII (в любом месте файла, с курсором, начинающимся в любом месте строки), и реверсировать каждый пробел. разделенная строка в предложении, сохраняя строки в том же порядке.

Например, вход:

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

должен вернуть:

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

Сценарий с наименьшим количеством символов или последовательность наименьших нажатий клавиш для достижения этого результата является победителем.

Джо З.
источник
1
«Для целей этого вопроса это только vim» кажется таким же произвольным языковым ограничением, как и публикация нормального кода для игры в гольф и просьба только о ответах на языке C. ( И я, кажется, не одинока с этим мнением. )
Мартин Конец
27
Почему RACECAR не полностью изменен?
orlp
3
Потому что это палиндром. Попробуйте изменить это самостоятельно.
Джо З.
2
Вау, я тупой Derp.
orlp
7
@ или Lol. Я думал, что ты шутишь.
mbomb007

Ответы:

9

28 25 24 нажатия клавиш

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

Рекурсивный макрос, я предполагаю, что Ctrl- rсчитается одним нажатием клавиши.

Самым сложным было убедиться, что макрос остается в одной строке и не разрушает остальную часть файла.

orlp
источник
Вы можете использовать cEвместо ct , если это не заканчивается макрос. Но вы можете использовать Wвместо того, f lчтобы сохранить 2 ударов.
Caek
@Caek Неправильно x2. Угадайте, что cEпроисходит, когда курсор находится в начале a retcarahc-041? И угадайте, что Wделать, когда мы в конце строки?
orlp
Обратите внимание на столицу E. строчные буквы eбудут идти до тире, прописные - Eдо следующего пробела. Я просто попытался это подтвердить.
Caek
попробуйте: :set ri<Enter>^qqct <C-r>"<Esc>W@qq@qза 23.
Caek
@Caek Это не сработает. А что касается E, я знаю, что он делает. Я имел в виду, что cE<C-r><Esc>это превратится a retcarahc-041в 140-character a, ака это поменяет слова.
orlp
3

24 нажатия клавиш

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

Я знаю, что этот вопрос очень старый, но я люблю vimgolf, поэтому я не мог не опубликовать ответ на одну из немногих специфических для vim задач на сайте. Плюс это решение связано с Orlp.

Как сказал Орлп, самой сложной задачей было убедиться, что оставшаяся часть буфера не изменена. Если бы не это ограничение, мы могли бы просто сделать:

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

(19 нажатий клавиш), но нам нужно немного больше, чтобы сохранить его в буфере. Это предполагает среду Unix.

Джеймс
источник