VimGolfでハイスコアを取ったらトップの人のコメントが見れた話

この記事はこの問題の現在の最短手をバラしています。自分で解きたい人は見ないようにしてください。

この記事は Vim アドベントカレンダー 2012の20日目の記事です. 昨日は rhysd さんの 「立て!立つんだビムー!」 - はやくプログラムになりたい でした.

VimGolfは、テキスト編集をいかに少ないキーストロークで行えるか競うことができるwebサイトです。

トップの人のコメントが見れた

VimGolfは、ログインしている状態では自分の投稿した解法の手数と同じかそれより手数の多い解法を見ることができます。つまり、より少ない手数を達成すれば、上位の人の解法を見ることができるようになります。
また、投稿された解法に対してコメントを付けることができます。

私はこの問題を12手で投稿し、トップと同じスコアの2位(同率1位)を取りました。
投稿したのは2012/6/29なので、半年ほど前です。

この画像は私のアカウントでログインしてこの問題のページを開いてスクリーンショットを撮ったものです。前述の通り、私と同じ手数で投稿しないとこれを見ることはできません。
これを見ると、1番の Urtica dioica さんの投稿に Urtica dioica さん自身がこのようなコメントを残していることが確認できます。

Requires a terminal with 24 or more lines. In theory, there may be challenges where you could gain an advantage with a strange window size. In this case, you only miss out if you have an exceptionally small terminal.

Google翻訳したらこんな感じになりました。

24行以上の端末を必要とします。理論的には、変なウィンドウサイズでの優位性を得ることができる課題があるかもしれません。あなたは非常に小型の端末を持っている場合、このケースでは、あなただけ逃します。

Urtica dioica さんの投稿は24行未満の端末では結果が違ってしまうので、条件付きの解法であることが示されています。私自身は Urtica dioica さんと同じ解法(改行コードのみ異なる)で投稿しましたが、この条件には気付かずに投稿したので、このコメントを見て初めて気付きました。

こんな感じで、VimGolfにはコメントを残せるので、高いスコアを取ったら何かコメントを残しておくと後で同じスコアに辿りついた人が楽しめるかもしれません。

解法の説明

以降は同問題(Line Zipper)の解法の説明をします。
まず問題の概要ですが、以下のように離れたところにある同じ国名を隣り合わせの行に移動させるという問題です。
初期状態

China,1,2,3,4,5,6
Brazil,3,1,2,5,5,6
SAD,9,2,3,4,5,6
UK,3,8,3,9,5,1
France,7,2,3,4,5,6
Germany,1,7,3,2,5,6
Russia,1,6,2,9,5,6
Spain,1,2,2,4,5,6
Greece,1,3,3,4,5,6
India,4,2,3,4,5,6
Turkey,1,2,3,4,5,9
Poland,1,2,3,4,5,6
China,1,2,3,8,5,6
Brazil,1,2,3,4,5,6
SAD,1,2,3,4,5,6
UK,1,2,3,4,5,6
France,1,2,3,4,5,6
Germany,1,2,3,4,5,6
Russia,1,2,7,4,5,6
Spain,1,2,3,4,5,6
Greece,1,2,2,4,5,6
India,1,2,8,4,5,6
Turkey,1,2,1,7,5,6
Poland,2,2,3,9,5,6

終了状態

China,1,2,3,8,5,6
China,1,2,3,4,5,6
Brazil,1,2,3,4,5,6
Brazil,3,1,2,5,5,6
SAD,1,2,3,4,5,6
SAD,9,2,3,4,5,6
UK,1,2,3,4,5,6
UK,3,8,3,9,5,1
France,1,2,3,4,5,6
France,7,2,3,4,5,6
Germany,1,2,3,4,5,6
Germany,1,7,3,2,5,6
Russia,1,2,7,4,5,6
Russia,1,6,2,9,5,6
Spain,1,2,3,4,5,6
Spain,1,2,2,4,5,6
Greece,1,2,2,4,5,6
Greece,1,3,3,4,5,6
India,1,2,8,4,5,6
India,4,2,3,4,5,6
Turkey,1,2,1,7,5,6
Turkey,1,2,3,4,5,9
Poland,2,2,3,9,5,6
Poland,1,2,3,4,5,6

キーシーケンスは最初はMで始めます。

M:1m+11@:ZZ

Mはカーソルをスクリーンの中央の最初の非空白文字に移動します。これはカーソルを12行目に移動するのが目的です。それが達成できればM以外でもいいのですが、今回の問題ではたまたまMを使えば僅か1文字で12行目に移動できた、ということです。
そして、前述の通り、端末の高さがMの実行結果に影響し、12行目以外に移動すると失敗となります。

次に、":1m+"を実行します。

M:1m+11@:ZZ

すると、"China"の行が一気にくっつきます。

Brazil,3,1,2,5,5,6
SAD,9,2,3,4,5,6
UK,3,8,3,9,5,1
France,7,2,3,4,5,6
Germany,1,7,3,2,5,6
Russia,1,6,2,9,5,6
Spain,1,2,2,4,5,6
Greece,1,3,3,4,5,6
India,4,2,3,4,5,6
Turkey,1,2,3,4,5,9
Poland,1,2,3,4,5,6
China,1,2,3,8,5,6
China,1,2,3,4,5,6
Brazil,1,2,3,4,5,6
SAD,1,2,3,4,5,6
UK,1,2,3,4,5,6
France,1,2,3,4,5,6
Germany,1,2,3,4,5,6
Russia,1,2,7,4,5,6
Spain,1,2,3,4,5,6
Greece,1,2,2,4,5,6
India,1,2,8,4,5,6
Turkey,1,2,1,7,5,6
Poland,2,2,3,9,5,6

":1m+"は 行を移動するために :move コマンドを実行しています。:move の省略形が :m です。
:1move とすると1行目が移動対象になります。
:move+ とすると現在の行番号+1の次の行、つまりカーソル行の2行下の行が移動先となります。
組み合わせて ":1m+" とします。
現在行は12行目ですから、1行目を、14行目(移動前の14行目)に移動する動作となります。

次に、"@11:"を実行します。

M:1m+11@:ZZ

@: は直前に実行したExコマンドを1回繰り返すコマンドです。11@: とすれば11回繰り返します。

直前の ":1m+" を実行した後、カーソルは13行目にあります。ここで ":1m+"を繰り返すと今度は"Brazil"がくっつきます。

SAD,9,2,3,4,5,6
UK,3,8,3,9,5,1
France,7,2,3,4,5,6
Germany,1,7,3,2,5,6
Russia,1,6,2,9,5,6
Spain,1,2,2,4,5,6
Greece,1,3,3,4,5,6
India,4,2,3,4,5,6
Turkey,1,2,3,4,5,9
Poland,1,2,3,4,5,6
China,1,2,3,8,5,6
China,1,2,3,4,5,6
Brazil,1,2,3,4,5,6
Brazil,3,1,2,5,5,6
SAD,1,2,3,4,5,6
UK,1,2,3,4,5,6
France,1,2,3,4,5,6
Germany,1,2,3,4,5,6
Russia,1,2,7,4,5,6
Spain,1,2,3,4,5,6
Greece,1,2,2,4,5,6
India,1,2,8,4,5,6
Turkey,1,2,1,7,5,6
Poland,2,2,3,9,5,6

これ以降も単純に繰り返せば、次々と同じ国名の行がくっついていくことがわかるでしょう。これを 11@: として一気に処理すれば編集操作は完了です。

最後に、"ZZ"を実行します。

M:1m+11@:ZZ

ZZはファイルを保存してVimを終了します。これはVimGolfでは定石です。他にファイルを保存して終了する方法には :x があります。どちらも :wq と同等です。

説明は以上です。

おわりに

VimGolfは面白いのでぜひ皆さんもチャレンジしましょう。
明日のアドベントカレンダー担当は AmaiSaeta さんです.