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

  • 12
    いいね
  • 0
    コメント

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