Skip to content
Vamshi Jandhyala

Books · The Riddler

Chapter 267

Can You Pinpoint The Planet?

Riddler Express

Planet Xiddler orbits its sun at 150150 million km. Just after sunset, three astronomers all spot a newly discovered planet at the zenith (straight overhead). One says its orbital radius is 5050 million km, one says 300300 million km, one says 150150 million km. Whom should the Grand Minister believe?

The Riddler, FiveThirtyEight, June 5, 2020(original post)

Solution

Two directions fix everything. Just after sunset the sun sits on the horizon, while the new planet is at the zenith, straight up. The angle between “towards the horizon” and “straight up” is 9090^\circ, so from Xiddler the angle Sun–Xiddler–planet is a right angle. The planet is at quadrature.

Now ask which orbits can ever appear 9090^\circ from the sun. For a planet closer to the sun than Xiddler (an inner planet, radius r<150r < 150), the sun–planet line of sight can never swing more than arcsin(r/150)\arcsin(r/150) from the sun: the 5050 million km orbit tops out at arcsin(1/3)19.5\arcsin(1/3) \approx 19.5^\circ, nowhere near 9090^\circ. A planet at the same radius (150150) would share Xiddler’s orbit, which is impossible. Only an outer planet, farther from the sun than Xiddler, can reach 9090^\circ elongation. So the Grand Minister should believe the astronomer who said 300 million km.\boxed{300 \text{ million km}}.

The computation

Encode the elongation limit: for each proposed orbit, the greatest possible angle between sun and planet as seen from Xiddler. An inner orbit (r<150r<150) caps at arcsin(r/150)\arcsin(r/150); only an outer orbit can reach the observed 9090^\circ.

import math
R = 150
for r in (50, 300, 150):
    if r < R:
        print(r, "inner: max elongation", round(math.degrees(math.asin(r / R)), 1))
    elif r > R:
        print(r, "outer: reaches 90 deg (quadrature) -> matches zenith at sunset")
    else:
        print(r, "same orbit as Xiddler -> impossible")
# 50 inner: max elongation 19.5
# 300 outer: reaches 90 deg (quadrature) -> matches zenith at sunset
# 150 same orbit as Xiddler -> impossible

Riddler Classic

You fill in a sign’s letters with a marker whose flat circular tip has radius 11 cm. Drawing horizontal strokes every 22 cm (the tip’s diameter) leaves visible gaps. If strokes may overlap by at most 11 cm, what overlap makes the shading as uniform as possible, and how uniform is it (as measured by the standard deviation of the ink)?

The Riddler, FiveThirtyEight, June 5, 2020(original post)

Solution

Look at a vertical slice across the strokes. As the round tip slides along at constant speed, the ink left at a point is proportional to how long the tip covers it. A point a distance tt from a stroke’s midline is covered while the tip’s centre is within 1t2\sqrt{1 - t^2} horizontally, so a single stroke deposits a semicircular hill of ink, h(t)=1t2h(t) = \sqrt{1 - t^2} for t1|t| \le 1. That is why evenly spaced non-overlapping strokes leave gaps: the hills sag to zero at their edges.

With strokes spaced dd apart (an overlap of 2d2 - d), the total ink is the sum of these hills, I(y)=kh(ykd)I(y) = \sum_k h(y - kd), a periodic profile. As dd shrinks from 22, the dips between hills fill in; push too far and the midlines bulge instead. Somewhere between, the ripple is smallest. Minimising the standard deviation of II over one period gives the best overlap, overlap0.31 cm,\boxed{\text{overlap} \approx 0.31 \text{ cm}}, at which the standard deviation of the ink (with each hill scaled to height 11) is about 0.086\boxed{0.086}. The official’s more finely tuned value is an overlap of 0.3080.308 cm.

The computation

Encode the ink profile I(y)=k1(ykd)2I(y) = \sum_k \sqrt{1-(y-kd)^2} for spacing d=2overlapd = 2 - \text{overlap}, sampled over one period, and search the overlap that minimises its standard deviation.

import numpy as np
from scipy.optimize import minimize_scalar
def ink_std(overlap):
    d = 2 - overlap                                  # stroke spacing
    y = np.linspace(0, d, 20000, endpoint=False)
    I = np.zeros_like(y)
    for k in range(-4, 5):
        t = y - k * d
        m = np.abs(t) < 1
        I[m] += np.sqrt(1 - t[m] ** 2)               # semicircular hill, height 1
    return I.std()
r = minimize_scalar(ink_std, bounds=(0.0, 1.0), method="bounded")
print(f"overlap = {r.x:.3f} cm, min std dev = {r.fun:.4f}")
# overlap = 0.308 cm, min std dev = 0.0859

The search lands on an overlap near 0.310.31 cm with a standard deviation of about 0.0860.086.