[VimGolf] 将文本中的占位符替换成连续数字
题目链接
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 分。
这个就是最佳操作,实用性还是可以的,通用性也不算差,不依赖特定文件的格式,只是不那么直观,步骤也稍多,新手的话很难熟练使用。
因为这个题目的操作比较复杂,上边三个实用操作都不是很直白好学,更直白的操作灵活性欠佳(比如多次手动替换,麻烦而且更依赖特定文件格式),就不够实用了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。