A Very Interesting VimGolf

VimGolf.com is a good place for vimers to practice and improve their vim skills. This post records my experience of solving a very interesting VimGolf game -- Quicksort.

The Game

Straight Way

Vim has a command :[range]sort which sorts the lines in [range] (see :h :sort). In this case, the numbers to sort are in the first line. So the easiest way is to transform the first line into rows, sort them with :sort, and transform them back again. You can specify a range for :sort so that the "garbled text" below the divider can remain unchanged.

After some tweaking, my fewest keystrokes to this game is:

1
:s/ /\r/g<CR>vH:sor n<CR>gvJZZ
  • :s/ /\r/g<CR>: Transforms the first line into rows (by substituting white space to \r).
  • vH: Selects the rows to sort.
  • :sor n<CR>: Runs the :sort command, where :sor is the short version of :sort, and option n caused numbers to be sorted by their value (e.g. 1, 2, 10, 20) instead of their dictionary order (e.g. 1, 10, 2, 20).
  • gvJ: Selects the last selected text and joins them together (transform them back to one row).
  • ZZ: Saves and quits.

Shortcut

If you're thinking similarly and are also using :sort, then the above sequence of keystrokes is basically the optimal solution. However, check the leader board for this game and you'll see that there are many single-digit keystroke solutions. How that possible?

This is the most interesting part! If you refer to the wisdom of those who came before you, you'll see that the "garbled text" actually makes sense! The last line actually hides a macro whose job is -- to sort the first line!

So the optimal solution in single-digit keystroke is:

1
GY@0ZZ
  • GY: Jumps to the last line and copies it.
  • @0: Runs the last line (treats it as a macro).
  • ZZ: Saves and quits.