FA-68491 / Toll and parking fee computation / Open access
Closed-system distance toll: a lost ticket is charged the whole road length · case 01
Closed-system distance toll returns a wrong result when a lost ticket is charged the whole road length.
ROOT CAUSE
The largest kilometre marker is used as a distance, ignoring where the vehicle exits.
VERIFIED REPAIR
Restore the lost ticket distance rule so that the step reads `max(abs(ex - k) for k in km.values())`.
Unsuccessful approach: The full road length overcharges exits in the middle of the road.
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(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', 28], ['P1', 103], ['P2', 118], ['P3', 130], ['P4', 138], ['P5', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 123], ['P1', 131], ['P2', 148], ['P3', 151]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 185), ({'plazas': [['P0', 32], ['P1', 71], ['P2', 127], ['P3', 171], ['P4', 193]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 1630), ({'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', 21], ['P1', 31], ['P2', 66], ['P3', 81], ['P4', 122], ['P5', 140]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 38], ['P1', 139], ['P2', 148], ['P3', 199]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 495), ({'plazas': [['P0', 12], ['P1', 28], ['P2', 73], ['P3', 93], ['P4', 155]], 'entry': 'P3', 'exit': 'P3', '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': [['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': [['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', 35], ['P1', 42], ['P2', 146], ['P3', 184]], '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}, 770), ({'plazas': [['P0', 6], ['P1', 141], ['P2', 180]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 1055), ({'plazas': [['P0', 18], ['P1', 33], ['P2', 65], ['P3', 66]], 'entry': 'P2', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 150), ({'plazas': [['P0', 58], ['P1', 80], ['P2', 138], ['P3', 158], ['P4', 182], ['P5', 184]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1350), ({'plazas': [['P0', 55], ['P1', 129], ['P2', 168]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 750), ({'plazas': [['P0', 87], ['P1', 167], ['P2', 170], ['P3', 198]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 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': [['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', 47], ['P1', 50], ['P2', 160]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 80), ({'plazas': [['P0', 28], ['P1', 34], ['P2', 56], ['P3', 60], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 30], ['P1', 35], ['P2', 47], ['P3', 112], ['P4', 161]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 345), ({'plazas': [['P0', 14], ['P1', 69], ['P2', 141], ['P3', 157]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1995), ({'plazas': [['P0', 41], ['P1', 125], ['P2', 145], ['P3', 179], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1210), ({'plazas': [['P0', 62], ['P1', 108], ['P2', 129], ['P3', 135]], '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}, 620)], [({'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': [['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', 54], ['P1', 102], ['P2', 195]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 24], ['P1', 81], ['P2', 175], ['P3', 190]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 2315), ({'plazas': [['P0', 10], ['P1', 51], ['P2', 65], ['P3', 82]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 555), ({'plazas': [['P0', 53], ['P1', 73], ['P2', 95], ['P3', 102], ['P4', 135], ['P5', 173]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 720), ({'plazas': [['P0', 30], ['P1', 86], ['P2', 99], ['P3', 164], ['P4', 166], ['P5', 194]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 735), ({'plazas': [['P0', 75], ['P1', 84], ['P2', 95], ['P3', 103], ['P4', 168], ['P5', 198]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 500}, 650)], [({'plazas': [['P0', 2], ['P1', 19], ['P2', 54], ['P3', 136]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 25], ['P1', 32], ['P2', 122], ['P3', 186], ['P4', 192]], 'entry': 'P4', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 3885), ({'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', 15], ['P1', 51], ['P2', 75], ['P3', 87], ['P4', 183], ['P5', 196]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 240), ({'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', 40], ['P1', 82], ['P2', 91]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 230), ({'plazas': [['P0', 67], ['P1', 83], ['P2', 85], ['P3', 150], ['P4', 155]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 560), ({'plazas': [['P0', 19], ['P1', 65], ['P2', 102], ['P3', 126], ['P4', 129]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1445)]]
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 | 1435 | 700 | Failed |
| fee oracle 1 | 185 | 185 | Passed |
| fee oracle 2 | 1955 | 1630 | Failed |
| fee oracle 3 | 885 | 885 | Passed |
| fee oracle 4 | 500 | 500 | Passed |
| fee oracle 5 | 495 | 495 | Passed |
| fee oracle 6 | 200 | 200 | Passed |
| fee oracle 7 | 590 | 340 | Failed |
SHA-256 / fb3e3de25a9c5448dd4b38f424b0d2cf82bc2773a628ac0b6d92e36d6a4cd079
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(km.values()) - min(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', 28], ['P1', 103], ['P2', 118], ['P3', 130], ['P4', 138], ['P5', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 123], ['P1', 131], ['P2', 148], ['P3', 151]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 185), ({'plazas': [['P0', 32], ['P1', 71], ['P2', 127], ['P3', 171], ['P4', 193]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 1630), ({'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', 21], ['P1', 31], ['P2', 66], ['P3', 81], ['P4', 122], ['P5', 140]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 38], ['P1', 139], ['P2', 148], ['P3', 199]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 495), ({'plazas': [['P0', 12], ['P1', 28], ['P2', 73], ['P3', 93], ['P4', 155]], 'entry': 'P3', 'exit': 'P3', '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': [['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': [['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', 35], ['P1', 42], ['P2', 146], ['P3', 184]], '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}, 770), ({'plazas': [['P0', 6], ['P1', 141], ['P2', 180]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 1055), ({'plazas': [['P0', 18], ['P1', 33], ['P2', 65], ['P3', 66]], 'entry': 'P2', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 150), ({'plazas': [['P0', 58], ['P1', 80], ['P2', 138], ['P3', 158], ['P4', 182], ['P5', 184]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1350), ({'plazas': [['P0', 55], ['P1', 129], ['P2', 168]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 750), ({'plazas': [['P0', 87], ['P1', 167], ['P2', 170], ['P3', 198]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 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': [['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', 47], ['P1', 50], ['P2', 160]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 80), ({'plazas': [['P0', 28], ['P1', 34], ['P2', 56], ['P3', 60], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 30], ['P1', 35], ['P2', 47], ['P3', 112], ['P4', 161]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 345), ({'plazas': [['P0', 14], ['P1', 69], ['P2', 141], ['P3', 157]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1995), ({'plazas': [['P0', 41], ['P1', 125], ['P2', 145], ['P3', 179], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1210), ({'plazas': [['P0', 62], ['P1', 108], ['P2', 129], ['P3', 135]], '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}, 620)], [({'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': [['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', 54], ['P1', 102], ['P2', 195]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 24], ['P1', 81], ['P2', 175], ['P3', 190]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 2315), ({'plazas': [['P0', 10], ['P1', 51], ['P2', 65], ['P3', 82]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 555), ({'plazas': [['P0', 53], ['P1', 73], ['P2', 95], ['P3', 102], ['P4', 135], ['P5', 173]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 720), ({'plazas': [['P0', 30], ['P1', 86], ['P2', 99], ['P3', 164], ['P4', 166], ['P5', 194]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 735), ({'plazas': [['P0', 75], ['P1', 84], ['P2', 95], ['P3', 103], ['P4', 168], ['P5', 198]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 500}, 650)], [({'plazas': [['P0', 2], ['P1', 19], ['P2', 54], ['P3', 136]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 25], ['P1', 32], ['P2', 122], ['P3', 186], ['P4', 192]], 'entry': 'P4', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 3885), ({'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', 15], ['P1', 51], ['P2', 75], ['P3', 87], ['P4', 183], ['P5', 196]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 240), ({'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', 40], ['P1', 82], ['P2', 91]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 230), ({'plazas': [['P0', 67], ['P1', 83], ['P2', 85], ['P3', 150], ['P4', 155]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 560), ({'plazas': [['P0', 19], ['P1', 65], ['P2', 102], ['P3', 126], ['P4', 129]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1445)]]
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 | 1215 | 700 | Failed |
| fee oracle 1 | 185 | 185 | Passed |
| fee oracle 2 | 1630 | 1630 | Passed |
| fee oracle 3 | 885 | 885 | Passed |
| fee oracle 4 | 500 | 500 | Passed |
| fee oracle 5 | 495 | 495 | Passed |
| fee oracle 6 | 200 | 200 | Passed |
| fee oracle 7 | 590 | 340 | Failed |
SHA-256 / f2411f8d7bbb118688b425a8aa0f7b275dc7081e4b2704adff1fd0f2c926a17f
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', 28], ['P1', 103], ['P2', 118], ['P3', 130], ['P4', 138], ['P5', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 700), ({'plazas': [['P0', 123], ['P1', 131], ['P2', 148], ['P3', 151]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 200}, 185), ({'plazas': [['P0', 32], ['P1', 71], ['P2', 127], ['P3', 171], ['P4', 193]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 1630), ({'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', 21], ['P1', 31], ['P2', 66], ['P3', 81], ['P4', 122], ['P5', 140]], 'entry': 'P5', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 38], ['P1', 139], ['P2', 148], ['P3', 199]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 495), ({'plazas': [['P0', 12], ['P1', 28], ['P2', 73], ['P3', 93], ['P4', 155]], 'entry': 'P3', 'exit': 'P3', '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': [['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': [['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', 35], ['P1', 42], ['P2', 146], ['P3', 184]], '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}, 770), ({'plazas': [['P0', 6], ['P1', 141], ['P2', 180]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 1055), ({'plazas': [['P0', 18], ['P1', 33], ['P2', 65], ['P3', 66]], 'entry': 'P2', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 150), ({'plazas': [['P0', 58], ['P1', 80], ['P2', 138], ['P3', 158], ['P4', 182], ['P5', 184]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1350), ({'plazas': [['P0', 55], ['P1', 129], ['P2', 168]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 750), ({'plazas': [['P0', 87], ['P1', 167], ['P2', 170], ['P3', 198]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 200}, 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': [['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', 47], ['P1', 50], ['P2', 160]], 'entry': 'P0', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 80), ({'plazas': [['P0', 28], ['P1', 34], ['P2', 56], ['P3', 60], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 30], ['P1', 35], ['P2', 47], ['P3', 112], ['P4', 161]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 345), ({'plazas': [['P0', 14], ['P1', 69], ['P2', 141], ['P3', 157]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 200}, 1995), ({'plazas': [['P0', 41], ['P1', 125], ['P2', 145], ['P3', 179], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 1210), ({'plazas': [['P0', 62], ['P1', 108], ['P2', 129], ['P3', 135]], '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}, 620)], [({'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': [['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', 54], ['P1', 102], ['P2', 195]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 24], ['P1', 81], ['P2', 175], ['P3', 190]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 2315), ({'plazas': [['P0', 10], ['P1', 51], ['P2', 65], ['P3', 82]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 200}, 555), ({'plazas': [['P0', 53], ['P1', 73], ['P2', 95], ['P3', 102], ['P4', 135], ['P5', 173]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 500}, 720), ({'plazas': [['P0', 30], ['P1', 86], ['P2', 99], ['P3', 164], ['P4', 166], ['P5', 194]], 'entry': 'P2', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 735), ({'plazas': [['P0', 75], ['P1', 84], ['P2', 95], ['P3', 103], ['P4', 168], ['P5', 198]], 'entry': 'P3', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 500}, 650)], [({'plazas': [['P0', 2], ['P1', 19], ['P2', 54], ['P3', 136]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 25], ['P1', 32], ['P2', 122], ['P3', 186], ['P4', 192]], 'entry': 'P4', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 3885), ({'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', 15], ['P1', 51], ['P2', 75], ['P3', 87], ['P4', 183], ['P5', 196]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, 'min_toll': 50, 'uturn_fee': 200}, 240), ({'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', 40], ['P1', 82], ['P2', 91]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 230), ({'plazas': [['P0', 67], ['P1', 83], ['P2', 85], ['P3', 150], ['P4', 155]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 560), ({'plazas': [['P0', 19], ['P1', 65], ['P2', 102], ['P3', 126], ['P4', 129]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1445)]]
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 | 700 | 700 | Passed |
| fee oracle 1 | 185 | 185 | Passed |
| fee oracle 2 | 1630 | 1630 | Passed |
| fee oracle 3 | 885 | 885 | Passed |
| fee oracle 4 | 500 | 500 | Passed |
| fee oracle 5 | 495 | 495 | Passed |
| fee oracle 6 | 200 | 200 | Passed |
| fee oracle 7 | 340 | 340 | Passed |
SHA-256 / d0d7a9e39babbae80b39b90d3e41c945eab16e7bc93d1e42fd35d5ba130977b0
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.769525+00:00.
Case digest / c034669784cb41d9cd550c7027c5892b58bf85ccc38ade7c6fa785d1aaa1e7a9