Vim高尔夫挑战'Remember FizzBuzz?' Vim 语法解释



我一路向上(或者向下,如果你愿意的话(达到了《记住FizzBuzz吗?在VimGolf,但我很难解释解决方案:

33o<CR> Fizz<CR><C-H><Esc><C-V>A4k<C-H>.@.<C-U>Buzz<Esc>@.<C-V>GI0<Esc>gvg<C-A>ZZ

我了解

添加带有"Fizz"–33o<CR> Fizz<CR><C-H><Esc>–加上前面行号的末尾–<C-V>GI0<Esc>gvg<C-A>ZZ

但我不了解

中间部分;嗡嗡声";添加行,即<C-V>A4k<C-H>.@.<C-U>Buzz<Esc>@.4k<C-H>将光标移动到正确的位置,最后一个@.执行.寄存器的内容,但这是我所能理解的。

有人能解释一下这里使用的Vim魔法吗?🧙‍♂️

第一部分:

33o<CR> Fizz<CR><C-H><Esc>

Fizz放在每一行3的倍数上,解决了FizzBuzz的第一个要求。它完成了33次迭代:

  1. 跳过空行
  2. 将CCD_ 9置于下一行
  3. 打开空线
  4. 离开插入模式

在第1行之后添加了33个3行的块,因此总共有100行,光标留在第100行。

参见:help o

第二部分:

<C-V>A4k<C-H>.@.<C-U>Buzz<Esc>

本质上创建了一个递归宏,将Buzz附加到5的倍数行中,有助于解决FizzBuzz的第二和第三个需求。

详细信息:

  1. <C-v>A开始插入第2列,与第1部分的Fizzs对齐
  2. 插入CCD_ 14
  3. 执行CCD_ 15以删除CCD_
  4. 插入CCD_ 17
  5. 执行CCD_ 18以删除在当前行上插入的所有内容
  6. 插入CCD_ 19
  7. 使用CCD_ 20离开插入模式

仅仅在一行中插入Buzz需要做很多工作,但这部分实际上有三个目的:

  1. 将CCD_ 22附加到当前行(顺便说一下
  2. 将其记录为可使用.重复的一次编辑
  3. 将所有这些作为递归宏记录在寄存器CCD_ 24中

寄存器.中的宏为:

  1. CCD_ 26向上移动4行
  2. CCD_ 27将光标向后移动一个字符
  3. .重复上一次编辑,所以将Buzz附加到当前行(如果有Fizz,则得到FizzBuzz,如果没有,则获得Buzz(
  4. CCD_ 33在寄存器CCD_

参见:help v_b_A:help i_ctrl-u:help .help ".:help @

第三部分:

@.

回放上面描述的递归宏,使其上行4行,然后上行4行等等,从而解决FizzBuzz的第二和第三个要求。

第四部分:

<C-V>GI0<Esc>

在每一行的开头插入一个CCD_ 41。

参见:help v_b_I

第五部分:

gvg<C-A>

重新选择最后一个视觉块,然后按顺序递增每个CCD_。

参见:help gv:help v_g_ctrl-a

第六部分:

ZZ

写入文件并退出Vim。

参见:help ZZ

最新更新