Books · The Fiddler: Solutions
Chapter 4
Can You Sneak Past the Rings?
A long vertical cylinder carries three narrow open rings. Each ring wraps around seven-eighths of the cylinder, leaving a gap of one-eighth. The rings sit at evenly spaced heights, and each is rotated about the cylinder’s axis independently and uniformly at random.
You want to send something straight down the outside of the cylinder without touching a ring. What is the probability that there is at least one vertical line passing through all three gaps?
The Fiddler, Zach Wissner-Gross, July 31, 2026(original post)
The official solution appears in the post of August 7, 2026, which had not been published when this chapter was written. The answers here are my own.
Solution
Measure position around the cylinder as a fraction of the circumference, so an angle is a point on a circle of circumference and the whole picture lives on that circle. Write for the length of a gap. Ring leaves the gap an arc of length beginning at , where , , are independent and uniform on the circle. Everything below is arithmetic modulo .
A vertical line sits at a single angle and keeps that angle all the way down. It clears the rings exactly when lies in all three gaps. So the question is whether the three arcs , , have a point in common.
Here is the move that makes the problem easy. Rather than ask where the common point is, ask where the arcs start. The point lies in precisely when lies in , which is an arc of length ending at . Reading that for all three at once:
The three gaps share a point exactly when the three starting points , , all lie inside a single arc of length .
The question has turned from one about overlapping arcs into one about three random points falling close together, which is a question we can count.
So suppose the three points do lie in some arc of length . Going clockwise, one of them comes first, and the arc of length that begins at that point contains the other two. Let be the event that is that first point, that is, that the other two points both lie in . Since the three events cannot happen together: if and were each first, each would lie within of the other going clockwise, and the two arcs of length would have to cover the whole circle, which needs . So the are disjoint, and one of them must occur.
Each is easy. Given where falls, the other two points land independently in a prescribed arc of length , each with probability , so . Adding the three disjoint cases, With this is
It is worth seeing why the answer is so small. Two gaps overlap somewhere with probability already, and asking a third gap to meet that overlap costs most of what is left. Each ring after the first is close to an independent one-in-eight demand.
The computation
The check must not evaluate , which would only confirm the counting. Instead, place the three rings at random and look for a line.
The search needs no grid. If the three arcs do share a point, then the set of angles they share is itself an arc, and its left-hand end is the start of one of the three gaps. So it is enough to test three candidate angles, namely , and , and ask whether any one of them lies in all three gaps.
Draw , , independently and uniformly on .
For each of the three candidate angles , test whether it lies in every gap, that is, whether for .
Record a success if any candidate passes, and repeat.
import numpy as np
rng = np.random.default_rng(20260801)
N, g = 5_000_000, 1/8
c = rng.random((3, N)) # where each gap starts
def in_gap(theta, left): # is this angle inside that gap?
return ((theta - left) % 1.0) < g
hit = np.zeros(N, bool)
for k in range(3): # a shared arc starts at some gap's edge
theta = c[k]
hit |= in_gap(theta, c[0]) & in_gap(theta, c[1]) & in_gap(theta, c[2])
print(f"vertical line : {hit.mean():.6f} (3/64 = {3/64:.6f})")
# vertical line : 0.047017 (3/64 = 0.046875)
Five million cylinders give against the derived .
Extra Credit
Instead of a vertical line, any helix down the surface of the cylinder is allowed. What is the probability that there is at least one helix passing through all three gaps?
Solution
Cut the cylinder down its length and unroll it. Angles become horizontal positions, height becomes the vertical axis, and the three rings become three horizontal lines. A helix has constant pitch, so on the unrolled sheet it is a straight line. The extra credit is therefore asking for a straight line through the three gaps rather than a vertical one, and a vertical line is just the special case of zero slope.
The rings are evenly spaced, so a straight line crosses them at three angles in arithmetic progression: some , then , then , where is the angle the helix turns through between one ring and the next. The pitch is unrestricted, so can be anything.
Now think about where in each gap the line passes. Write for the middle of gap , and let the line cross ring at . Staying inside the gap means . Being an arithmetic progression means the middle term is the average of the outer two, that is which rearranges to The quantity is the second difference of the three gap positions. It measures how far the gaps are from being equally spaced around the cylinder, and it is fixed once the rings are placed. The other term is ours to choose.
So a helix exists exactly when we can choose the three offsets to cancel . Each ranges over , and the coefficients have absolute values summing to , so sweeps the whole interval and nothing more. The condition is therefore where means the distance from to the nearest multiple of .
The last step is to see how is distributed. The gap positions are independent and uniform, so for any fixed values of and the quantity is uniform on the circle, being a uniform shifted by a constant. Hence is uniform, and the condition picks out an arc of length : With ,
The jump from one chance in twenty-one to one chance in two is the whole interest of the puzzle. A vertical line demands that the three gaps be nearly aligned, which is two conditions. A helix demands only that they be nearly equally spaced, which is one. Relaxing from lines to helices does not widen the gaps; it removes a constraint.
The computation
Again the check must not use . Search instead over the helix itself: sweep the pitch across its whole range, and for each pitch test candidate start angles the same way as before, pulling each gap’s edge back to the first ring.
import numpy as np
rng = np.random.default_rng(20260801)
M, NT, g = 60_000, 6_000, 1/8
c = rng.random((3, M))
ts = np.linspace(0, 1, NT, endpoint=False)
def in_gap(theta, left):
return ((theta - left) % 1.0) < g
hit = np.zeros(M, bool)
for chunk in np.array_split(np.arange(NT), 60):
t = ts[chunk][:, None]
for k in range(3): # candidate starts, pulled back to ring 1
phi = c[k][None, :] - k * t
hit |= (in_gap(phi, c[0][None, :])
& in_gap(phi + t, c[1][None, :])
& in_gap(phi + 2 * t, c[2][None, :])).any(axis=0)
print(f"helix : {hit.mean():.6f} (1/2 = 0.500000)")
# helix : 0.498267 (1/2 = 0.500000)
Sixty thousand cylinders, each searched over six thousand pitches, give against the derived .
A search that answers yes too readily would report a half whatever the gaps were, so it is worth confirming that the same code can say something else. Rerun it with and it returns , against .
path blocked second difference 0.000 clear when at most 0.250
of 0 random placements —had a vertical line —had a helix