Let’s take another look at the Kolakoski sequence (part 1, part 2) which, by definition, is the sequence of 1s and 2s in which the nth term is equal to the length of the nth run of consecutive equal numbers in the same sequence. When a sequence has only two distinct entries, it can be visualized with the help of a turtle that turns left (when the entry is 1) or right (when the entry is 2). This visualization method seems particularly appropriate for the Kolakoski sequence since there are no runs of 3 equal entries, meaning the turtle will never move around a square of sidelength equal to its step. In particular, this leaves open the possibility of getting a simple curve… Here are the first 300 terms; the turtle makes its first move down and then goes left-right-right-left-left-right-left-… according to the terms 1,2,2,1,1,2,1,…
No self-intersections yet… alas, at the 366th term it finally happens.
Self-intersections keep occurring after that:
again and again…
Okay, the curve obviously doesn’t mind intersecting self. But it can’t be periodic since the Kolakoski sequence isn’t. This leaves two questions unresolved:
- Does the turtle ever get above its initial position? Probably… I haven’t tried more than 5000 terms
- Is the curve bounded? Unlikely, but I’ve no idea how one would dis/prove that. For example, there cannot be a long diagonal run (left-right-left-right-left) because having 1,2,1,2,1 in the sequence implies that elsewhere, there are three consecutive 1s, and that doesn’t happen.
Here’s the Python code used for the above. I represented the sequence as a Boolean array with 1 = False, 2 = True.
import numpy as np import turtle n = 500 # number of terms to compute a = np.zeros(n, dtype=np.bool_) j = 0 # the index to look back at same = False # will next term be same as current one? for i in range(1, n): if same: a[i] = a[i-1] # current run continues same = False else: a[i] = not a[i-1] # the run is over j += 1 # another run begins same = a[j] # a[j] determines its length turtle.hideturtle() turtle.right(90) for i in range(n): turtle.forward(10) # used steps of 10 or 5 pixels if a[i]: turtle.right(90) else: turtle.left(90)