20
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-06

VimGolfとは

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

紹介する問題はこれ: 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 で手元のターミナルで問題に挑戦できます。

20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15