Planetary Parade — seven great circles and one lucky region
puzzle
math
python
How I solved Jane Street’s March 2026 puzzle by turning a sky full of planets into great circles, counting regions with Euler’s formula, and taking a single derivative.
An alien friend lives on Pyrknot, a planet well modeled as a perfect sphere orbiting a single star. Six other planets share the system. Their orbits are so chaotic that each night every planet appears at an independent, uniformly random point in Pyrknot’s sky, and none are visible during daylight. Given that some point on the surface can see all six planets at once, the friend at their own location has probability \(\alpha\) of also seeing all six. The friend then builds a tower and can view any body visible from at least one surface point within distance \(r\) of the tower’s base. For small \(r\) relative to Pyrknot’s radius \(R\), the probability rises to about \(\alpha + \beta\,(r/R)\). Find \(\alpha\) and \(\beta\) in exact terms.
I solved it with pen and paper and want to write it up properly. It looks like an astronomy word problem, but it’s really a geometry puzzle in disguise. The whole thing turns on one translation: a planet in the sky becomes a great circle on the ground. Once you see that, the first answer is a counting exercise and the second is one derivative.
A planet is a great circle
Start with one planet. The friend can see it only if it sits above their local horizon. The set of surface points that can see a faraway object is exactly the half of the sphere facing it — a hemisphere. The edge of that hemisphere, where the object sits right on the horizon, is a great circle.
Make this precise with vectors. Let \(\mathbf{u}\) be the outward unit normal at a surface point, and let \(\mathbf{d}\) point toward a planet. The planet is above the horizon at \(\mathbf{u}\) exactly when
\[
\mathbf{u} \cdot \mathbf{d} > 0.
\]
Because each planet lands uniformly in the sky, \(\mathbf{d}\) is a uniform random direction, so \(\{\mathbf{u} : \mathbf{u}\cdot\mathbf{d} > 0\}\) is a uniformly random hemisphere with a random great circle for its rim.
The star plays the same game with one sign flipped. You can only see planets at night, which means the star must be below your horizon: \(\mathbf{u}\cdot\mathbf{d}_{\text{star}} < 0\). That’s a seventh hemisphere, the “night” side, bounded by a seventh great circle.
So six planets plus one star give seven random great circles. Seeing the full parade from a point \(\mathbf{u}\) means landing on the correct side of all seven at once: inside all six planet hemispheres and on the night side of the star.
Counting the regions
Seven great circles in general position slice the sphere’s surface into flat-faced regions, and every region sees its own fixed subset of the seven bodies. How many regions? Euler’s formula for any graph drawn on a sphere settles it:
\[
V - E + F = 2.
\]
Count each piece for \(n = 7\) circles:
Vertices. Any two distinct great circles cross at two antipodal points, so \(V = 2\binom{7}{2} = 42\).
Edges. Each circle is cut by the other six into \(2 \cdot 6 = 12\) arcs, so \(E = 7 \cdot 12 = 84\).
Faces. Rearranging Euler, \(F = 2 - V + E = 2 - 42 + 84 = 44\).
The sky carves the ground into exactly 44 regions. Hold that number.
Getting \(\alpha\)
Two facts about those 44 regions do all the work.
First, at most one region ever sees the full parade. The parade region is the intersection of seven half-spaces (six “above the horizon,” one “below”). An intersection of half-spaces is convex, and on a sphere a convex set lands inside a single region — it can’t be split across two. So on any given night, either exactly one of the 44 regions is the lucky one, or none is.
Second, by symmetry every region is equally likely to be the friend’s home. The friend’s location is just one more fixed point; the seven circles are placed uniformly at random around it. Nothing distinguishes one of the 44 regions from another ahead of time, so the friend’s point is equally likely to fall in any of them.
Now read the question again. We’re told a parade is visible somewhere — exactly one region is lucky. The friend wins if their home is that one region out of 44. With every region equally likely,
\[
\boxed{\alpha = \frac{1}{44}.}
\]
It’s worth checking that “a parade is visible somewhere” is even possible to condition on — it has to have positive probability. A fixed point sees the parade with probability \((1/2)^7 = 1/128\) (each of the seven independent half-space tests is a fair coin). Summing that chance over all 44 regions, the probability that some region is lucky works out to \(44/128 = 11/32\). This is a clean special case of Wendel’s theorem on random hemispheres. The ratio is what matters: one lucky region in \(44\), so \(\alpha = (1/128) / (11/32) = 1/44\). The conditioning is well posed and the count is honest.
The tower, and getting \(\beta\)
The tower extends the friend’s reach. They can now see a body if it clears the horizon at any surface point within distance \(r\) of the tower’s base, not just at the base itself. Climbing higher effectively pushes each horizon outward by a small angle.
Two competing effects show up, and the sign of each is the whole puzzle.
Planets help. Reaching \(r\) toward a planet that is just below your horizon can pull it into view. So for each of the six planets, the region that “sees” it grows outward by a band of width \(r\). The lucky region inherits six of these expanding edges.
The star hurts. Here’s the trap. The star is a celestial body too, and the same reach can pull the star above the horizon — meaning the top of your tower is in daylight, which kills the parade. So along the one edge of the lucky region that borders the star’s night-circle, the region shrinks by a band of width \(r\).
To first order in \(r\), the area a band adds (or removes) is just its length times its width:
\[
\Delta(\text{area}) \;\approx\; r \cdot (\text{length of the six planet edges}) \;-\; r \cdot (\text{length of the one star edge}).
\]
So I need the expected perimeter of the lucky region, split by edge type. Symmetry hands me both pieces.
The seven great circles have total length \(7 \cdot 2\pi R\). Each arc borders exactly two of the 44 regions, so summing every region’s perimeter double-counts the arcs: the grand total of all perimeters is \(2 \cdot 7 \cdot 2\pi R = 28\pi R\). All 44 regions are symmetric, so each has expected perimeter
\[
\frac{28\pi R}{44} \;=\; \frac{7\pi R}{11}.
\]
And the seven circles are interchangeable, so each contributes \(1/7\) of that perimeter. Six circles are planets, one is the star:
Six edges push out, one edge pulls in, \(6 - 1 = 5\), all over the same \(44\). The day/night boundary is the only thing that makes \(\beta\) smaller than “six bands’ worth,” and it’s exactly the detail the puzzle is built around.
Checking it in code
The hand argument leans on a small-angle picture, so I want a closed form to differentiate and confirm. Translate the tower reach \(r\) into an angle \(\delta = r/R\) (arc length over radius). Reaching \(\delta\) toward a planet drops its horizon, so you see planet \(i\) when \(\mathbf{u}\cdot\mathbf{d}_i > -\sin\delta\); the star must stay down even from the tower top, so night means \(\mathbf{u}\cdot\mathbf{d}_{\text{star}} < -\sin\delta\). Since \(\mathbf{u}\cdot\mathbf{d}\) is uniform on \([-1, 1]\), a fixed tower sees the parade with probability
Dividing by the same \(11/32\) (a parade still has to exist somewhere), I get the conditional probability as a function of \(\delta\). Its value and slope at \(\delta = 0\) are \(\alpha\) and \(\beta\).
import sympy as spdelta = sp.symbols("delta", positive=True)s = sp.sin(delta)g = (1+ s)**6* (1- s) /128# fixed tower sees the full paradeP_exists = sp.Rational(11, 32) # parade visible somewhere (Wendel, 7 circles)p = g / P_exists # conditional probability, as a function of deltaalpha = sp.simplify(p.subs(delta, 0))beta = sp.simplify(sp.diff(p, delta).subs(delta, 0)) # d/d(r/R) at r = 0series = sp.series(p, delta, 0, 2).removeO()print("alpha =", alpha)print("beta =", beta)print("p(r/R) approx =", sp.expand(series))
Both fall straight out: \(\alpha = 1/44\) and \(\beta = 5/44\), with the linear expansion \(\tfrac{1}{44} + \tfrac{5}{44}\,(r/R)\) exactly matching the by-hand answer.
It’s also worth confirming the region count and the existence probability independently. Euler’s formula gives the faces, and Wendel’s theorem gives the chance a parade is possible at all.
from math import combn =7# 6 planets + 1 starV =2* comb(n, 2) # antipodal crossingsE = n *2* (n -1) # arcs per circle, times circlesF =2- V + E # Euler: V - E + F = 2print(f"V = {V}, E = {E}, F = {F} regions")# Wendel: P(all n random hemispheres share a common point) in 3DP = sp.Rational(sum(comb(n -1, k) for k inrange(3)), 2**(n -1))print(f"P(parade possible) = {P} = {F}/128")
V = 42, E = 84, F = 44 regions
P(parade possible) = 11/32 = 44/128
Monte Carlo gut-check
Before I trust either the region count or the tower correction, I want to drop a few million random skies on a fixed friend and watch the empirical numbers land. I put the friend at the north pole (one fixed point is as good as any), scatter seven uniform directions for each night, and apply the same horizon tests.
import numpy as nprng = np.random.default_rng(20260330)N =4_000_000def unit(n): v = rng.standard_normal((n, 3))return v / np.linalg.norm(v, axis=1, keepdims=True)friend = np.array([0.0, 0.0, 1.0]) # WLOG, by symmetrydef parade_prob(rR):"""P(friend with tower reach r/R sees the parade | a parade exists).""" sin_d = np.sin(rR) seen = np.ones(N, dtype=bool)for _ inrange(6): # planets: must clear the horizon seen &= friend @ unit(N).T >-sin_d seen &= friend @ unit(N).T <-sin_d # star: must stay below it (night)return seen.mean() / (11/32) # condition on a parade existingprint(f"alpha empirical : {parade_prob(0.0):.5f} exact 1/44 = {1/44:.5f}")for rR in (0.02, 0.05): pred =1/44+5/44* rRprint(f"r/R={rR:.2f}: sim {parade_prob(rR):.5f} alpha+beta(r/R) {pred:.5f}")
The base rate sits on \(1/44\), and the small-\(r\) values track \(\tfrac{1}{44} + \tfrac{5}{44}(r/R)\) closely. The fit drifts as \(r/R\) grows, which is expected — \(\beta\) is only the first-order slope, and the curvature of \(g(\delta)\) shows up once the band stops being thin.
A picture of the lucky region
To see why \(\alpha\) is so small, it helps to draw the 44 regions for one random sky and shade the single region that sees every planet at night.
import matplotlib.pyplot as pltrng2 = np.random.default_rng(28)normals = rng2.standard_normal((7, 3))normals /= np.linalg.norm(normals, axis=1, keepdims=True)planets, star = normals[:6], normals[6]# dense grid of surface points in lat/lonlon = np.linspace(-np.pi, np.pi, 720)lat = np.linspace(-np.pi/2, np.pi/2, 360)LON, LAT = np.meshgrid(lon, lat)U = np.stack([np.cos(LAT)*np.cos(LON), np.cos(LAT)*np.sin(LON), np.sin(LAT)], -1)sees_planets = np.all(U @ planets.T >0, axis=-1) # all six above horizonnight = U @ star <0# star below horizonparade = sees_planets & nightfig, ax = plt.subplots(figsize=(7, 4))ax.contourf(LON, LAT, parade.astype(float), levels=[0.5, 1.5], colors=["#2a9fd6"], alpha=0.85)for nrm, col in [(p, "#888888") for p in planets] + [(star, "#d62728")]:# the great circle u . n = 0, drawn as its locus in lat/lon val = U @ nrm ax.contour(LON, LAT, val, levels=[0], colors=[col], linewidths=1.2)ax.set_xlabel("longitude"); ax.set_ylabel("latitude")ax.set_xticks([]); ax.set_yticks([])ax.set_title("one random night on Pyrknot")plt.savefig("thumbnail.png", dpi=110, bbox_inches="tight")plt.show()
Figure 1: Seven random great circles (six planet horizons, one star horizon) cut the globe into 44 regions. The shaded patch is the lone region that sees all six planets while the star is down — the friend lands there with probability \(1/44\).
Gray circles are planet horizons, the red circle is the star’s night boundary, and the blue patch is the parade region. On most nights that patch is tiny or absent — which is exactly why landing in it is a \(1\)-in-\(44\) event.
What made it nice
The whole puzzle hinges on one change of view: a planet in the sky is a hemisphere on the ground, and its rim is a great circle. After that, \(\alpha\) is Euler’s formula (\(44\) regions, one of them lucky) and \(\beta\) is a perimeter split six-to-one between planets that help and a star that hurts. No integrals, no heavy machinery — just careful counting and one sign you can’t afford to miss.
The official Jane Street solution takes the same great-circle route and lands on the same pair, \(\alpha = \tfrac{1}{44}\) and \(\beta = \tfrac{5}{44}\).