反转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回答一样。(而且我似乎并不孤单。
Martin Ender 2015年

27
为什么RACECAR不能逆转?
orlp

3
因为它是回文。尝试自己扭转。
Joe Z.

2
哇,我很傻。德普
orlp 2015年

7
@orlp哈哈。我以为你在开玩笑。
mbomb007'3

Answers:


9

28 25 24击键

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

递归宏,我假设Ctrl- r算作一次按键。

最难的部分是确保宏保持在同一行上,并且不会破坏文件的其余部分。


如果未结束宏,则可以使用cE代替ct 。但是您可以使用W而不是f l保存2笔画。
Caek 2015年

@Caek错误x2。猜猜cE光标在开始处是a retcarahc-041什么?猜猜W我们在行尾时会做什么?
orlp 2015年

注意资本E。小写字母e将一直到破折号,大写字母将直到E下一个空格。我只是尝试确认一下。
Caek 2015年

尝试::set ri<Enter>^qqct <C-r>"<Esc>W@qq@q为23
CAEK

@Caek 那行不通。关于E,我知道它的作用。我指的是cE<C-r><Esc>它将a retcarahc-041变成140-character a,也就是它将交换单词。
2015年

3

24次按键

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

我知道这个问题是很老了,但是我爱vimgolf所以我不能没有对网站上的一些VIM特定的挑战之一张贴一个答案。另外,此解决方案与Orlp捆绑在一起。

就像Orlp所说的那样,最困难的部分是确保缓冲区的其余部分未被修改。如果不是那个限制,我们可以简单地做:

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

(19次击键),但我们还需要更多一点以使其保持缓冲区安全。这是在unix环境下进行的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.