FA-68496 / Toll and parking fee computation / Open access
Closed-system distance toll: the class percentage is truncated to a whole factor · case 01
Closed-system distance toll returns a wrong result when the class percentage is truncated to a whole factor.
ROOT CAUSE
The class multiplier is applied after rounding to 5 cents, so class tolls are not multiples of 5 cents.
VERIFIED REPAIR
Restore the class multiplier stage rule so that the step reads `raw = dist * x['rate_milli'] * mult // 100 toll = (raw + 2500) // 5000 * 5`.
Unsuccessful approach: Integer-dividing the percentage first turns 150 percent into 1x.
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']
toll = (raw + 2500) // 5000 * 5 * mult // 100
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', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'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', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', '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': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, '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': [['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', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'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', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, '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', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'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', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'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', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], '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}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'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', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], '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)]]
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 | 1068 | 1065 | Failed |
| fee oracle 1 | 340 | 340 | Passed |
| fee oracle 2 | 885 | 885 | Passed |
| fee oracle 3 | 307 | 310 | Failed |
| fee oracle 4 | 200 | 200 | Passed |
| fee oracle 5 | 4395 | 4400 | Failed |
| fee oracle 6 | 150 | 150 | Passed |
| fee oracle 7 | 285 | 285 | Passed |
SHA-256 / 3065ef95a07bbb258030b4d28d2788ae757e88ab6fd00d5a5741c21326d89132
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 + 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', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'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', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', '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': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, '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': [['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', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'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', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, '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', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'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', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'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', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], '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}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'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', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], '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)]]
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 | 945 | 1065 | Failed |
| fee oracle 1 | 340 | 340 | Passed |
| fee oracle 2 | 590 | 885 | Failed |
| fee oracle 3 | 205 | 310 | Failed |
| fee oracle 4 | 200 | 200 | Passed |
| fee oracle 5 | 4400 | 4400 | Passed |
| fee oracle 6 | 150 | 150 | Passed |
| fee oracle 7 | 285 | 285 | Passed |
SHA-256 / 9028676c19561ad0c4d4dd6a8eb82096c4ecdf62e74d970982f64e5e3fb7c364
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', 50], ['P1', 52], ['P2', 111], ['P3', 134], ['P4', 163]], 'entry': 'P2', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 1065), ({'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', 47], ['P1', 80], ['P2', 145], ['P3', 160], ['P4', 171], ['P5', 191]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 310), ({'plazas': [['P0', 1], ['P1', 12], ['P2', 60], ['P3', 92], ['P4', 101], ['P5', 173]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 18], ['P1', 44], ['P2', 181], ['P3', 185]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 4400), ({'plazas': [['P0', 114], ['P1', 136], ['P2', 151]], 'entry': 'P1', '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': [['P0', 32], ['P1', 67], ['P2', 76], ['P3', 86], ['P4', 95], ['P5', 114]], 'entry': None, 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 285)], [({'plazas': [['P0', 14], ['P1', 101], ['P2', 158]], 'entry': 'P2', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 385), ({'plazas': [['P0', 1], ['P1', 46], ['P2', 104], ['P3', 106], ['P4', 161]], 'entry': 'P3', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 76], ['P1', 103], ['P2', 138], ['P3', 193]], 'entry': 'P1', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 6200, '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': [['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', 63], ['P1', 87], ['P2', 92], ['P3', 94], ['P4', 158]], 'entry': 'P0', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 500}, 420), ({'plazas': [['P0', 52], ['P1', 68], ['P2', 137], ['P3', 151]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 46], ['P1', 68], ['P2', 103], ['P3', 127], ['P4', 157], ['P5', 165]], 'entry': 'P5', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 1255)], [({'plazas': [['P0', 18], ['P1', 51], ['P2', 77], ['P3', 104], ['P4', 151]], 'entry': 'P1', 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 9000, 'min_toll': 150, 'uturn_fee': 200}, 715), ({'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', 39], ['P1', 78], ['P2', 81], ['P3', 194]], 'entry': 'P2', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 9], ['P1', 81], ['P2', 137]], 'entry': None, 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 970), ({'plazas': [['P0', 111], ['P1', 114], ['P2', 169]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 200), ({'plazas': [['P0', 10], ['P1', 63], ['P2', 121]], 'entry': 'P1', 'exit': 'P1', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 4500, 'min_toll': 50, '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', 3], ['P1', 22], ['P2', 95], ['P3', 131], ['P4', 183]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 9000, 'min_toll': 100, 'uturn_fee': 200}, 2485)], [({'plazas': [['P0', 21], ['P1', 23], ['P2', 36], ['P3', 168], ['P4', 188]], 'entry': 'P0', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 500}, 205), ({'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', 5], ['P1', 28], ['P2', 70], ['P3', 127], ['P4', 130]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 4500, 'min_toll': 100, 'uturn_fee': 200}, 255), ({'plazas': [['P0', 24], ['P1', 121], ['P2', 158], ['P3', 198]], 'entry': None, 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 2, 'rate_milli': 7750, 'min_toll': 150, 'uturn_fee': 500}, 2025), ({'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', 29], ['P1', 45], ['P2', 49], ['P3', 122]], 'entry': None, 'exit': 'P3', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 9000, 'min_toll': 50, 'uturn_fee': 500}, 1885), ({'plazas': [['P0', 96], ['P1', 105], ['P2', 136], ['P3', 138]], '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}, 720), ({'plazas': [['P0', 34], ['P1', 128], ['P2', 173]], 'entry': 'P1', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 610)], [({'plazas': [['P0', 4], ['P1', 68], ['P2', 71], ['P3', 123], ['P4', 190]], 'entry': 'P2', 'exit': 'P4', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 6200, 'min_toll': 150, 'uturn_fee': 500}, 1660), ({'plazas': [['P0', 19], ['P1', 35], ['P2', 47], ['P3', 137], ['P4', 186]], 'entry': None, 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 4500, 'min_toll': 150, 'uturn_fee': 200}, 1405), ({'plazas': [['P0', 3], ['P1', 26], ['P2', 48]], 'entry': 'P0', 'exit': 'P0', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 1, 'rate_milli': 6200, 'min_toll': 100, 'uturn_fee': 500}, 500), ({'plazas': [['P0', 0], ['P1', 35], ['P2', 45], ['P3', 64], ['P4', 99], ['P5', 125]], 'entry': 'P4', 'exit': 'P5', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 3, 'rate_milli': 7750, 'min_toll': 50, 'uturn_fee': 200}, 455), ({'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', 1], ['P1', 37], ['P2', 87], ['P3', 89]], 'entry': 'P3', 'exit': 'P2', 'class_pct': [[1, 100], [2, 150], [3, 225], [4, 300]], 'vclass': 4, 'rate_milli': 7750, 'min_toll': 100, 'uturn_fee': 200}, 100), ({'plazas': [['P0', 10], ['P1', 45], ['P2', 161], ['P3', 194]], '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)]]
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 | 1065 | 1065 | Passed |
| fee oracle 1 | 340 | 340 | Passed |
| fee oracle 2 | 885 | 885 | Passed |
| fee oracle 3 | 310 | 310 | Passed |
| fee oracle 4 | 200 | 200 | Passed |
| fee oracle 5 | 4400 | 4400 | Passed |
| fee oracle 6 | 150 | 150 | Passed |
| fee oracle 7 | 285 | 285 | Passed |
SHA-256 / 91d8d84c3e78fffe73041ffa788bdbfab86c323418cc0e01ecac19fc961b5bf1
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.787691+00:00.
Case digest / a8a9a9dd82b01230b4c3ab51f6d78e60ddcc61bca337f1fc5edd5742ed0157cf