FA-94356 / Exam timetabling constraints / Open access
Single exam in a period reported as a clash · case 01
Every scheduled sitting is listed as a clash.
ROOT CAUSE
The clash test accepts one paper.
VERIFIED REPAIR
A clash needs at least two distinct papers.
Unsuccessful approach: Requiring three papers hides ordinary two-exam clashes.
Case contract
enrol rows [student, exam] (may repeat), period maps scheduled exams to a period, xlist groups cross-listed exams that are one physical paper (canonical name = smallest id in the group). A clash is a student with two or more distinct canonical papers in one period; unscheduled exams are ignored. Return [student, period, sorted papers] ordered by student then period.
Why this case matters
Clash detection is the primary hard constraint of exam timetabling; duplicate enrolments and cross-listing are the usual sources of false clashes.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, xlist):
canon = {}
for g in xlist:
for e in g:
canon[e] = min(g)
slots = {}
for st, ex in enrol:
if ex not in period:
continue
slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
out = []
for (st, p), papers in sorted(slots.items()):
if len(papers) >= 1:
out.append([st, p, sorted(papers)])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
[['s3', 0, ['ECON150', 'MATH101H']]]),
('boundary control 3',
[[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
{'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
[['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
('normal control 4',
[[['s3', 'BIO130']],
{'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
['s5', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
('normal control 7',
[[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
('normal control 8',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
[('regression: clash threshold 1',
[[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
('regression variant: clash threshold 2',
[[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
[['s5', 1, ['BIO130', 'HIST140']]]),
('normal control 3',
[[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
['s5', 'MATH101H']],
{'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
[['s5', 0, ['MATH101H', 'PHYS110']]]),
('normal control 4',
[[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
{'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
('normal control 5',
[[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
['s2', 'BIO130'], ['s1', 'MATH101']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
[['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
('normal control 7',
[[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
['s5', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s5', 3, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
['s3', 'BIO130']],
{'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
[]),
('partial repair guard 3',
[[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
('boundary control 4',
[[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
[]],
[['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
('normal control 5',
[[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
{'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
['s1', 'ECON150'], ['s2', 'HIST140']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
[['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101']]]),
('normal control 7',
[[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
[['MATH101H', 'MATH101']]],
[['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 1, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
('partial repair guard 3',
[[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
{'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 0, ['ECON150', 'MATH101']]]),
('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('normal control 5',
[[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
('normal control 6',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 7',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
('normal control 8',
[[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
['s1', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 3, ['CHEM120', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
['s4', 'PHYS110'], ['s1', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
[['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
[['s3', 1, ['HIST140', 'MATH101']]]),
('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('normal control 4',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
['s5', 3, ['MATH101', 'PHYS110']]]),
('normal control 6',
[[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
[['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
('normal control 7',
[[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
['s5', 'MATH101'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
[['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
[['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1 | [['s1', 0, ['MATH101']]] | [] | Failed |
| regression variant: clash threshold 2 | [['s2', 0, ['ECON150']], ['s2', 2, ['BIO130']], ['s2', 3, ['MATH101']], ['s3', 0, ['ECON150', 'MATH101H']], ['s3', 2, ['BIO130']], ['s4', 0, ['MATH101H']]] | [['s3', 0, ['ECON150', 'MATH101H']]] | Failed |
| boundary control 3 | [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]] | [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]] | Passed |
| normal control 4 | [['s3', 1, ['BIO130']]] | [] | Failed |
| normal control 5 | [['s1', 1, ['MATH101']], ['s1', 3, ['PHYS110']], ['s4', 1, ['MATH101']], ['s5', 0, ['ECON150']], ['s5', 1, ['MATH101']], ['s5', 2, ['CHEM120']]] | [] | Failed |
| normal control 6 | [['s1', 0, ['MATH101']], ['s2', 0, ['MATH101']], ['s2', 1, ['CHEM120', 'ECON150']], ['s3', 0, ['MATH101']], ['s3', 1, ['BIO130', 'HIST140']], ['s3', 2, ['MATH101']], ['s4', 1, ['BIO130']], ['s4', 2, ['MATH101']], ['s5', 1, ['HIST140']], ['s5', 2, ['MATH101']]] | [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]] | Failed |
| normal control 7 | [['s1', 2, ['CHEM120', 'MATH101']], ['s1', 3, ['PHYS110']], ['s2', 3, ['HIST140']], ['s3', 3, ['HIST140', 'PHYS110']], ['s4', 3, ['PHYS110']]] | [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]] | Failed |
| normal control 8 | [['s1', 1, ['ECON150', 'PHYS110']], ['s1', 3, ['MATH101H']], ['s2', 2, ['CHEM120', 'HIST140']], ['s3', 1, ['PHYS110']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']], ['s4', 2, ['CHEM120']], ['s5', 1, ['ECON150']], ['s5', 2, ['CHEM120']]] | [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]] | Failed |
SHA-256 / dd69f0f63ffe67b3728dfeac7bfae8574a6e376d03075d08a030b725450c9de1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, xlist):
canon = {}
for g in xlist:
for e in g:
canon[e] = min(g)
slots = {}
for st, ex in enrol:
if ex not in period:
continue
slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
out = []
for (st, p), papers in sorted(slots.items()):
if len(papers) > 2:
out.append([st, p, sorted(papers)])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
[['s3', 0, ['ECON150', 'MATH101H']]]),
('boundary control 3',
[[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
{'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
[['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
('normal control 4',
[[['s3', 'BIO130']],
{'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
['s5', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
('normal control 7',
[[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
('normal control 8',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
[('regression: clash threshold 1',
[[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
('regression variant: clash threshold 2',
[[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
[['s5', 1, ['BIO130', 'HIST140']]]),
('normal control 3',
[[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
['s5', 'MATH101H']],
{'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
[['s5', 0, ['MATH101H', 'PHYS110']]]),
('normal control 4',
[[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
{'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
('normal control 5',
[[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
['s2', 'BIO130'], ['s1', 'MATH101']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
[['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
('normal control 7',
[[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
['s5', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s5', 3, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
['s3', 'BIO130']],
{'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
[]),
('partial repair guard 3',
[[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
('boundary control 4',
[[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
[]],
[['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
('normal control 5',
[[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
{'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
['s1', 'ECON150'], ['s2', 'HIST140']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
[['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101']]]),
('normal control 7',
[[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
[['MATH101H', 'MATH101']]],
[['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 1, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
('partial repair guard 3',
[[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
{'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 0, ['ECON150', 'MATH101']]]),
('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('normal control 5',
[[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
('normal control 6',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 7',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
('normal control 8',
[[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
['s1', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 3, ['CHEM120', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
['s4', 'PHYS110'], ['s1', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
[['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
[['s3', 1, ['HIST140', 'MATH101']]]),
('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('normal control 4',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
['s5', 3, ['MATH101', 'PHYS110']]]),
('normal control 6',
[[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
[['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
('normal control 7',
[[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
['s5', 'MATH101'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
[['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
[['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1 | [] | [] | Passed |
| regression variant: clash threshold 2 | [] | [['s3', 0, ['ECON150', 'MATH101H']]] | Failed |
| boundary control 3 | [] | [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]] | Failed |
| normal control 4 | [] | [] | Passed |
| normal control 5 | [] | [] | Passed |
| normal control 6 | [] | [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]] | Failed |
| normal control 7 | [] | [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]] | Failed |
| normal control 8 | [['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]] | [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]] | Failed |
SHA-256 / e69d3743f7ed9595ea3d1eb106936fbf214020335d5138fbfaef6e32339be45c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, xlist):
canon = {}
for g in xlist:
for e in g:
canon[e] = min(g)
slots = {}
for st, ex in enrol:
if ex not in period:
continue
slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
out = []
for (st, p), papers in sorted(slots.items()):
if len(papers) > 1:
out.append([st, p, sorted(papers)])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
[['s3', 0, ['ECON150', 'MATH101H']]]),
('boundary control 3',
[[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
{'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
[['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
('normal control 4',
[[['s3', 'BIO130']],
{'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
['s5', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
('normal control 7',
[[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
('normal control 8',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
[('regression: clash threshold 1',
[[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
('regression variant: clash threshold 2',
[[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
[['s5', 1, ['BIO130', 'HIST140']]]),
('normal control 3',
[[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
['s5', 'MATH101H']],
{'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
[['s5', 0, ['MATH101H', 'PHYS110']]]),
('normal control 4',
[[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
{'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
('normal control 5',
[[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[]),
('normal control 6',
[[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
['s2', 'BIO130'], ['s1', 'MATH101']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
[['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
('normal control 7',
[[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
['s5', 'PHYS110'], ['s1', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s5', 3, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('regression variant: clash threshold 2',
[[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
['s3', 'BIO130']],
{'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
[]),
('partial repair guard 3',
[[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
('boundary control 4',
[[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
[]],
[['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
('normal control 5',
[[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
{'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('normal control 6',
[[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
['s1', 'ECON150'], ['s2', 'HIST140']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
[['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
['s5', 2, ['HIST140', 'MATH101']]]),
('normal control 7',
[[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
[['MATH101H', 'MATH101']]],
[['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 1, ['HIST140', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
['s2', 'ECON150']],
{'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
[['MATH101H', 'MATH101']]],
[['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
('partial repair guard 3',
[[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
{'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s3', 0, ['ECON150', 'MATH101']]]),
('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
('normal control 5',
[[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
('normal control 6',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 7',
[[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
{'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
('normal control 8',
[[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
['s1', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
[['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
[['s1', 3, ['CHEM120', 'MATH101']]])],
[('regression: clash threshold 1',
[[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
['s4', 'PHYS110'], ['s1', 'MATH101']],
{'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
[['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
('regression variant: clash threshold 2',
[[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
{'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
[['s3', 1, ['HIST140', 'MATH101']]]),
('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
('normal control 4',
[[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
{'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
[['MATH101H', 'MATH101']]],
[]),
('normal control 5',
[[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
[['MATH101H', 'MATH101']]],
[['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
['s5', 3, ['MATH101', 'PHYS110']]]),
('normal control 6',
[[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
[['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
('normal control 7',
[[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
['s5', 'MATH101'], ['s3', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
[['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
('normal control 8',
[[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
{'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
[['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1 | [] | [] | Passed |
| regression variant: clash threshold 2 | [['s3', 0, ['ECON150', 'MATH101H']]] | [['s3', 0, ['ECON150', 'MATH101H']]] | Passed |
| boundary control 3 | [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]] | [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]] | Passed |
| normal control 4 | [] | [] | Passed |
| normal control 5 | [] | [] | Passed |
| normal control 6 | [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]] | [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]] | Passed |
| normal control 7 | [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]] | [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]] | Passed |
| normal control 8 | [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]] | [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]] | Passed |
SHA-256 / e09013ed7e6696dfad3910b5ce2f4bcdb528d81b50b34ef174d7b333bd85ff7d
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:03.551144+00:00.
Case digest / 8e3c296751ddd91445c3fb43a32798dd52795418fce136ebc8a61b90b33a65bc