Skip to content
Vamshi Jandhyala

Books · The Fiddler: Solutions

Chapter 12

Can You Rile and Grace the Polyhedron?

An alien, an Eridian named Rocky, must pass a solid crystal to his human friend through a tunnel. The crystal is a regular tetrahedron with every edge of length 11, and it can fit snugly through a cylindrical tunnel. What is the smallest possible radius for that tunnel?

The Fiddler, Zach Wissner-Gross, April 3, 2026(original post)

The regular tetrahedron of edge 11. Figure from the source post.

Solution

A solid slides straight down a cylinder of radius rr exactly when one of its perpendicular shadows fits inside a circle of radius rr; the best tunnel uses the viewing direction whose shadow has the smallest enclosing circle. For the regular tetrahedron, look along the line joining the midpoints of two opposite edges. Those two edges are perpendicular and project to two perpendicular segments of length 11 that bisect each other, so the four vertices land on the corners of a square whose diagonals have length 11. The smallest circle around that square is its circumscribed circle, of radius half the diagonal, r=12.r = \boxed{\tfrac12}.

Along the line through two opposite edge-midpoints, the tetrahedron’s shadow is a square of diagonal 11; its circumscribed circle (dashed) has radius 12\tfrac12.

The computation

Sweep over every viewing direction: project the four vertices onto the plane perpendicular to that direction and find the smallest circle enclosing the shadow. The minimum over all directions is 12\tfrac12.

import numpy as np
from scipy.optimize import minimize
T = np.array([[1,1,1],[1,-1,-1],[-1,1,-1],[-1,-1,1]], float) / (2*np.sqrt(2))
def basis(u):
    u = u/np.linalg.norm(u)
    a = np.array([1,0,0.]) if abs(u[0]) < .9 else np.array([0,1,0.])
    e1 = np.cross(u, a); e1 /= np.linalg.norm(e1)
    return e1, np.cross(u, e1)
def enclosing_r(u):                 # radius of smallest circle around the shadow
    e1, e2 = basis(u); p = np.c_[T@e1, T@e2]
    return minimize(lambda c: np.max(np.linalg.norm(p - c, axis=1)),
                    p.mean(0), method='Nelder-Mead').fun
best = min(enclosing_r(np.array([np.sin(a)*np.cos(b), np.sin(a)*np.sin(b), np.cos(a)]))
           for a in np.linspace(0, np.pi, 60) for b in np.linspace(0, np.pi, 60))
print(round(best, 4))               # 0.5

Extra Credit

Next, Rocky transports a solid regular dodecahedron, again with unit edges, and the tunnel may now be any right prism, not just a cylinder. What is the smallest possible cross-sectional area for the tunnel?

The regular dodecahedron of edge 11. Figure from the source post.

Solution

A prism is swept straight along its axis, so the crystal passes through exactly when its perpendicular shadow fits inside the cross-section, and the smallest prism is the smallest-area shadow over all viewing directions. Searching the directions, the minimum is reached looking along a two-fold axis, through the midpoints of two opposite edges, where the silhouette is a hexagon of area 4.736.\boxed{4.736\ldots}. The face-on view gives a regular decagon of area 4.9804.980, and the vertex-on view a hexagon of area 5.0705.070, so neither symmetric view is optimal. (The source’s solution is behind its paywall; this value is my own, from minimising the shadow area numerically.)

The minimal silhouette, along a two-fold axis: a hexagon of area 4.7364.736\ldots, the cross-section of the smallest prismatic tunnel.

The computation

The same sweep, but now the shadow’s area (the convex hull of the projected vertices) is what matters; minimise it over all viewing directions of the dodecahedron.

import itertools as it
from scipy.spatial import ConvexHull
phi = (1 + np.sqrt(5)) / 2
V = [s for s in it.product([-1, 1], repeat=3)]
for a in (-1, 1):
    for b in (-1, 1):
        V += [(0, a/phi, b*phi), (a/phi, b*phi, 0), (a*phi, 0, b/phi)]
V = np.array(V, float) / (2/phi)            # scale to edge length 1
def shadow_area(u):
    e1, e2 = basis(u); return ConvexHull(np.c_[V@e1, V@e2]).volume
best = min(shadow_area(np.array([np.sin(a)*np.cos(b), np.sin(a)*np.sin(b), np.cos(a)]))
           for a in np.linspace(0, np.pi, 60) for b in np.linspace(0, np.pi, 60))
print(round(best, 3))               # 4.736