VimGolfとは
簡単に言うとショートコーディング、コードゴルフのVim版。実行結果でなく Start, Goal のテキストが与えられて、どれだけ短いキーストローク数で変更できるかを競う。
紹介する問題はこれ: https://www.vimgolf.com/challenges/56fb2e75ccffcc0009026473
興味ある方は是非、下の解説を見ずに挑戦してみてください。
- One number per line -
-----------------------
2,3,5,7,
11,13,17,
19,23,29,
2
3
5
7
11
13
17
19
23
29
以下解説
解答(現状最短解)
14 ストローク
5gJV"=[<C-R><C-A>]<CR>pZZ
解説
この14文字に詰まっているテクニックを解説する。
5gJ
J
スペースで(下の)行連結
gJ
スペースを入れずに行連結
5gJ
5行(5回)スペースを入れずに行連結
ここではすべての行を1行にまとめている。
- One number per line ------------------------2,3,5,7,11,13,17,19,23,29,
| (カーソル位置)
V"=[<C-R><C-A>]<CR>p
V
行選択
"=
Expression レジスタ
ここでVim式の記述モードに入る
http://vim-jp.org/vimdoc-ja/eval.html#expression
<C-R><C-A>
カーソル下の WORD を挿入
今回はカーソルの位置から ------------------------2,3,5,7,11,13,17,19,23,29,
が挿入される。
よって command line は
=[------------------------2,3,5,7,11,13,17,19,23,29,]
となる
------------------------2 が2
と評価されて 1行目 2行目 の-(ハイフン)
が打ち消される 。
<CR>
command line 入力終了
p
ペースト
先程 V で行選択した部分を上書きしながらペースト。
[2, 3, 5....] のリストなので改行区切りで文字列に変換されます。
2
3
5
7
11
13
17
19
23
29
ZZ
ZZ
保存して終了
VimGolf の定例
終わり
1, 2行目にトリックが隠されていて面白い問題でした!
VimGolf の問題は実例っぽいテキスト、コード編集です。じかに実用できるかは別として Vim の知らないテクニックが学べると思うのでおすすめです。
ちなみに vimgolf gem で手元のターミナルで問題に挑戦できます。