Books · The Fiddler: Solutions
Chapter 51
Can You Squeeze the Bubbles?
You draw seven unit circles one at a time. Each new circle’s centre must not lie inside any previously drawn circle. Let the region be all the space inside at least one circle. What is the smallest possible area of this region?
The Fiddler, Zach Wissner-Gross, June 6, 2025(original post)
Solution
Placing each centre outside every earlier circle forces all pairwise centre distances to be at least . To make the union as small as possible you want maximal overlap, so push the centres as close as allowed: all pairwise distances exactly where possible. Seven points achieve this as a triangular-lattice cluster, one centre with six neighbours at distance (a unit hexagon). The resulting area is The heavy overlap of the seven circles brings the area far below the of seven disjoint disks.
The computation
Measure the union directly: place the seven centres (centre plus a unit hexagon), scatter points over a box that contains the figure, and take the fraction landing inside at least one circle, scaled by the box area.
import numpy as np
ctr = [(0, 0)] + [(np.cos(k*np.pi/3), np.sin(k*np.pi/3)) for k in range(6)]
rng = np.random.default_rng(0); P = rng.uniform(-3, 3, (20_000_000, 2))
inside = np.zeros(len(P), bool)
for cx, cy in ctr: inside |= ((P[:, 0] - cx)**2 + (P[:, 1] - cy)**2 <= 1)
print(round(inside.mean()*36, 3), round(3*np.sqrt(3) + 2*np.pi, 3)) # ~11.48 11.479
Extra Credit
For circles under the same rule, what is the minimum area as grows very large?
Solution
The densest legal arrangement of centres is the triangular lattice with spacing . Each interior circle then owns a Voronoi hexagon of area , and because the radius far exceeds the half-spacing , the union fully covers that lattice region. So the minimum area grows linearly, with lower-order boundary corrections of size . (The source’s answer is paywalled; this asymptotic is my own.)
The computation
Tile a large disk with unit-spacing triangular-lattice centres, measure the union area by Monte Carlo, and divide by the number of circles; the area per circle settles on .
pts = [(i + 0.5*(j & 1), j*np.sqrt(3)/2) for i in range(-20, 21) for j in range(-20, 21)]
pts = np.array([p for p in pts if p[0]**2 + p[1]**2 < 12**2]) # a large disk of centres
rng = np.random.default_rng(0); Q = rng.uniform(-15, 15, (8_000_000, 2))
inside = np.zeros(len(Q), bool)
for cx, cy in pts: inside |= ((Q[:, 0] - cx)**2 + (Q[:, 1] - cy)**2 <= 1)
print(round(inside.mean()*900/len(pts), 4), round(np.sqrt(3)/2, 4)) # ~0.866 per circle