[VimGolf] 添加引号
题目链接
题目说明
添加引号。
开始文件
foo = a
ab
abc
结束文件
foo = "a"
"ab"
"abc"
最佳分数
10
我的分数
14
:%s/a.*/"&"<CR>ZZ
第一次尝试
直接替换试试。
:%s/a.*/"&"<CR>ZZ
14 分,差 4 分。替换的话应该没法优化了
第二次尝试
用宏试试。
qqwwcw""<Esc>Pq2@qZZ
16 分,还多了。
第三次尝试
用列选择模式试试。
$<C-Q>GI"<Esc><C-Q>G$A"<Esc>ZZ
也是 14 分。
第四次尝试
感觉上边哪一种方法都不好优化。
用宏的还可以稍微优化一下。
qqwwC""<Esc>Pq2@qZZ
但这样还 15 分,比其他两种方法还高。
第五次尝试
又想到一种方法,用今天刚学的 <C-R><C-O>
。
$C"<C-R><C-O>""<Esc>w.w.ZZ
不过还是 14 分,怎么都是 14 分?
第六次尝试
算了,还是直接看吧。
@BunkieWang
$<C-V>G$I"<Esc>gvA<C-@>ZZ
13 分。用列模式做的,重点是最后的 <C-@>
,输入上次插入的内容,减了 1 分。
第七次尝试
没想到还能怎么优化。
@mcr05
ta<C-V>2jA"<Esc>$.ZZ
12 分。ta
是定位到 a 之前的空格,然后进入列可视模式,2j
就是选择这一列,不用 G
是因为 G
之后选择的就不只是一列了。A"
在空格后添加 ",$
定位到行尾,这些都很平常。重点是为什么这个 .
就能为行尾添加上 "?因为前边是列选择模式,操作了多行,后边重复之前的操作,也会操作同样多的行。这一点我之前确实没注意。
那我想到一个优化的方法。没必要定位到 a 之前的空格再处理,只需要把列选择的后界放在那就行。
<C-Q>GhA"<Esc>$.ZZ
10 分!不过这个也很明显了,其他人也都是这么做的。
最佳操作
<C-Q>GhA"<Esc>$.ZZ
实用操作
<C-Q>GhA"<Esc>$.ZZ
10 分。解决这个特定场景的问题,确实简单明了。
:%s/a.*/"&"<CR>ZZ
14 分。直接替换更灵活通用,a.*
可以根据实际情况换成别的。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。