Chapter 154
Crescents, Footballs, and the Squishyball Series
The Riddler for July 14, 2017. The Express is a simple lens-area question: two identical pizzas overlap with each crust passing through the other’s centre, and you must choose between one crescent and two footballs. The Classic is the National Squishyball League’s perverse postseason format: the winner’s prize shrinks with the series length, and you have to set the length to maximise your expected winnings.
Riddler Express
You and two siblings share two extra-large pizzas of the same size. The pizzas are placed so that the crust of one touches the centre of the other, and vice versa. You slice both pizzas around their region of overlap. Two pieces are the outer “crescents” (one per pizza), and the third piece is the union of the two “football”-shaped cutouts (one per pizza), which sit on top of each other in the overlap region. Two siblings each take a crescent; one takes both footballs. To eat the most pizza, do you want one crescent or both footballs?
The Riddler, FiveThirtyEight, July 14, 2017(original post)
Solution
Set the radius of each pizza to and place the centres at and . The two circular crusts intersect where each circle’s equation holds, giving intersection points .
The one lens area. The overlap region (a single “vesica piscis” lens) is symmetric across both the -axis and the line . Half of it lies in the unit disc centred at the origin and is bounded by the arc of that disc between and and the chord . The arc subtends a central angle at the origin (the angle between the two intersection points seen from ). The circular segment cut off by the chord has area The lens is twice this segment (one segment from each disc), so
Football pair versus one crescent. When each pizza is sliced along the boundary of the other, pizza separates into one crescent (its part outside pizza ) and one football (the lens, sitting where pizza overlaps it). Pizza does the same. So the third sibling takes both footballs, which together cover the same lens region twice; the total amount of pizza they get is twice the lens area: One crescent is the area of one pizza () minus its football:
So two footballs beat one crescent comfortably: The three shares () sum exactly to the two pizzas’ total area, as they must.
A sanity check on intuition. The lens is one-third of each pizza by central-angle weight, so the football area is exactly , and the two bulges together push the football past the bare third. The crescent, by complement, is two-thirds of a pizza minus the same two bulges, putting it below two-thirds of a pizza. Two footballs total just over two-thirds of a pizza; one crescent is just under two-thirds.
The computation
Encode the regions as Monte-Carlo membership tests in the bounding box and integrate by counting. Pick uniform points in ; for each, test which regions it sits in.
import random, math
def regions(N=2_000_000, seed=0):
rng = random.Random(seed)
box_area = 3.0 * 2.0 # [-1,2] x [-1,1]
in_lens = in_cresc1 = in_cresc2 = 0
for _ in range(N):
x = rng.uniform(-1, 2)
y = rng.uniform(-1, 1)
in_p1 = x*x + y*y <= 1.0
in_p2 = (x-1)**2 + y*y <= 1.0
if in_p1 and in_p2:
in_lens += 1
elif in_p1:
in_cresc1 += 1
elif in_p2:
in_cresc2 += 1
f = box_area / N
return f*in_lens, f*in_cresc1, f*in_cresc2
lens, c1, c2 = regions()
print(f"one lens (football) = {lens:.4f} exact 2pi/3 - sqrt3/2 "
f"= {2*math.pi/3 - math.sqrt(3)/2:.4f}")
print(f"two footballs = {2*lens:.4f} exact 4pi/3 - sqrt3 "
f"= {4*math.pi/3 - math.sqrt(3):.4f}")
print(f"one crescent (avg) = {(c1+c2)/2:.4f} exact pi/3 + sqrt3/2 "
f"= {math.pi/3 + math.sqrt(3)/2:.4f}")
# one lens (football) = 1.2280 exact 2pi/3 - sqrt3/2 = 1.2284
# two footballs = 2.4560 exact 4pi/3 - sqrt3 = 2.4567
# one crescent (avg) = 1.9136 exact pi/3 + sqrt3/2 = 1.9132
The Monte-Carlo areas match the exact values to four decimal places, confirming both the lens formula and the strict inequality.
Riddler Classic
You own the regular-season champions of the National Squishyball League. The championship is against the second seed. You pick the series length: a single game, best two of three, best three of five, all the way up to best of . Your team wins each game with probability , independently. If you win the title, you receive $ minus $ per win required (so a one-game series pays $, a best-of-seven series pays $, and so on). Losing pays zero. What length of series maximises your expected winnings, and how much do you expect?
The Riddler, FiveThirtyEight, July 14, 2017(original post)
Solution
Let the series be best of , so you need wins. Let be your per-game win probability. The probability that you win the series is the probability of at least heads in independent biased coin flips: The prize for winning is , paid only on victory. Your expected winnings are You face two opposing forces. As grows, rises toward (with a edge, longer series favour the better team). But falls linearly. Maximising the product is a tradeoff.
Asymptotic intuition. For large , the central limit theorem gives exponentially fast (the gap between expected wins and the threshold grows linearly with ). The shortfall behaves like for some . So for large , Differentiating in shows the optimum is at finite : the linear penalty per added win eventually overwhelms the exponentially-shrinking gain in .
Exact optimum. Compute for each from to and pick the maximum. The maximum is at :
The series is much longer than the canonical best-of-seven. The intuition is that the marginal cost of one more required win is only $, while at this margin the probability gain from going from to wins required is about , worth roughly . Just past , the probability gain stops being worth $, and that crossover defines the optimum.
The computation
Encode the binomial directly. Sum the probability of -or-more wins in trials at , multiply by the prize, and tabulate.
from math import comb
def winprob(N, p=0.6):
return sum(comb(2*N-1, k) * p**k * (1-p)**(2*N-1-k)
for k in range(N, 2*N))
best_ev, best_N = 0.0, 0
for N in range(1, 51):
ev = winprob(N) * (1_000_000 - 10_000 * N)
if ev > best_ev:
best_ev, best_N = ev, N
print(f"optimal N = {best_N}, series length 2N-1 = {2*best_N-1}")
print(f"expected winnings = ${best_ev:,.2f}")
for N in (11, 12, 13, 14, 15):
p = winprob(N)
ev = p * (1_000_000 - 10_000 * N)
print(f" N={N:2d} P_win={p:.4f} EV=${ev:,.2f}")
# optimal N = 13, series length 2N-1 = 25
# expected winnings = $736,222.04
# N=11 P_win=0.8256 EV=$734,803.70
# N=12 P_win=0.8364 EV=$735,993.77
# N=13 P_win=0.8462 EV=$736,222.04
# N=14 P_win=0.8553 EV=$735,599.48
# N=15 P_win=0.8638 EV=$734,218.99
The optimum lands cleanly at (a best-of- series) with an expected payday of $. The neighbours both fall short by about $-, confirming the curvature of the tradeoff.