FA-68501 / Toll and parking fee computation / Open access
Closed-system distance toll: tolls are truncated to 5 cents · case 01
Closed-system distance toll returns a wrong result when tolls are truncated to 5 cents.
ROOT CAUSE
Truncation rounds every toll down, losing up to 4.9 cents per trip.
VERIFIED REPAIR
Restore the five cent rounding rule so that the step reads `(raw + 2500) // 5000 * 5`.
Unsuccessful approach: Rounding up is not the stipulated half-up rule.
Case contract
Input {plazas: [[name, km]], entry (null = lost ticket), exit, class_pct, vclass, rate_milli (milli-cents per km), min_toll, uturn_fee}. Entry equal to exit pays uturn_fee. A lost ticket is charged from the plaza farthest from the exit. raw = km distance * rate * class percent / 100 (milli-cents, floored); the toll is raw rounded half-up to the nearest 5 cents, at least min_toll.
Why this case matters
Fee engines bill customers in integer cents; a wrong boundary, rounding stage or cap scope silently over- or under-charges.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
km = dict(x['plazas'])
ex = km[x['exit']]
if x['entry'] is None:
dist = max(abs(ex - k) for k in km.values())
elif x['entry'] == x['exit']:
return x['uturn_fee']
else:
dist = abs(ex - km[x['entry']])
mult = dict(x['class_pct'])[x['vclass']]
raw = dist * x['rate_milli'] * mult // 100
toll = raw // 5000 * 5
return max(toll, x['min_toll'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 95], ['P1', 112], ['P2', 151], ['P3', 171]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 35], ['P1', 41], ['P2', 125]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 56], ['P1', 106], ['P2', 112], ['P3', 154], ['P4', 158]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 505), ({'plazas': [['P0', 74], ['P1', 101], ['P2', 157], ['P3', 160], ['P4', 182]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 1], ['P1', 57], ['P2', 119], ['P3', 131], ['P4', 151], ['P5', 179]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 1010), ({'plazas': [['P0', 27], ['P1', 92], ['P2', 98], ['P3', 102], ['P4', 127], ['P5', 129]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 720), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340)], [({'plazas': [['P0', 57], ['P1', 72], ['P2', 135], ['P3', 138]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 57], ['P1', 59], ['P2', 68]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 295), ({'plazas': [['P0', 50], ['P1', 58], ['P2', 99], ['P3', 171]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 765), ({'plazas': [['P0', 4], ['P1', 54], ['P2', 75], ['P3', 103], ['P4', 148], ['P5', 177]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 16], ['P1', 129], ['P2', 136], ['P3', 191], ['P4', 197], ['P5', 199]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 1620), ({'plazas': [['P0', 7], ['P1', 21], ['P2', 140], ['P3', 144], ['P4', 167], ['P5', 198]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 1175)], [({'plazas': [['P0', 126], ['P1', 130], ['P2', 150]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 465), ({'plazas': [['P0', 38], ['P1', 49], ['P2', 78], ['P3', 83]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 105], ['P1', 114], ['P2', 156], ['P3', 186]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 58], ['P1', 68], ['P2', 75]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 30], ['P1', 104], ['P2', 126], ['P3', 143], ['P4', 165]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 305), ({'plazas': [['P0', 102], ['P1', 175], ['P2', 188], ['P3', 192]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 19], ['P1', 77], ['P2', 83], ['P3', 169]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 72], ['P1', 121], ['P2', 157], ['P3', 174], ['P4', 185]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 48], ['P1', 73], ['P2', 78], ['P3', 123], ['P4', 199]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 2810), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 32], ['P1', 34], ['P2', 103], ['P3', 108], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 49], ['P1', 56], ['P2', 106], ['P3', 196]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1630), ({'plazas': [['P0', 79], ['P1', 92], ['P2', 101], ['P3', 137], ['P4', 145]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 485)], [({'plazas': [['P0', 39], ['P1', 117], ['P2', 145], ['P3', 149]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 59], ['P2', 87], ['P3', 95], ['P4', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 51], ['P1', 84], ['P2', 190]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 41], ['P1', 119], ['P2', 146], ['P3', 148], ['P4', 159]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1360), ({'plazas': [['P0', 61], ['P1', 82], ['P2', 144], ['P3', 156]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 430), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 77], ['P1', 83], ['P2', 107], ['P3', 108], ['P4', 159], ['P5', 179]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 1460), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('fee oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 200 | 200 | Passed |
| fee oracle 1 | 200 | 200 | Passed |
| fee oracle 2 | 505 | 505 | Passed |
| fee oracle 3 | 500 | 500 | Passed |
| fee oracle 4 | 880 | 885 | Failed |
| fee oracle 5 | 1005 | 1010 | Failed |
| fee oracle 6 | 715 | 720 | Failed |
| fee oracle 7 | 340 | 340 | Passed |
SHA-256 / 462d1d7808e3b3b3b938b55fa0353268b900e69bf7b4617985e1f510302506e6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
km = dict(x['plazas'])
ex = km[x['exit']]
if x['entry'] is None:
dist = max(abs(ex - k) for k in km.values())
elif x['entry'] == x['exit']:
return x['uturn_fee']
else:
dist = abs(ex - km[x['entry']])
mult = dict(x['class_pct'])[x['vclass']]
raw = dist * x['rate_milli'] * mult // 100
toll = (raw + 4999) // 5000 * 5
return max(toll, x['min_toll'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 95], ['P1', 112], ['P2', 151], ['P3', 171]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 35], ['P1', 41], ['P2', 125]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 56], ['P1', 106], ['P2', 112], ['P3', 154], ['P4', 158]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 505), ({'plazas': [['P0', 74], ['P1', 101], ['P2', 157], ['P3', 160], ['P4', 182]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 1], ['P1', 57], ['P2', 119], ['P3', 131], ['P4', 151], ['P5', 179]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 1010), ({'plazas': [['P0', 27], ['P1', 92], ['P2', 98], ['P3', 102], ['P4', 127], ['P5', 129]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 720), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340)], [({'plazas': [['P0', 57], ['P1', 72], ['P2', 135], ['P3', 138]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 57], ['P1', 59], ['P2', 68]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 295), ({'plazas': [['P0', 50], ['P1', 58], ['P2', 99], ['P3', 171]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 765), ({'plazas': [['P0', 4], ['P1', 54], ['P2', 75], ['P3', 103], ['P4', 148], ['P5', 177]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 16], ['P1', 129], ['P2', 136], ['P3', 191], ['P4', 197], ['P5', 199]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 1620), ({'plazas': [['P0', 7], ['P1', 21], ['P2', 140], ['P3', 144], ['P4', 167], ['P5', 198]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 1175)], [({'plazas': [['P0', 126], ['P1', 130], ['P2', 150]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 465), ({'plazas': [['P0', 38], ['P1', 49], ['P2', 78], ['P3', 83]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 105], ['P1', 114], ['P2', 156], ['P3', 186]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 58], ['P1', 68], ['P2', 75]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 30], ['P1', 104], ['P2', 126], ['P3', 143], ['P4', 165]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 305), ({'plazas': [['P0', 102], ['P1', 175], ['P2', 188], ['P3', 192]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 19], ['P1', 77], ['P2', 83], ['P3', 169]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 72], ['P1', 121], ['P2', 157], ['P3', 174], ['P4', 185]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 48], ['P1', 73], ['P2', 78], ['P3', 123], ['P4', 199]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 2810), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 32], ['P1', 34], ['P2', 103], ['P3', 108], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 49], ['P1', 56], ['P2', 106], ['P3', 196]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1630), ({'plazas': [['P0', 79], ['P1', 92], ['P2', 101], ['P3', 137], ['P4', 145]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 485)], [({'plazas': [['P0', 39], ['P1', 117], ['P2', 145], ['P3', 149]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 59], ['P2', 87], ['P3', 95], ['P4', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 51], ['P1', 84], ['P2', 190]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 41], ['P1', 119], ['P2', 146], ['P3', 148], ['P4', 159]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1360), ({'plazas': [['P0', 61], ['P1', 82], ['P2', 144], ['P3', 156]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 430), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 77], ['P1', 83], ['P2', 107], ['P3', 108], ['P4', 159], ['P5', 179]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 1460), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('fee oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 200 | 200 | Passed |
| fee oracle 1 | 200 | 200 | Passed |
| fee oracle 2 | 510 | 505 | Failed |
| fee oracle 3 | 500 | 500 | Passed |
| fee oracle 4 | 885 | 885 | Passed |
| fee oracle 5 | 1010 | 1010 | Passed |
| fee oracle 6 | 720 | 720 | Passed |
| fee oracle 7 | 345 | 340 | Failed |
SHA-256 / 75a2028fec341730023d78c954723cece4507579afdcb44854682fcffd959299
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
km = dict(x['plazas'])
ex = km[x['exit']]
if x['entry'] is None:
dist = max(abs(ex - k) for k in km.values())
elif x['entry'] == x['exit']:
return x['uturn_fee']
else:
dist = abs(ex - km[x['entry']])
mult = dict(x['class_pct'])[x['vclass']]
raw = dist * x['rate_milli'] * mult // 100
toll = (raw + 2500) // 5000 * 5
return max(toll, x['min_toll'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'plazas': [['P0', 95], ['P1', 112], ['P2', 151], ['P3', 171]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 35], ['P1', 41], ['P2', 125]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 56], ['P1', 106], ['P2', 112], ['P3', 154], ['P4', 158]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 505), ({'plazas': [['P0', 74], ['P1', 101], ['P2', 157], ['P3', 160], ['P4', 182]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 1], ['P1', 57], ['P2', 119], ['P3', 131], ['P4', 151], ['P5', 179]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 1010), ({'plazas': [['P0', 27], ['P1', 92], ['P2', 98], ['P3', 102], ['P4', 127], ['P5', 129]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 720), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340)], [({'plazas': [['P0', 57], ['P1', 72], ['P2', 135], ['P3', 138]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 57], ['P1', 59], ['P2', 68]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 295), ({'plazas': [['P0', 50], ['P1', 58], ['P2', 99], ['P3', 171]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 765), ({'plazas': [['P0', 4], ['P1', 54], ['P2', 75], ['P3', 103], ['P4', 148], ['P5', 177]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 16], ['P1', 129], ['P2', 136], ['P3', 191], ['P4', 197], ['P5', 199]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 1620), ({'plazas': [['P0', 7], ['P1', 21], ['P2', 140], ['P3', 144], ['P4', 167], ['P5', 198]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 1175)], [({'plazas': [['P0', 126], ['P1', 130], ['P2', 150]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 465), ({'plazas': [['P0', 38], ['P1', 49], ['P2', 78], ['P3', 83]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 105], ['P1', 114], ['P2', 156], ['P3', 186]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 58], ['P1', 68], ['P2', 75]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 30], ['P1', 104], ['P2', 126], ['P3', 143], ['P4', 165]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 305), ({'plazas': [['P0', 102], ['P1', 175], ['P2', 188], ['P3', 192]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 19], ['P1', 77], ['P2', 83], ['P3', 169]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 72], ['P1', 121], ['P2', 157], ['P3', 174], ['P4', 185]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 150), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885), ({'plazas': [['P0', 48], ['P1', 73], ['P2', 78], ['P3', 123], ['P4', 199]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 2810), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 32], ['P1', 34], ['P2', 103], ['P3', 108], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 49], ['P1', 56], ['P2', 106], ['P3', 196]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1630), ({'plazas': [['P0', 79], ['P1', 92], ['P2', 101], ['P3', 137], ['P4', 145]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 485)], [({'plazas': [['P0', 39], ['P1', 117], ['P2', 145], ['P3', 149]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 59], ['P2', 87], ['P3', 95], ['P4', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 51], ['P1', 84], ['P2', 190]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 41], ['P1', 119], ['P2', 146], ['P3', 148], ['P4', 159]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1360), ({'plazas': [['P0', 61], ['P1', 82], ['P2', 144], ['P3', 156]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 430), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': None, 'exit': 'B', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 340), ({'plazas': [['P0', 77], ['P1', 83], ['P2', 107], ['P3', 108], ['P4', 159], ['P5', 179]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 1460), ({'plazas': [['A', 0], ['B', 40], ['C', 95]], 'entry': 'C', 'exit': 'A', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 885)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('fee oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 200 | 200 | Passed |
| fee oracle 1 | 200 | 200 | Passed |
| fee oracle 2 | 505 | 505 | Passed |
| fee oracle 3 | 500 | 500 | Passed |
| fee oracle 4 | 885 | 885 | Passed |
| fee oracle 5 | 1010 | 1010 | Passed |
| fee oracle 6 | 720 | 720 | Passed |
| fee oracle 7 | 340 | 340 | Passed |
SHA-256 / c0e0de9548ad3b0969a44f76f81f221816bcff70f65640d0955d832d03339089
Verification & scope
A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:02.813190+00:00.
Case digest / f70984d6408b2fec0f2127521e197afa2a5dac90534c63eeca9e8450aee22146