FA-94626 / Exam timetabling constraints / Open access
Travel shortfall reported as the full travel time · case 01
Rescheduling suggestions move exams further than necessary.
ROOT CAUSE
The shortfall ignores the existing gap.
VERIFIED REPAIR
Shortfall is needed gap minus actual gap.
Unsuccessful approach: The absolute gap is not the missing time.
Case contract
sits [student, exam, start, end], campus exam -> campus, travel "X|Y" -> minutes stored in either order. For each student's consecutive sittings by start, the needed gap is the travel time between different campuses (0 for the same campus); if the gap from previous end to next start is smaller, report [student, previous exam, next exam, shortfall].
Why this case matters
Multi-campus exam timetables must leave travel time between a student's consecutive sittings.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, campus, travel):
by = {}
for st, ex, s, e in sits:
by.setdefault(st, []).append((s, e, ex))
out = []
for st in sorted(by):
seq = sorted(by[st])
for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
gap = s2 - e1
c1, c2 = campus[x1], campus[x2]
need = 0
if c1 != c2:
need = travel.get(c1 + '|' + c2, travel.get(c2 + '|' + c1, 0))
if gap < need:
out.append([st, x1, x2, need])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
('partial repair guard 3',
[[['s4', 'BIO130', 960, 1020], ['s4', 'MATH101', 600, 690], ['s5', 'MATH101H', 735, 825],
['s3', 'PHYS110', 959, 1049], ['s3', 'ECON150', 659, 779], ['s3', 'MATH101H', 869, 959],
['s5', 'PHYS110', 825, 915], ['s4', 'MATH101H', 780, 900], ['s3', 'BIO130', 540, 630],
['s4', 'PHYS110', 1050, 1110], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30],
['s5', 'MATH101H', 'PHYS110', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'HIST140', 600, 660], ['s3', 'MATH101H', 705, 825]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s1', 'MATH101', 600, 660], ['s1', 'BIO130', 691, 781], ['s1', 'PHYS110', 812, 872]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s2', 'PHYS110', 600, 690], ['s2', 'HIST140', 808, 868], ['s4', 'PHYS110', 871, 961],
['s2', 'CHEM120', 719, 779], ['s4', 'MATH101', 540, 600], ['s4', 'MATH101H', 645, 735],
['s3', 'CHEM120', 600, 720], ['s4', 'CHEM120', 780, 840], ['s3', 'BIO130', 690, 750]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30],
['s4', 'CHEM120', 'PHYS110', 14]])],
[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('partial repair guard 3',
[[['s2', 'PHYS110', 631, 721], ['s2', 'ECON150', 736, 856], ['s2', 'HIST140', 540, 600],
['s2', 'BIO130', 887, 977]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'ECON150', 45]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('normal control 5',
[[['s2', 'BIO130', 870, 930], ['s1', 'MATH101', 600, 720], ['s3', 'MATH101', 630, 720],
['s2', 'CHEM120', 540, 660], ['s1', 'MATH101H', 780, 870], ['s3', 'MATH101H', 540, 630],
['s2', 'HIST140', 945, 1005], ['s2', 'PHYS110', 750, 810], ['s1', 'HIST140', 915, 975]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101H', 'HIST140', 15], ['s2', 'BIO130', 'HIST140', 30]]),
('normal control 6',
[[['s1', 'CHEM120', 540, 630], ['s1', 'MATH101H', 630, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 8',
[[['s2', 'CHEM120', 540, 600], ['s3', 'CHEM120', 975, 1065], ['s3', 'ECON150', 600, 720],
['s3', 'MATH101H', 765, 885], ['s2', 'MATH101', 645, 765]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s3', 'ECON150', 'MATH101H', 15]])],
[('regression: shortfall amount 1',
[[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
('regression variant: shortfall amount 2',
[[['s3', 'ECON150', 780, 840], ['s4', 'MATH101H', 600, 720], ['s3', 'HIST140', 600, 720],
['s4', 'HIST140', 1050, 1110], ['s4', 'CHEM120', 870, 990], ['s4', 'BIO130', 780, 900],
['s2', 'HIST140', 705, 795], ['s2', 'CHEM120', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s2', 'CHEM120', 'HIST140', 15], ['s4', 'BIO130', 'CHEM120', 30]]),
('partial repair guard 3',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('normal control 6',
[[['s4', 'ECON150', 600, 660], ['s2', 'PHYS110', 690, 780], ['s4', 'MATH101H', 675, 765],
['s4', 'MATH101', 780, 840], ['s2', 'CHEM120', 540, 660], ['s4', 'BIO130', 840, 960]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'ECON150', 'MATH101H', 15], ['s4', 'MATH101', 'BIO130', 30]]),
('normal control 7',
[[['s2', 'BIO130', 750, 810], ['s2', 'MATH101', 600, 690], ['s2', 'ECON150', 839, 899],
['s1', 'CHEM120', 630, 690], ['s1', 'ECON150', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'CHEM120', 60], ['s2', 'BIO130', 'ECON150', 31]]),
('normal control 8',
[[['s3', 'MATH101H', 795, 915], ['s3', 'HIST140', 944, 1064], ['s3', 'PHYS110', 600, 690],
['s3', 'MATH101', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'PHYS110', 'MATH101', 30]])],
[('regression: shortfall amount 1',
[[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
['s1', 'HIST140', 600, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
('regression variant: shortfall amount 2',
[[['s2', 'PHYS110', 660, 750], ['s5', 'ECON150', 600, 720], ['s3', 'MATH101H', 540, 630],
['s3', 'HIST140', 645, 705], ['s5', 'BIO130', 720, 840], ['s2', 'ECON150', 540, 660]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[['s2', 'ECON150', 'PHYS110', 45], ['s3', 'MATH101H', 'HIST140', 15], ['s5', 'ECON150', 'BIO130', 45]]),
('partial repair guard 3',
[[['s1', 'CHEM120', 765, 825], ['s1', 'MATH101', 600, 720], ['s1', 'ECON150', 825, 945]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s1', 'CHEM120', 'ECON150', 30]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('normal control 6',
[[['s2', 'HIST140', 540, 660], ['s5', 'CHEM120', 962, 1022], ['s4', 'ECON150', 540, 600],
['s5', 'MATH101', 721, 811], ['s5', 'ECON150', 842, 962], ['s5', 'HIST140', 600, 690],
['s4', 'HIST140', 645, 765], ['s4', 'MATH101', 960, 1020], ['s4', 'MATH101H', 855, 945],
['s2', 'PHYS110', 691, 781]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'MATH101H', 'MATH101', 15], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 7',
[[['s4', 'CHEM120', 600, 660], ['s4', 'PHYS110', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 8',
[[['s3', 'MATH101H', 600, 690], ['s5', 'CHEM120', 540, 660], ['s5', 'HIST140', 795, 915],
['s5', 'BIO130', 660, 780], ['s3', 'HIST140', 719, 839], ['s3', 'PHYS110', 869, 959]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'CHEM120', 'BIO130', 60], ['s5', 'BIO130', 'HIST140', 30]])],
[('regression: shortfall amount 1',
[[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
['s2', 'MATH101', 540, 600]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
('regression variant: shortfall amount 2',
[[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'PHYS110', 'BIO130', 30]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'MATH101', 600, 720], ['s5', 'BIO130', 540, 660], ['s5', 'MATH101H', 690, 750],
['s3', 'MATH101H', 720, 840]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[]),
('normal control 7',
[[['s2', 'MATH101H', 975, 1095], ['s2', 'CHEM120', 540, 630], ['s2', 'MATH101', 795, 915],
['s2', 'ECON150', 660, 750]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s5', 'PHYS110', 675, 735], ['s5', 'BIO130', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 30}],
[])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: shortfall amount 1 | [['s1', 'A', 'B', 30]] | [['s1', 'A', 'B', 1]] | Failed |
| regression variant: shortfall amount 2 | [['s1', 'MATH101', 'ECON150', 60], ['s4', 'BIO130', 'CHEM120', 45], ['s4', 'CHEM120', 'MATH101H', 60]] | [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]] | Failed |
| partial repair guard 3 | [['s3', 'BIO130', 'ECON150', 30], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 45], ['s5', 'MATH101H', 'PHYS110', 30]] | [['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30], ['s5', 'MATH101H', 'PHYS110', 30]] | Failed |
| boundary control 4 | [] | [] | Passed |
| boundary control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [] | [] | Passed |
| normal control 8 | [['s2', 'PHYS110', 'CHEM120', 45], ['s2', 'CHEM120', 'HIST140', 45], ['s3', 'CHEM120', 'BIO130', 0], ['s4', 'CHEM120', 'PHYS110', 45]] | [['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30], ['s4', 'CHEM120', 'PHYS110', 14]] | Failed |
SHA-256 / cd31510d8a4068535ccdc90a3e3be472c8e7c8c4eebd0fa678d9eef14fa883a4
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, campus, travel):
by = {}
for st, ex, s, e in sits:
by.setdefault(st, []).append((s, e, ex))
out = []
for st in sorted(by):
seq = sorted(by[st])
for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
gap = s2 - e1
c1, c2 = campus[x1], campus[x2]
need = 0
if c1 != c2:
need = travel.get(c1 + '|' + c2, travel.get(c2 + '|' + c1, 0))
if gap < need:
out.append([st, x1, x2, abs(gap)])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
('partial repair guard 3',
[[['s4', 'BIO130', 960, 1020], ['s4', 'MATH101', 600, 690], ['s5', 'MATH101H', 735, 825],
['s3', 'PHYS110', 959, 1049], ['s3', 'ECON150', 659, 779], ['s3', 'MATH101H', 869, 959],
['s5', 'PHYS110', 825, 915], ['s4', 'MATH101H', 780, 900], ['s3', 'BIO130', 540, 630],
['s4', 'PHYS110', 1050, 1110], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30],
['s5', 'MATH101H', 'PHYS110', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'HIST140', 600, 660], ['s3', 'MATH101H', 705, 825]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s1', 'MATH101', 600, 660], ['s1', 'BIO130', 691, 781], ['s1', 'PHYS110', 812, 872]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s2', 'PHYS110', 600, 690], ['s2', 'HIST140', 808, 868], ['s4', 'PHYS110', 871, 961],
['s2', 'CHEM120', 719, 779], ['s4', 'MATH101', 540, 600], ['s4', 'MATH101H', 645, 735],
['s3', 'CHEM120', 600, 720], ['s4', 'CHEM120', 780, 840], ['s3', 'BIO130', 690, 750]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30],
['s4', 'CHEM120', 'PHYS110', 14]])],
[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('partial repair guard 3',
[[['s2', 'PHYS110', 631, 721], ['s2', 'ECON150', 736, 856], ['s2', 'HIST140', 540, 600],
['s2', 'BIO130', 887, 977]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'ECON150', 45]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('normal control 5',
[[['s2', 'BIO130', 870, 930], ['s1', 'MATH101', 600, 720], ['s3', 'MATH101', 630, 720],
['s2', 'CHEM120', 540, 660], ['s1', 'MATH101H', 780, 870], ['s3', 'MATH101H', 540, 630],
['s2', 'HIST140', 945, 1005], ['s2', 'PHYS110', 750, 810], ['s1', 'HIST140', 915, 975]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101H', 'HIST140', 15], ['s2', 'BIO130', 'HIST140', 30]]),
('normal control 6',
[[['s1', 'CHEM120', 540, 630], ['s1', 'MATH101H', 630, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 8',
[[['s2', 'CHEM120', 540, 600], ['s3', 'CHEM120', 975, 1065], ['s3', 'ECON150', 600, 720],
['s3', 'MATH101H', 765, 885], ['s2', 'MATH101', 645, 765]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s3', 'ECON150', 'MATH101H', 15]])],
[('regression: shortfall amount 1',
[[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
('regression variant: shortfall amount 2',
[[['s3', 'ECON150', 780, 840], ['s4', 'MATH101H', 600, 720], ['s3', 'HIST140', 600, 720],
['s4', 'HIST140', 1050, 1110], ['s4', 'CHEM120', 870, 990], ['s4', 'BIO130', 780, 900],
['s2', 'HIST140', 705, 795], ['s2', 'CHEM120', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s2', 'CHEM120', 'HIST140', 15], ['s4', 'BIO130', 'CHEM120', 30]]),
('partial repair guard 3',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('normal control 6',
[[['s4', 'ECON150', 600, 660], ['s2', 'PHYS110', 690, 780], ['s4', 'MATH101H', 675, 765],
['s4', 'MATH101', 780, 840], ['s2', 'CHEM120', 540, 660], ['s4', 'BIO130', 840, 960]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'ECON150', 'MATH101H', 15], ['s4', 'MATH101', 'BIO130', 30]]),
('normal control 7',
[[['s2', 'BIO130', 750, 810], ['s2', 'MATH101', 600, 690], ['s2', 'ECON150', 839, 899],
['s1', 'CHEM120', 630, 690], ['s1', 'ECON150', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'CHEM120', 60], ['s2', 'BIO130', 'ECON150', 31]]),
('normal control 8',
[[['s3', 'MATH101H', 795, 915], ['s3', 'HIST140', 944, 1064], ['s3', 'PHYS110', 600, 690],
['s3', 'MATH101', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'PHYS110', 'MATH101', 30]])],
[('regression: shortfall amount 1',
[[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
['s1', 'HIST140', 600, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
('regression variant: shortfall amount 2',
[[['s2', 'PHYS110', 660, 750], ['s5', 'ECON150', 600, 720], ['s3', 'MATH101H', 540, 630],
['s3', 'HIST140', 645, 705], ['s5', 'BIO130', 720, 840], ['s2', 'ECON150', 540, 660]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[['s2', 'ECON150', 'PHYS110', 45], ['s3', 'MATH101H', 'HIST140', 15], ['s5', 'ECON150', 'BIO130', 45]]),
('partial repair guard 3',
[[['s1', 'CHEM120', 765, 825], ['s1', 'MATH101', 600, 720], ['s1', 'ECON150', 825, 945]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s1', 'CHEM120', 'ECON150', 30]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('normal control 6',
[[['s2', 'HIST140', 540, 660], ['s5', 'CHEM120', 962, 1022], ['s4', 'ECON150', 540, 600],
['s5', 'MATH101', 721, 811], ['s5', 'ECON150', 842, 962], ['s5', 'HIST140', 600, 690],
['s4', 'HIST140', 645, 765], ['s4', 'MATH101', 960, 1020], ['s4', 'MATH101H', 855, 945],
['s2', 'PHYS110', 691, 781]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'MATH101H', 'MATH101', 15], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 7',
[[['s4', 'CHEM120', 600, 660], ['s4', 'PHYS110', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 8',
[[['s3', 'MATH101H', 600, 690], ['s5', 'CHEM120', 540, 660], ['s5', 'HIST140', 795, 915],
['s5', 'BIO130', 660, 780], ['s3', 'HIST140', 719, 839], ['s3', 'PHYS110', 869, 959]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'CHEM120', 'BIO130', 60], ['s5', 'BIO130', 'HIST140', 30]])],
[('regression: shortfall amount 1',
[[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
['s2', 'MATH101', 540, 600]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
('regression variant: shortfall amount 2',
[[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'PHYS110', 'BIO130', 30]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'MATH101', 600, 720], ['s5', 'BIO130', 540, 660], ['s5', 'MATH101H', 690, 750],
['s3', 'MATH101H', 720, 840]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[]),
('normal control 7',
[[['s2', 'MATH101H', 975, 1095], ['s2', 'CHEM120', 540, 630], ['s2', 'MATH101', 795, 915],
['s2', 'ECON150', 660, 750]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s5', 'PHYS110', 675, 735], ['s5', 'BIO130', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 30}],
[])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: shortfall amount 1 | [['s1', 'A', 'B', 29]] | [['s1', 'A', 'B', 1]] | Failed |
| regression variant: shortfall amount 2 | [['s1', 'MATH101', 'ECON150', 30], ['s4', 'BIO130', 'CHEM120', 29], ['s4', 'CHEM120', 'MATH101H', 15]] | [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]] | Failed |
| partial repair guard 3 | [['s3', 'BIO130', 'ECON150', 29], ['s3', 'MATH101H', 'PHYS110', 0], ['s5', 'CHEM120', 'MATH101H', 15], ['s5', 'MATH101H', 'PHYS110', 0]] | [['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30], ['s5', 'MATH101H', 'PHYS110', 30]] | Failed |
| boundary control 4 | [] | [] | Passed |
| boundary control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [] | [] | Passed |
| normal control 8 | [['s2', 'PHYS110', 'CHEM120', 29], ['s2', 'CHEM120', 'HIST140', 29], ['s3', 'CHEM120', 'BIO130', 30], ['s4', 'CHEM120', 'PHYS110', 31]] | [['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30], ['s4', 'CHEM120', 'PHYS110', 14]] | Failed |
SHA-256 / 8e4afc0e4ad2c93103b05775d49dc873fd9a25b7dec15fe0f5058e9778283931
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, campus, travel):
by = {}
for st, ex, s, e in sits:
by.setdefault(st, []).append((s, e, ex))
out = []
for st in sorted(by):
seq = sorted(by[st])
for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
gap = s2 - e1
c1, c2 = campus[x1], campus[x2]
need = 0
if c1 != c2:
need = travel.get(c1 + '|' + c2, travel.get(c2 + '|' + c1, 0))
if gap < need:
out.append([st, x1, x2, need - gap])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
('partial repair guard 3',
[[['s4', 'BIO130', 960, 1020], ['s4', 'MATH101', 600, 690], ['s5', 'MATH101H', 735, 825],
['s3', 'PHYS110', 959, 1049], ['s3', 'ECON150', 659, 779], ['s3', 'MATH101H', 869, 959],
['s5', 'PHYS110', 825, 915], ['s4', 'MATH101H', 780, 900], ['s3', 'BIO130', 540, 630],
['s4', 'PHYS110', 1050, 1110], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30],
['s5', 'MATH101H', 'PHYS110', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'HIST140', 600, 660], ['s3', 'MATH101H', 705, 825]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s1', 'MATH101', 600, 660], ['s1', 'BIO130', 691, 781], ['s1', 'PHYS110', 812, 872]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s2', 'PHYS110', 600, 690], ['s2', 'HIST140', 808, 868], ['s4', 'PHYS110', 871, 961],
['s2', 'CHEM120', 719, 779], ['s4', 'MATH101', 540, 600], ['s4', 'MATH101H', 645, 735],
['s3', 'CHEM120', 600, 720], ['s4', 'CHEM120', 780, 840], ['s3', 'BIO130', 690, 750]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30],
['s4', 'CHEM120', 'PHYS110', 14]])],
[('regression: shortfall amount 1',
[[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('regression variant: shortfall amount 2',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('partial repair guard 3',
[[['s2', 'PHYS110', 631, 721], ['s2', 'ECON150', 736, 856], ['s2', 'HIST140', 540, 600],
['s2', 'BIO130', 887, 977]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s2', 'PHYS110', 'ECON150', 45]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('normal control 5',
[[['s2', 'BIO130', 870, 930], ['s1', 'MATH101', 600, 720], ['s3', 'MATH101', 630, 720],
['s2', 'CHEM120', 540, 660], ['s1', 'MATH101H', 780, 870], ['s3', 'MATH101H', 540, 630],
['s2', 'HIST140', 945, 1005], ['s2', 'PHYS110', 750, 810], ['s1', 'HIST140', 915, 975]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101H', 'HIST140', 15], ['s2', 'BIO130', 'HIST140', 30]]),
('normal control 6',
[[['s1', 'CHEM120', 540, 630], ['s1', 'MATH101H', 630, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 7',
[[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 8',
[[['s2', 'CHEM120', 540, 600], ['s3', 'CHEM120', 975, 1065], ['s3', 'ECON150', 600, 720],
['s3', 'MATH101H', 765, 885], ['s2', 'MATH101', 645, 765]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s3', 'ECON150', 'MATH101H', 15]])],
[('regression: shortfall amount 1',
[[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
('regression variant: shortfall amount 2',
[[['s3', 'ECON150', 780, 840], ['s4', 'MATH101H', 600, 720], ['s3', 'HIST140', 600, 720],
['s4', 'HIST140', 1050, 1110], ['s4', 'CHEM120', 870, 990], ['s4', 'BIO130', 780, 900],
['s2', 'HIST140', 705, 795], ['s2', 'CHEM120', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s2', 'CHEM120', 'HIST140', 15], ['s4', 'BIO130', 'CHEM120', 30]]),
('partial repair guard 3',
[[['s1', 'ECON150', 540, 660], ['s4', 'BIO130', 690, 810], ['s4', 'PHYS110', 870, 960],
['s1', 'BIO130', 630, 720], ['s4', 'MATH101H', 1020, 1140], ['s4', 'HIST140', 600, 690],
['s1', 'MATH101', 751, 841]],
{'MATH101': 'south',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'BIO130', 60], ['s4', 'HIST140', 'BIO130', 60]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
[['s1', 'A', 'B', 10]]),
('normal control 6',
[[['s4', 'ECON150', 600, 660], ['s2', 'PHYS110', 690, 780], ['s4', 'MATH101H', 675, 765],
['s4', 'MATH101', 780, 840], ['s2', 'CHEM120', 540, 660], ['s4', 'BIO130', 840, 960]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'south',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'ECON150', 'MATH101H', 15], ['s4', 'MATH101', 'BIO130', 30]]),
('normal control 7',
[[['s2', 'BIO130', 750, 810], ['s2', 'MATH101', 600, 690], ['s2', 'ECON150', 839, 899],
['s1', 'CHEM120', 630, 690], ['s1', 'ECON150', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'ECON150', 'CHEM120', 60], ['s2', 'BIO130', 'ECON150', 31]]),
('normal control 8',
[[['s3', 'MATH101H', 795, 915], ['s3', 'HIST140', 944, 1064], ['s3', 'PHYS110', 600, 690],
['s3', 'MATH101', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'north',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'north',
'ECON150': 'city'},
{'north|south': 45, 'city|north': 30}],
[['s3', 'PHYS110', 'MATH101', 30]])],
[('regression: shortfall amount 1',
[[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
['s1', 'HIST140', 600, 720]],
{'MATH101': 'north',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
('regression variant: shortfall amount 2',
[[['s2', 'PHYS110', 660, 750], ['s5', 'ECON150', 600, 720], ['s3', 'MATH101H', 540, 630],
['s3', 'HIST140', 645, 705], ['s5', 'BIO130', 720, 840], ['s2', 'ECON150', 540, 660]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[['s2', 'ECON150', 'PHYS110', 45], ['s3', 'MATH101H', 'HIST140', 15], ['s5', 'ECON150', 'BIO130', 45]]),
('partial repair guard 3',
[[['s1', 'CHEM120', 765, 825], ['s1', 'MATH101', 600, 720], ['s1', 'ECON150', 825, 945]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'south',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 30}],
[['s1', 'CHEM120', 'ECON150', 30]]),
('boundary control 4',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
[['s1', 'A', 'B', 1]]),
('normal control 6',
[[['s2', 'HIST140', 540, 660], ['s5', 'CHEM120', 962, 1022], ['s4', 'ECON150', 540, 600],
['s5', 'MATH101', 721, 811], ['s5', 'ECON150', 842, 962], ['s5', 'HIST140', 600, 690],
['s4', 'HIST140', 645, 765], ['s4', 'MATH101', 960, 1020], ['s4', 'MATH101H', 855, 945],
['s2', 'PHYS110', 691, 781]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'north',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[['s4', 'MATH101H', 'MATH101', 15], ['s5', 'ECON150', 'CHEM120', 30]]),
('normal control 7',
[[['s4', 'CHEM120', 600, 660], ['s4', 'PHYS110', 690, 780]],
{'MATH101': 'north',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 30}],
[]),
('normal control 8',
[[['s3', 'MATH101H', 600, 690], ['s5', 'CHEM120', 540, 660], ['s5', 'HIST140', 795, 915],
['s5', 'BIO130', 660, 780], ['s3', 'HIST140', 719, 839], ['s3', 'PHYS110', 869, 959]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'city',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'CHEM120', 'BIO130', 60], ['s5', 'BIO130', 'HIST140', 30]])],
[('regression: shortfall amount 1',
[[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
['s2', 'MATH101', 540, 600]],
{'MATH101': 'south',
'MATH101H': 'north',
'PHYS110': 'north',
'CHEM120': 'city',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'city'},
{'north|south': 30, 'city|north': 60}],
[['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
('regression variant: shortfall amount 2',
[[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'north',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 45, 'city|north': 60}],
[['s5', 'PHYS110', 'BIO130', 30]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
{'MATH101': 'city',
'MATH101H': 'city',
'PHYS110': 'city',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'south',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 60}],
[['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
('boundary control 4',
[[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
('boundary control 5',
[[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
('normal control 6',
[[['s3', 'MATH101', 600, 720], ['s5', 'BIO130', 540, 660], ['s5', 'MATH101H', 690, 750],
['s3', 'MATH101H', 720, 840]],
{'MATH101': 'south',
'MATH101H': 'city',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'city',
'ECON150': 'north'},
{'north|south': 45, 'city|north': 60}],
[]),
('normal control 7',
[[['s2', 'MATH101H', 975, 1095], ['s2', 'CHEM120', 540, 630], ['s2', 'MATH101', 795, 915],
['s2', 'ECON150', 660, 750]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'south',
'CHEM120': 'north',
'BIO130': 'city',
'HIST140': 'south',
'ECON150': 'north'},
{'north|south': 30, 'city|north': 30}],
[]),
('normal control 8',
[[['s5', 'PHYS110', 675, 735], ['s5', 'BIO130', 540, 630]],
{'MATH101': 'city',
'MATH101H': 'south',
'PHYS110': 'north',
'CHEM120': 'north',
'BIO130': 'south',
'HIST140': 'north',
'ECON150': 'south'},
{'north|south': 30, 'city|north': 30}],
[])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: shortfall amount 1 | [['s1', 'A', 'B', 1]] | [['s1', 'A', 'B', 1]] | Passed |
| regression variant: shortfall amount 2 | [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]] | [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]] | Passed |
| partial repair guard 3 | [['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30], ['s5', 'MATH101H', 'PHYS110', 30]] | [['s3', 'BIO130', 'ECON150', 1], ['s3', 'MATH101H', 'PHYS110', 30], ['s5', 'CHEM120', 'MATH101H', 30], ['s5', 'MATH101H', 'PHYS110', 30]] | Passed |
| boundary control 4 | [] | [] | Passed |
| boundary control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [] | [] | Passed |
| normal control 8 | [['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30], ['s4', 'CHEM120', 'PHYS110', 14]] | [['s2', 'PHYS110', 'CHEM120', 16], ['s2', 'CHEM120', 'HIST140', 16], ['s3', 'CHEM120', 'BIO130', 30], ['s4', 'CHEM120', 'PHYS110', 14]] | Passed |
SHA-256 / 9a710a97f6f5468444096157dc8c9417e25b35a099eda9b8b6e65405d6c45723
Verification & scope
Stipulated toy exam-timetabling rule set for a bounded model; it does not claim conformance with any institution's regulations or a benchmark specification, and it performs no search or optimisation. 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:52:06.079962+00:00.
Case digest / 16b36f07ae83576c9b3237b0d6849696a1f730d7a9974d22d759acc15f274b90