FA-68486 / Toll and parking fee computation / Open access
Closed-system distance toll: the exit kilometre marker is charged instead of the distance · case 01
Closed-system distance toll returns a wrong result when the exit kilometre marker is charged instead of the distance.
ROOT CAUSE
Westbound trips produce a negative distance and a minimum toll.
VERIFIED REPAIR
Restore the trip distance rule so that the step reads `dist = abs(ex - km[x['entry']])`.
Unsuccessful approach: Charging the larger kilometre marker bills the distance from the road origin.
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 = 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', 10], ['P1', 169], ['P2', 197]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 390), ({'plazas': [['P0', 86], ['P1', 155], ['P2', 191]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1830), ({'plazas': [['P0', 7], ['P1', 79], ['P2', 125], ['P3', 144]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, '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', 50], ['P1', 108], ['P2', 149], ['P3', 150], ['P4', 171]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, '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', 76], ['P1', 80], ['P2', 135], ['P3', 187]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 47], ['P1', 85], ['P2', 102], ['P3', 121]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 22], ['P1', 66], ['P2', 137], ['P3', 194]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 1730), ({'plazas': [['P0', 34], ['P1', 53], ['P2', 56], ['P3', 75], ['P4', 98], ['P5', 174]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 62], ['P1', 89], ['P2', 156], ['P3', 187]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 300), ({'plazas': [['P0', 23], ['P1', 31], ['P2', 33], ['P3', 36], ['P4', 105], ['P5', 176]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 740), ({'plazas': [['P0', 19], ['P1', 66], ['P2', 80], ['P3', 132], ['P4', 149], ['P5', 182]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 875), ({'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', 81], ['P1', 123], ['P2', 132]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'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', 25], ['P1', 39], ['P2', 82]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 1000), ({'plazas': [['P0', 3], ['P1', 13], ['P2', 15], ['P3', 51], ['P4', 59], ['P5', 125]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 160), ({'plazas': [['P0', 6], ['P1', 124], ['P2', 180]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 2060), ({'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', 34], ['P1', 51], ['P2', 67], ['P3', 112], ['P4', 139], ['P5', 148]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 42], ['P1', 74], ['P2', 79]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 22], ['P1', 113], ['P2', 177]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 2705), ({'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', 6], ['P1', 101], ['P2', 128], ['P3', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 56], ['P1', 61], ['P2', 124], ['P3', 149], ['P4', 181]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 50), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 129]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, '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', 69], ['P1', 73], ['P2', 184]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 12], ['P1', 136], ['P2', 152], ['P3', 158], ['P4', 165], ['P5', 192]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1360), ({'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', 10], ['P1', 29], ['P2', 129], ['P3', 145], ['P4', 158], ['P5', 183]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 255)], [({'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', 20], ['P1', 97], ['P2', 145], ['P3', 177]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 141], ['P1', 151], ['P2', 167], ['P3', 195]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, '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', 53], ['P1', 113], ['P2', 186]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1215), ({'plazas': [['P0', 7], ['P1', 10], ['P2', 85], ['P3', 97], ['P4', 154], ['P5', 162]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 1210), ({'plazas': [['P0', 22], ['P1', 57], ['P2', 163], ['P3', 166]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 26], ['P1', 32], ['P2', 48], ['P3', 82], ['P4', 120], ['P5', 133]], 'entry': 'P4', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200)]]
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 | 50 | 390 | Failed |
| fee oracle 1 | 50 | 1830 | Failed |
| fee oracle 2 | 200 | 200 | Passed |
| fee oracle 3 | 340 | 340 | Passed |
| fee oracle 4 | 150 | 150 | Passed |
| fee oracle 5 | 100 | 885 | Failed |
| fee oracle 6 | 500 | 500 | Passed |
| fee oracle 7 | 200 | 200 | Passed |
SHA-256 / 8b91dd0b7f54dbb7b8dec882cd6632d548ad0793ef4ac1516404c630160f53fe
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 = max(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', 10], ['P1', 169], ['P2', 197]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 390), ({'plazas': [['P0', 86], ['P1', 155], ['P2', 191]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1830), ({'plazas': [['P0', 7], ['P1', 79], ['P2', 125], ['P3', 144]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, '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', 50], ['P1', 108], ['P2', 149], ['P3', 150], ['P4', 171]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, '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', 76], ['P1', 80], ['P2', 135], ['P3', 187]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 47], ['P1', 85], ['P2', 102], ['P3', 121]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 22], ['P1', 66], ['P2', 137], ['P3', 194]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 1730), ({'plazas': [['P0', 34], ['P1', 53], ['P2', 56], ['P3', 75], ['P4', 98], ['P5', 174]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 62], ['P1', 89], ['P2', 156], ['P3', 187]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 300), ({'plazas': [['P0', 23], ['P1', 31], ['P2', 33], ['P3', 36], ['P4', 105], ['P5', 176]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 740), ({'plazas': [['P0', 19], ['P1', 66], ['P2', 80], ['P3', 132], ['P4', 149], ['P5', 182]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 875), ({'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', 81], ['P1', 123], ['P2', 132]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'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', 25], ['P1', 39], ['P2', 82]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 1000), ({'plazas': [['P0', 3], ['P1', 13], ['P2', 15], ['P3', 51], ['P4', 59], ['P5', 125]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 160), ({'plazas': [['P0', 6], ['P1', 124], ['P2', 180]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 2060), ({'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', 34], ['P1', 51], ['P2', 67], ['P3', 112], ['P4', 139], ['P5', 148]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 42], ['P1', 74], ['P2', 79]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 22], ['P1', 113], ['P2', 177]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 2705), ({'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', 6], ['P1', 101], ['P2', 128], ['P3', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 56], ['P1', 61], ['P2', 124], ['P3', 149], ['P4', 181]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 50), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 129]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, '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', 69], ['P1', 73], ['P2', 184]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 12], ['P1', 136], ['P2', 152], ['P3', 158], ['P4', 165], ['P5', 192]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1360), ({'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', 10], ['P1', 29], ['P2', 129], ['P3', 145], ['P4', 158], ['P5', 183]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 255)], [({'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', 20], ['P1', 97], ['P2', 145], ['P3', 177]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 141], ['P1', 151], ['P2', 167], ['P3', 195]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, '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', 53], ['P1', 113], ['P2', 186]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1215), ({'plazas': [['P0', 7], ['P1', 10], ['P2', 85], ['P3', 97], ['P4', 154], ['P5', 162]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 1210), ({'plazas': [['P0', 22], ['P1', 57], ['P2', 163], ['P3', 166]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 26], ['P1', 32], ['P2', 48], ['P3', 82], ['P4', 120], ['P5', 133]], 'entry': 'P4', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200)]]
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 | 2750 | 390 | Failed |
| fee oracle 1 | 3330 | 1830 | Failed |
| fee oracle 2 | 200 | 200 | Passed |
| fee oracle 3 | 340 | 340 | Passed |
| fee oracle 4 | 3040 | 150 | Failed |
| fee oracle 5 | 885 | 885 | Passed |
| fee oracle 6 | 500 | 500 | Passed |
| fee oracle 7 | 200 | 200 | Passed |
SHA-256 / fe3c7f1af416e6d9bc1e87d24d2e276c34c65fcf1c5e862f43a49f9256126127
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', 10], ['P1', 169], ['P2', 197]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 390), ({'plazas': [['P0', 86], ['P1', 155], ['P2', 191]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 1830), ({'plazas': [['P0', 7], ['P1', 79], ['P2', 125], ['P3', 144]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, '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', 50], ['P1', 108], ['P2', 149], ['P3', 150], ['P4', 171]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, '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', 76], ['P1', 80], ['P2', 135], ['P3', 187]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 47], ['P1', 85], ['P2', 102], ['P3', 121]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 200)], [({'plazas': [['P0', 22], ['P1', 66], ['P2', 137], ['P3', 194]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 1730), ({'plazas': [['P0', 34], ['P1', 53], ['P2', 56], ['P3', 75], ['P4', 98], ['P5', 174]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 62], ['P1', 89], ['P2', 156], ['P3', 187]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 300), ({'plazas': [['P0', 23], ['P1', 31], ['P2', 33], ['P3', 36], ['P4', 105], ['P5', 176]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 740), ({'plazas': [['P0', 19], ['P1', 66], ['P2', 80], ['P3', 132], ['P4', 149], ['P5', 182]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 875), ({'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', 81], ['P1', 123], ['P2', 132]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'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', 25], ['P1', 39], ['P2', 82]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 1000), ({'plazas': [['P0', 3], ['P1', 13], ['P2', 15], ['P3', 51], ['P4', 59], ['P5', 125]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 160), ({'plazas': [['P0', 6], ['P1', 124], ['P2', 180]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 2060), ({'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', 34], ['P1', 51], ['P2', 67], ['P3', 112], ['P4', 139], ['P5', 148]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 42], ['P1', 74], ['P2', 79]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 22], ['P1', 113], ['P2', 177]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 500}, 2705), ({'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', 6], ['P1', 101], ['P2', 128], ['P3', 182]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 56], ['P1', 61], ['P2', 124], ['P3', 149], ['P4', 181]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 50), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 129]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 150, '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', 69], ['P1', 73], ['P2', 184]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 12], ['P1', 136], ['P2', 152], ['P3', 158], ['P4', 165], ['P5', 192]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1360), ({'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', 10], ['P1', 29], ['P2', 129], ['P3', 145], ['P4', 158], ['P5', 183]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 255)], [({'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', 20], ['P1', 97], ['P2', 145], ['P3', 177]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 141], ['P1', 151], ['P2', 167], ['P3', 195]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, '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', 53], ['P1', 113], ['P2', 186]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1215), ({'plazas': [['P0', 7], ['P1', 10], ['P2', 85], ['P3', 97], ['P4', 154], ['P5', 162]], 'entry': 'P5', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 500}, 1210), ({'plazas': [['P0', 22], ['P1', 57], ['P2', 163], ['P3', 166]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 26], ['P1', 32], ['P2', 48], ['P3', 82], ['P4', 120], ['P5', 133]], 'entry': 'P4', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200)]]
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 | 390 | 390 | Passed |
| fee oracle 1 | 1830 | 1830 | Passed |
| fee oracle 2 | 200 | 200 | Passed |
| fee oracle 3 | 340 | 340 | Passed |
| fee oracle 4 | 150 | 150 | Passed |
| fee oracle 5 | 885 | 885 | Passed |
| fee oracle 6 | 500 | 500 | Passed |
| fee oracle 7 | 200 | 200 | Passed |
SHA-256 / 5375bb351b07902e5de41940862e18868497f41bed679bf85544a08791e44f03
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.656155+00:00.
Case digest / bbc7a021fcea1480e743204133da84e4bfe678c3a023bb6bb6ab0385fd0e52c1