Lookup reference for mechanics, numbers, fields and terminology. New here? Read the Tutorial first; this page is for when you need the exact figure or definition.
lphi_fuel. (Key jargon.)The board is a WGS84 ellipsoid Earth; legs are geodesic (great-circle-like) arcs.
| Leg i | Li (Mm) | Remaining after (Mm) |
|---|---|---|
| 1 | 12.3607 | 20.0000 |
| 2 | 7.6393 | 12.3607 |
| 3 | 4.7214 | 7.6393 |
| 4 | 2.9180 | 4.7214 |
| 5 | 1.8034 | 2.9180 |
| 6 | 1.1146 | 1.8034 |
| 7 | 0.6888 | 1.1146 |
| 8 | 0.4257 | 0.6888 |
Because the legs are a geometric series in Ο, and Ο obeys ΟΒ² = Ο + 1 and 1/Ο = Ο β 1 β 0.618, the leg and budget sequences satisfy the same Fibonacci-style recurrence. These are worth memorising β they turn budget questions into one-line mental arithmetic:
next_leg_dist is, everything you have left to fly (this leg
included) is 2.618 times it. So the reach edge sits at 2.618 next-leg-lengths away.
One consequence connects straight to lphi_fuel: if
the beacon lies exactly on your next-leg ring (distance = next_leg_dist),
then it sits at 1/ΟΒ² of your remaining travel β which is precisely why
lphi_fuel = β2 marks βbeacon reachable in a single legβ.
Each turn, before flying, the game adds a random angle to your submitted heading:
deviation = 7.5 Β· tan(Ο Β· (random() β 0.5)) # degrees
This is a Cauchy distribution with scale 7.5Β°. It is symmetric about 0 and heavy-tailed β it has no finite mean or variance, so βexpected valueβ reasoning fails and large excursions are routine.
Quantiles of the wobble β the half-width your deviation stays within, with the stated probability (two-sided). Note how fast the tail runs away past the median:
| P(|deviation| < x) | x | |
|---|---|---|
| 0.10 | 1.19Β° | |
| 0.25 | 3.11Β° | |
| 0.50 | 7.50Β° | = the scale Ξ³ |
| 0.75 | 18.1Β° | |
| 0.90 | 47.3Β° | |
| 0.95 | 95.3Β° | a quarter-turn |
| 0.99 | 477Β° | > one full turn |
| 0.999 | β 4780Β° | β 13 full turns |
The last rows are not typos. Because tan diverges near Β±90Β°, roughly 1 in
100 draws exceeds a full 360Β° rotation, and 1 in 1000 spins the heading
around a dozen times. The flown bearing is (heading + deviation) mod 360,
so a large kick simply wraps β a big enough wobble points your leg in an essentially
unrelated direction, anywhere on the compass. You cannot bound where a single leg lands.
On a 12.36 Mm leg, 1Β° β 216 km of cross-track error, so even a βtypicalβ few
degrees is hundreds of kilometres. This is why knowing the deviation in advance (via the
seed) is decisive: submit heading = intended_bearing β known_deviation and
the flown bearing is exact.
The location event each turn. Geographic-layer fields are present only where they apply.
| Field | Type | Meaning |
|---|---|---|
status | string | playing, landed or stranded. |
next_leg_dist | float | Length of the next leg, metres. |
deadline | string | UTC instant by which this turn's move must be committed. |
increment | float | Fischer-clock increment: seconds added to your time bank after you commit this turn's move. Constant across the round. |
localtime | string | Local wall-clock time at your position. |
utc_offset | int | Offset from UTC, seconds. |
timezone | string | IANA zone (e.g. Europe/Oslo on land/territorial waters; Etc/GMT-1 in international waters). |
ln_dist | int | Rounded natural log of distance (m) to the beacon. |
lphi_fuel | int | Floored golden-ratio log of (beacon distance / remaining travel). β₯ 0 β beacon out of reach. |
inferred_bounds | [float, float] | Near/far radii of the annulus implied by the two logs above. |
opponents | dict | Per-opponent info β see Opponent info. |
esri | string | Country by highly detailed shapes; also primary-landmass / island-size info. |
natural_earth | string | Country (Swedish POV), sometimes a subcountry; generalised shapes, often closest to the game master's definitions. |
disputed | string | Disputed territories. |
antarctic | string | Antarctic territorial claims. |
*_municipal, *_postal | string | Danish/Finnish/Norwegian/Swedish municipalities; Faroese/Norwegian postal areas. |
maritime_zone | string | Territorial waters, EEZs, seabed claims. |
iho_sea | string | IHO sea area. |
image_* | string | Present when a location image is attached. |
ln_dist is round(ln(distance_to_beacon_in_metres)). Because
it's rounded in log space, each value is a factor-of-e (β 2.718) band. A reference:
ln_dist | β centre distance | band (eΒ±0.5) |
|---|---|---|
| 13 | 0.44 Mm | 0.27 β 0.73 Mm |
| 14 | 1.20 Mm | 0.73 β 1.98 Mm |
| 15 | 3.27 Mm | 1.98 β 5.39 Mm |
| 16 | 8.89 Mm | 5.39 β 14.7 Mm |
| 17 | 24.2 Mm | 14.7 β 39.9 Mm |
Consequence: far readings barely constrain the beacon (band thousands of km wide); a close reading pins it tightly. To locate the beacon, triangulate from several readings taken at known positions β and weight the close ones.
lphi_fuel
Fuel is the ratio of your beacon distance to your remaining travel
budget: fuel = beacon_distance / remaining_travel. Fuel < 1 means the
beacon is within reach; fuel β₯ 1 means it isn't. lphi_fuel reports this in
golden-ratio steps:
lphi_fuel = floor(log_Ο(fuel))
Using the identity remaining travel = ΟΒ² Β· next_leg (see
Geometry), this is the same as
floor(log_Ο(beacon_distance / next_leg_dist) β 2) β so each unit of
lphi_fuel is one golden step measured against your next leg:
lphi_fuel | beacon distance is⦠|
|---|---|
| β₯ 0 | β₯ remaining travel β beacon out of reach (territory may still be reachable) |
| β1 | between about ΟΓ and ΟΒ²Γ the next-leg ring |
| β2 | on the next-leg ring β i.e. the beacon is a single leg away (distance β next_leg_dist) |
| β€ β3 | well inside the next-leg ring β you're close |
inferred_bounds hands you the near/far radii directly so you don't recompute
the logs by hand.
The report stacks several overlapping geographic sources. They don't always agree β they use different shapes and viewpoints β so use them together:
esri β highly detailed shapes, closest to ground truth for
coastlines and international borders, plus whether you're on the
primary landmass or a small island. This is the most reliable layer for
judging landfall β is this point actually on land, and inside which country's
borders.natural_earth β more generalised shapes from a Swedish point of view,
so it reflects different political recognitions (e.g. it recognises Kosovan
sovereignty). Often closest to how the game master defines a target territory, so it's
a good tie-breaker for βdoes this count as the target?β β but trust esri
for the physical coastline.disputed and antarctic are also sourced from Natural Earth
(disputed territories and Antarctic claims respectively).maritime_zone / iho_sea β which waters you're over
(territorial waters, EEZ, named sea). Tells you you're at sea, and roughly where.*_municipal, *_postal) β
fine-grained locality where available, useful for pinning a landing.
For seed recovery, the useful distilled signal each turn is (on land?, which country
if land, UTC offset). For landing, use esri for the coastline/border
and cross-check natural_earth for whether the game master would call it the
target.
Details worth knowing:
The round's generator is seeded like this:
timestamp = int(random.normalvariate(seed_mean, seed_std))
dt = datetime.fromtimestamp(timestamp, tz=utc)
seed = format_time(dt) # Oslo-local, Norwegian weekday/month names
So the seed is a formatted timestamp string drawn from a Gaussian around
seed_mean with spread seed_std (both given at round start). The
string is then used as CPython's string seed. Recovery exploits that there are only a
bounded number of candidate timestamps:
ln_dist annulus each turn filters
candidates even over open ocean.
Candidate landing points for a given heading are spaced on the order of ~11 km, so a
radio fix under ~5 km can single one out β but the free channels usually get there
first without spending any tape. Larger seed_std β more candidates β lean
harder on distance bands and radio.
7884 airports act as stations, each transmitting at 1 watt. A station's signal at your location attenuates with distance d as
strength = exp(βdΒ² / (2 Β· rangeΒ²))
plus a constant noise floor of 1 milliwatt acting as one extra βstationβ. When recording, the radio repeatedly samples one station at a time, chosen with probability proportional to its strength at your true position, and encodes the identities into a bit-stream.
The radio form draws great-circle rings at 1Γ, 2Γ and 3Γ your range. Those rings are iso-strength contours β a station's raw strength depends only on how many range-lengths away it is:
| distance | strength | vs. noise (1 mW) |
|---|---|---|
| 0 (right on top) | 1.000 | 1000Γ |
| 1Γ range | 0.607 | β 600Γ |
| 2Γ range | 0.135 | β 135Γ |
| 3Γ range | 0.011 | β 11Γ |
| β 3.7Γ range | 0.001 | 1Γ β drops into the noise |
So stations inside the first ring are all loud and hard to tell apart (little gradient);
stations out past the third ring are essentially inaudible. The useful, discriminating
band is roughly the 1Γβ3Γ annulus β tune range so several airports fall in
it at different bearings.
range costs no tape but decides whether your tape buys anything. A station
discriminates your location best when your distance to it is comparable to
range (that's where the Gaussian has steep gradient). Tune it to the spacing
of your nearby airports so several sit at different bearings and audible strengths. Too
small β one station dominates (you learn a distance, not a fix); too large β everything
sounds alike.
sextets tape units.sextets Β· (1 + h).sextets = 0 is a free dry run: it returns the expected
nearby stations without spending tape. Always scout first.
By default the antenna is omnidirectional (gain β‘ 1). Supply harmonics β a
list of complex coefficients β to shape a directional gain pattern. The radio forms
c = [1, *harmonics], L2-normalises it, and multiplies each station's
strength by
G(Ο) = |Ξ£_k c_k Β· e^(βikΟ)|Β²
where Ο is the bearing to the station. Because c is normalised, total gain
is conserved β a beam redistributes sensitivity, it doesn't
add any. Some patterns:
[] (or omitted): omnidirectional, G β‘ 1.[1]: a cardioid, lobe facing north, null due south.cβ = e^(iΞ²) steers the lobe to bearing Ξ² (e.g. [1j] faces
east).Each harmonic multiplies the tape cost, so directionality is worth it only when bearing is the binding constraint: collapsing an elongated (βbananaβ) fix by adding the missing bearing dimension, or steering a null onto one dominant station to bearing-find it. Few stations β directional; many stations β omni.
To pack observations into as little tape as possible, the radio builds a
Huffman code over the stations, tuned to their expected
frequencies at the point you tune to (tune_lat/tune_lon).
Huffman gives the loud, likely stations short bit-codes and rare ones long codes, so the
common case is cheap. It then draws observations from your true location
and writes their codes into the bitstream until the requested sextets (6-bit characters)
are filled.
total_obs counts only the complete observations.expected_bits_per_obs is the entropy of the tuned
distribution β the average code length. Fewer expected bits per obs β more complete
observations fit in the same tape. A concentrated distribution (small range, or a
dominant nearby station) has low entropy β short codes β many observations
per sextet; a spread-out one costs more bits each and yields fewer.
A call returns the top-10 expected stations plus any other actually observed: expected
and observed frequencies, distance and bearing from the tuning point, each station's
Huffman code, the total complete observations, the expected bits per observation, the
coefficients used, and the raw tape. The noise floor appears as a station with IATA
---.
Each opponents entry, keyed by name:
| Field | Meaning |
|---|---|
closer_to_beacon | True if their distance to the beacon is less than yours β i.e. they'd win a same-turn tie as things stand now. |
within_leg_dist_of_me | True if the distance between you and them is less than the next leg β i.e. they're within one leg of you (not of the beacon), so they could plausibly reach your vicinity this turn. |
heading | Their direction from you, as a 32-point compass bearing. |
status | playing, landed or stranded. |
Because you share the deviation sequence, their relative bearings over several turns can be back-solved into an estimate of their position and their likely landing β letting you plan to beat their beacon distance on a shared-turn landing.
The move clock is a Fischer (chess-style) clock, not a fresh allowance
each turn. You start the round with a time bank (the round base); when you commit a move,
an increment of seconds is added to the clock, and any time you didn't use
carries over to the next turn. So banking time by moving quickly early leaves you more
for a hard turn later β and dawdling eats into that reserve. The deadline
field gives you the concrete commit-by instant each turn; increment is
constant across the round (the protocol could vary it, but it doesn't). The key mechanism
for using the clock safely is the provisional move:
submit_flight may carry an optional valid_from timestamp.
Until that instant the move stays pending and freely editable; the game only
acts on it once valid_from passes.valid_from near the deadline, then overwrite it in place as your analysis
improves. You never risk missing a turn.submit_flight per turn (edit it rather than posting again).Other move types: request_radio, request_clarification (asks
the game master a question, shared with all players), message_request (a
direct message), and declare_stranded (resign the round).
seed_mean Β± NΟ, reproduces
each candidate's PRNG stream in-browser, and scores candidates against the timestamp
prior and your per-leg deviation observations. Enter each leg's observed deviation (or
mark it blank to consume the draw without constraining it); the candidates table shows
the surviving seeds and their neighbouring deviations. Observations persist within a
round.Two kinds of object are exchanged, both carrying round and turn:
Messages (you β game master):
submit_flight (heading, optional valid_from),
request_radio (sextets β₯ 0, range,
tune_lat, tune_lon, optional harmonics),
request_clarification, message_request,
declare_stranded.
Events (game master β you):
location (the masked report), flight (heading confirmation),
radio (a print-out), clarification,
direct_message, landed / stranded (terminal, with
coordinates), new_round (target_territory,
seed_mean, seed_std, tape, opponents),
and game_ended (winner, and which rule decided
it).
This page summarises the mechanics that matter at the table. The authoritative,
exhaustive protocol lives in the project's docs/protocol.md.