Books · The Fiddler: Solutions
Chapter 26
Can You Fling the Fractal Darts?
A dartboard is a unit circle. Inside it sit two congruent circles of radius , tangent to each other and to the rim; inside each of those, two circles of radius ; and so on, the pattern repeating forever inside every circle. A dart’s score is the sum of the areas of every circle it lands inside of or on. What is the most a single dart can score?
The Fiddler, Zach Wissner-Gross, December 5, 2025(original post)
Solution
Aim for the exact centre of the board. The two radius- circles are tangent there, so the dart is on both. Inside the right one, its two radius- children are tangent at its centre , and the left of those children, centred at , passes through the board’s centre too. The same happens inside the left radius- circle, so the centre lies on two radius- circles. Repeating, the centre lies on two circles of radius for every , together with the unit circle. The score is
The computation
Build the circles themselves, on the -axis: each circle of radius centred at spawns two children of radius at . Sum the areas (in units of , so ) of every circle that actually contains the board’s centre, pruning any branch that has moved off it. The total is .
from fractions import Fraction as F
import sys; sys.setrecursionlimit(10000)
def score(c, r, depth): # area/pi of centre-covering circles below (c, r)
if depth > 200 or abs(c) > r: return F(0) # off the centre -> prune
return r*r + score(c - r/2, r/2, depth + 1) + score(c + r/2, r/2, depth + 1)
print(float(score(F(0), F(1), 0))) # 1.6667 = 5/3 -> score 5*pi/3
Extra Credit
Now the dart lands at a point chosen uniformly at random on the board. On average, what score does it earn?
Solution
A clean identity does the work. For a uniform point in the unit disk (area ), the expected score is since each circle lies inside the board, so integrating its indicator returns its own area. With circles of radius at level , so (The source’s extra-credit value is behind its paywall; this is my own, for the self-similar two-circles-per-level board above.)
The computation
Throw the darts: build the full circle tree to a fine depth, scatter uniform points over the board, and for each sum the areas of every circle containing it. The average lands on .
import numpy as np
circles = []
def build(c, r, d):
circles.append((c, r))
if d < 12: build(c - r/2, r/2, d + 1); build(c + r/2, r/2, d + 1)
build(0.0, 1.0, 0)
rng = np.random.default_rng(0); N = 500_000
rad = np.sqrt(rng.uniform(0, 1, N)); ang = rng.uniform(0, 2*np.pi, N)
x, y = rad*np.cos(ang), rad*np.sin(ang); total = 0.0
for c, r in circles:
total += np.pi*r*r*(((x - c)**2 + y*y) <= r*r).sum()
print(round(total/N, 4), round(8*np.pi/7, 4)) # ~3.59 3.5904