题目链接

Replace pattern with 1, 2, 3, ... on each line

题目说明

将文本中的 $ 占位符替换成连续数字。

开始文件

I can't see the $ for all the $,
But there $ not $ $ tomorrow.
$ she can do $ and 4,
$ the $ in the $ and $ the $.

结束文件

I can't see the 1 for all the 2,
But there 1 not 2 3 tomorrow.
1 she can do 2 and 4,
1 the 2 in the 3 and 4 the 5.

最佳分数

21

我的分数

31

:%s/\$/1<CR>:<C-P><BS>2<CR>:<C-P><BS>3<CR>:<C-P><BS>4<CR>:<C-P><BS>5<CR>ZZ

第一次尝试

看起来这个得用宏来写,或者用表达式寄存器,反正不是很好写,写完了也不好优化。先用笨方法吧,替换五次。

:%s/\$/1<CR>:<C-P><BS>2<CR>:<C-P><BS>3<CR>:<C-P><BS>4<CR>:<C-P><BS>5<CR>ZZ

31 分,差 10 分,肯定不能在这个基础上优化。

第二次尝试

宏的话还得写两个,一个用来处理每一个 $,另一个用来处理每一行,感觉也短不了啊,有点麻烦不想写(好像也不会写)。

算了,直接看吧。

@ayy_ess_

:%s/\$/1<CR>:<Up><BS>2<CR>:<Up><BS>3<CR>:<Up><BS>4<CR>f$r5ZZ

30 分。思路和我的基本一样啊,就最后一个 5 稍微优化了一下,减了 1 分。那我从 4 开始优化。

:%s/\$/1<CR>:<C-P><BS>2<CR>:<C-P><BS>3<CR>f$r4;r5ZZ

这样就 28 分了。不过很难继续优化了。

第三次尝试

还是继续看吧。

@jeremcs

:%s/\$/1<CR>:<Up><BS>2<CR>:<Up><BS>3<CR>nr4nr5ZZ

27 分,居然还是用的类似方法。好吧,用 n 代替了 f$,因为 :s 搜索的也是 $,这样能减 1 分。但感觉这就是死胡同啊,还能减吗?

另外我看到用寄存器的了,虽然是 28 分的,但值得学习一下。

@lilwayne15561

:let@a=@a+1|%s'\$'\=@a<CR>4@:ZZ

let@a=@a+1 是给 a 寄存器加一,因为最开始时是空的,会被当成 0。然后 %s'\$'\=@a 就是把 $ 替换成这个寄存器,' 换成 / 也一样。最后再调用 4 次。挺方便的,不知道还能不能继续优化了。

第四次尝试

继续看。

@__Seve__

:%s/\$/1<CR>qa:<C->Fb<C->A<CR>q3@aZZ

直接到 24 分了。这个操作可以说是异想天开了,不过确实很有用。:%s/\$/1<CR> 这个和上边的没区别,先把第一个 $ 改了。然后就可以开眼了,:<C-F> 是打开命令行的历史窗口,b 是定位到刚执行过的命令上,正好在 1 上,<C-A> 把它加一,所有这些都被录成了宏。最后调用这个宏 3 次。唯一的问题在于显示得比较奇怪,我自己执行是这样的。

:%s/\$/1<CR>qa:<C-F>b<C-A><CR>q3@aZZ

而且不是 24 分,而是 22 分,可能他的终端环境有什么问题吧。那么现在就差 1 分了,很可能也是在这个基础上优化的。不过不像哪里可以优化。

第五次尝试

直接看最低分的操作吧。

@Sakigw

5O:%s:\$:0<Esc>VHg<C-A>5D@"ZZ

这位老兄我已经看到过好多次了……21 分,分析下吧。注意 5 后边是大写的 O,而不是数字 0。这操作简直可以用出神入化来形容,建议你自己输入体验一下。

5O:%s:\$:0<Esc> 是输入 5 行 :%s:\$:0,就是一个替换命令。直接在文本里写命令,而且一次写一排,我还第一次见。VH 是把这 5 行命令选上,g<C-A> 是依次增加选定行的第一个数字,第 1 行的加一,第 2 行的加二,以此类推。处理完就变成这样了:

:%s:\$:1
:%s:\$:2
:%s:\$:3
:%s:\$:4
:%s:\$:5

5D 是把这 5 行剪切了,@" 是把这刚剪切的内容作为宏调用,也就是运行这 5 行代码,结果就很明显了。这个可不是看一次就能活学活用的,慢慢练习吧。

最佳操作

@Sakigw

5O:%s:\$:0<Esc>VHg<C-A>5D@"ZZ

实用操作

:%s/\$/1<CR>qa:<C-F>b<C-A><CR>q3@aZZ

22 分。

虽然比最佳操作多 1 分,但这个比较通用,更好输入,灵活性也更强,比如可以轻松改成递增 2。

@lilwayne15561

:let@a=@a+1|%s'\$'\=@a<CR>4@:ZZ

28 分。

这个方法也是通用的,虽然按键多了些,但理解起来很容易,而且更加灵活,比如可以轻易添加更复杂的逻辑。

@Sakigw

5O:%s:\$:0<Esc>VHg<C-A>5D@"ZZ

21 分。

这个就是最佳操作,实用性还是可以的,通用性也不算差,不依赖特定文件的格式,只是不那么直观,步骤也稍多,新手的话很难熟练使用。

因为这个题目的操作比较复杂,上边三个实用操作都不是很直白好学,更直白的操作灵活性欠佳(比如多次手动替换,麻烦而且更依赖特定文件格式),就不够实用了。

文章目录