VimGolf の人気問題 "One number per line" を解説してみる

More than 1 year has passed since last update.


VimGolfとは

簡単に言うとショートコーディング、コードゴルフのVim版。実行結果でなく Start, Goal のテキストが与えられて、どれだけ短いキーストローク数で変更できるかを競う。

https://www.vimgolf.com/

紹介する問題はこれ: https://www.vimgolf.com/challenges/56fb2e75ccffcc0009026473

興味ある方は是非、下の解説を見ずに挑戦してみてください。


start

- One number per line -

-----------------------
2,3,5,7,
11,13,17,
19,23,29,


goal

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行目 の-(ハイフン)が打ち消される :thumbsup:

<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 で手元のターミナルで問題に挑戦できます。