Skip to content
Vamshi Jandhyala

Books · The Riddler

Chapter 63

Can You Draft A Riddler Fantasy Football Dream Team?

A runner catches the ball on one goal line and sprints at 1515 mph straight down the field, 100100 yards to the far end zone. You start on the same goal line, 5050 yards to his side, and always run directly at his current position (a pure pursuit, never leading him). How fast must you run to catch him before he scores?

Solution

Place yourself at the origin and the runner at (x0,0)(x_0, 0) with x0=50x_0 = 50, running up the line x=x0x = x_0 at speed VrV_r. You move at speed VcV_c always aimed at his current spot, tracing a pursuit curve y(x)y(x). Two facts pin the curve down: your heading points at the runner, so the tangent satisfies dydx=Vrtyx0x\frac{dy}{dx} = \frac{V_r t - y}{x_0 - x}, and the arc length you have covered is Vct=0x1+(y)2dzV_c t = \int_0^x \sqrt{1 + (y')^2}\,dz. Eliminating tt and differentiating once turns this into a separable equation for the slope p=yp = y', with n=Vr/Vcn = V_r/V_c: (x0x)dpdx=n1+p2.(x_0 - x)\,\frac{dp}{dx} = n\sqrt{1 + p^2}. Integrating from the start (where p=0p = 0 at x=0x = 0) gives (p+1+p2)(1xx0)n=1\big(p + \sqrt{1 + p^2}\big)\big(1 - \tfrac{x}{x_0}\big)^{n} = 1, and integrating once more yields the capture height: the runner is overtaken on his line x=x0x = x_0 at ycatch=n1n2x0(n<1).y_{\text{catch}} = \frac{n}{1 - n^2}\,x_0 \qquad (n < 1). You catch him before the end zone exactly when ycatch100y_{\text{catch}} \le 100; the slowest speed that just manages it sets equality: 100=n1n250    2n2+n2=0    n=1714.100 = \frac{n}{1 - n^2}\cdot 50 \;\Longrightarrow\; 2n^2 + n - 2 = 0 \;\Longrightarrow\; n = \frac{\sqrt{17} - 1}{4}. Since Vc=Vr/nV_c = V_r/n, Vc=15n=17+141519.2 mph.V_c = \frac{15}{n} = \frac{\sqrt{17} + 1}{4}\cdot 15 \approx \boxed{19.2 \text{ mph}}.

The computation

Run the chase directly: step the runner up his line, step yourself the same time-step straight toward him, and binary-search the smallest speed that closes the gap before he travels 100100 yards.

import numpy as np
Vr, x0, goal = 15.0, 50.0, 100.0
def caught(Vc, dt=1e-5):
    cx = cy = ry = 0.0
    while ry < goal:
        ry += Vr * dt
        dx, dy = x0 - cx, ry - cy
        d = np.hypot(dx, dy)
        if d < 5e-3: return True
        cx += Vc * dt * dx / d; cy += Vc * dt * dy / d
    return False
lo, hi = 15.0, 30.0
for _ in range(40):
    mid = (lo + hi) / 2
    hi, lo = (mid, lo) if caught(mid) else (hi, mid)
print(hi, 15 * (np.sqrt(17) + 1) / 4)         # ~19.2, 19.21