Nilsson algorithm for the Kolakoski sequence (source code)

= Nilsson algorithm for the Kolakoski sequence
{c}

This algorithm is more efficient in space, using only $log(n)$, as it recursively compresses the state required to keep track of what to do next.

Time is still $O(n)$.

The table at https://maths-people.anu.edu.au/~brent/pd/Kolakoski-UNSW.pdf page 20 has a summary image, but it is hard to understand.

Let's do a step by step version now.

The notation we use is as follows:
``
1 2 (1) 1 (1)
``
means that:
* this is number 2
* there is 1 occurrence count left

Note that column 1 does not need to keep a count so we use notation such as:

``
1 2(0) 1(1)
``

The starting state is:
``
2 | 2 2(1) 2(1) 2(1) 2(1) ...
``
which means that it implicitly contains infinitely many `2(1)` at the end which we abbreviate just as:
``
2 | 2 2(1) ...
``
The actual algorithm will of course omit as many trailing `2(1)` as it can.

The update rules are:
* go left to right:
  * flip:
    ``
    x(0)       y(0)
    !x((!x)-1) unchanged
    ``
    continue going left to right.
  * repeat:
    ``
    x(0)   y(n > 0)
    x(x-1) y(n - 1)
    ``
    and then stop further updates.
Note that both rules don't overlap so that each update is always determined by only one of them at a time.

Also the first column is always implicitly `(0)`.

Use column 2 up once to repeat column 1:

``
2 | 2 2(1) ...
3 | 2 2(0) 2(1) ...
``

Here we:
* switch column 1 because column 2 reached 0 on previous step
* use column 3 up once to repeat column 2

``
2 | 2 2(1) ...
3 | 2 2(0) 2(1) ...
4 | 1 2(1) 2(0) 2(1) ...
``

* use column 2 up once to repeat 1

``
2 | 2 2(1) ...
3 | 2 2(0) 2(1) ...
4 | 1 2(1) 2(0) 2(1) ...
5 | 1 2(0) 2(1) 2(0) 2(1) ...
``

``
 2 | 2 2(1) ...
 3 | 2 2(0) 2(1) ...
 4 | 1 2(1) 2(0) 2(1) ...
 5 | 1 2(0) 2(0) 2(1) ...
 6 | 2 1(0) 2(1) 2(0) 2(1) ...
 7 | 1 1(0) 2(0) 2(0) 2(1) ...
 8 | 2 2(1) 1(0) 2(1) 2(0) 2(1) ...
 9 | 2 2(0) 1(0) 2(1) 2(0) 2(1) ...
10 | 1 1(0) 1(0) 2(0) 2(0) 2(1) ...
11 | 2 2(1) 2(1) 1(0) 2(1) 2(0) 2(1) ...
12 | 2 2(0) 2(1) 1(0) 2(1) 2(0) 2(1) ...
13 | 1 2(1) 2(0) 1(0) 2(1) 2(0) 2(1) ...
14 | 1 2(0) 2(0) 1(0) 2(1) 2(0) 2(1) ...
15 | 2 1(0) 1(0) 1(0) 2(0) 2(0) 2(1) ...
16 | 1 2(1) 2(1) 2(1) 1(0) 2(1) 2(0) 2(1) ...
``