题目链接

I forgot quotes

题目说明

添加引号。

开始文件

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.* 可以根据实际情况换成别的。

文章目录