FA-94376 / Exam timetabling constraints / Open access
Clashing pair counted as two-in-a-day · case 01
Same-period clashes inflate the two-in-a-day penalty.
ROOT CAUSE
The same-day fallback branch also catches distance zero.
VERIFIED REPAIR
Count two-in-a-day only for same-day pairs more than one period apart.
Unsuccessful approach: Allowing distance zero is the same defect.
Case contract
Periods are numbered consecutively with spd slots per day (day = p // spd). For each student and each pair of their distinct exams: same day and adjacent periods counts two-in-a-row; same day and further apart counts two-in-a-day (same-period clashes count neither); periods 1..spread apart count period spread regardless of day. w = [row weight, day weight, spread]. Return [row, day, spread count, weighted total].
Why this case matters
Proximity soft constraints are what exam timetabling quality is judged on; each counter has its own boundary.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, spd, w):
wr, wd, spread = w
by = {}
for st, ex in enrol:
by.setdefault(st, set()).add(ex)
row = day = spr = 0
for st in by:
ps = sorted(period[e] for e in by[st])
for i in range(len(ps)):
for j in range(i + 1, len(ps)):
a, b = ps[i], ps[j]
if a // spd == b // spd:
if b - a == 1:
row += 1
else:
day += 1
if 0 < b - a <= spread:
spr += 1
return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: two in day lower bound 1',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'ECON150'],
['s4', 'ECON150'], ['s4', 'HIST140'], ['s3', 'MATH101'], ['s1', 'BIO130']],
{'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 5, 'ECON150': 2}, 2,
[10, 1, 2]],
[1, 0, 2, 12]),
('partial repair guard 3',
[[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s3', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 3, 4]],
[3, 0, 16, 46]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
('normal control 5',
[[['s1', 'ECON150'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s1', 'HIST140'], ['s5', 'PHYS110'],
['s1', 'MATH101'], ['s1', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 10, 'BIO130': 1, 'HIST140': 9, 'ECON150': 2}, 4,
[10, 2, 4]],
[3, 0, 3, 33]),
('normal control 6',
[[['s5', 'HIST140'], ['s3', 'PHYS110'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s1', 'HIST140'],
['s3', 'MATH101'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s3', 'ECON150'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'BIO130'], ['s5', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 2, 'ECON150': 4}, 2,
[5, 1, 4]],
[2, 0, 8, 18]),
('normal control 7',
[[['s4', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'CHEM120']],
{'MATH101': 8, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 8, 'ECON150': 4}, 4,
[10, 1, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s2', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 1, 4]],
[0, 0, 0, 0])],
[('regression: two in day lower bound 1',
[[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
['s1', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
[10, 3, 2]],
[0, 0, 4, 4]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
['s4', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
[10, 1, 2]],
[1, 4, 6, 20]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s2', 'ECON150'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s4', 'MATH101H'],
['s1', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'HIST140'],
['s5', 'CHEM120'], ['s5', 'HIST140']],
{'MATH101': 6, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0}, 3,
[5, 3, 2]],
[0, 6, 8, 26]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
('normal control 5',
[[['s3', 'MATH101'], ['s1', 'BIO130'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s1', 'CHEM120'], ['s3', 'MATH101H'], ['s3', 'BIO130']],
{'MATH101': 6, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 8, 'BIO130': 2, 'HIST140': 7, 'ECON150': 3}, 3,
[5, 2, 2]],
[3, 1, 4, 21]),
('normal control 6',
[[['s2', 'BIO130'], ['s2', 'PHYS110'], ['s1', 'MATH101'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
['s3', 'BIO130'], ['s3', 'ECON150'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s4', 'MATH101'],
['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s1', 'HIST140'], ['s4', 'HIST140'],
['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 5, 'ECON150': 4}, 2,
[5, 2, 4]],
[0, 0, 13, 13]),
('normal control 7',
[[['s5', 'PHYS110'], ['s2', 'MATH101H'], ['s4', 'HIST140'], ['s1', 'BIO130'], ['s2', 'BIO130'],
['s5', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101'], ['s3', 'MATH101'],
['s5', 'BIO130'], ['s4', 'MATH101H'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 8, 'BIO130': 6, 'HIST140': 1, 'ECON150': 2}, 3,
[5, 3, 1]],
[0, 1, 0, 3]),
('normal control 8',
[[['s4', 'MATH101'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s5', 'PHYS110'], ['s1', 'MATH101H'],
['s2', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s2', 'ECON150'],
['s4', 'PHYS110'], ['s3', 'ECON150'], ['s1', 'PHYS110'], ['s3', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 4, 'ECON150': 2}, 2,
[5, 3, 2]],
[3, 0, 8, 23])],
[('regression: two in day lower bound 1',
[[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
{'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
[5, 2, 4]],
[2, 0, 2, 12]),
('regression variant: two in day lower bound 2',
[[['s3', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s3', 'HIST140'], ['s3', 'BIO130'],
['s4', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'CHEM120'], ['s2', 'ECON150'],
['s1', 'HIST140'], ['s1', 'BIO130']],
{'MATH101': 5, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 0, 'ECON150': 4}, 2,
[5, 1, 2]],
[2, 0, 4, 14]),
('partial repair guard 3',
[[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
{'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
[10, 3, 4]],
[0, 0, 3, 3]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'MATH101'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s3', 'MATH101'], ['s3', 'MATH101H'],
['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'HIST140'], ['s4', 'MATH101']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 6, 'HIST140': 5, 'ECON150': 11}, 4,
[10, 1, 2]],
[0, 3, 3, 6]),
('normal control 6',
[[['s1', 'MATH101'], ['s2', 'MATH101'], ['s5', 'BIO130'], ['s4', 'PHYS110'], ['s5', 'ECON150'],
['s3', 'ECON150'], ['s4', 'ECON150'], ['s5', 'MATH101'], ['s4', 'CHEM120'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s4', 'MATH101H'], ['s5', 'CHEM120'], ['s2', 'BIO130']],
{'MATH101': 8, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}, 3,
[10, 3, 4]],
[2, 1, 9, 32]),
('normal control 7',
[[['s1', 'HIST140'], ['s4', 'PHYS110'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s2', 'HIST140'],
['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'MATH101'], ['s2', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 2, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 1, 2]],
[1, 0, 5, 15]),
('normal control 8',
[[['s3', 'BIO130'], ['s4', 'MATH101'], ['s5', 'ECON150'], ['s1', 'MATH101H'], ['s1', 'BIO130'],
['s5', 'PHYS110'], ['s5', 'BIO130']],
{'MATH101': 1, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}, 2,
[10, 3, 2]],
[1, 0, 1, 11])],
[('regression: two in day lower bound 1',
[[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
['s5', 'ECON150']],
{'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
[10, 3, 1]],
[0, 0, 1, 1]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'BIO130'], ['s1', 'BIO130'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'ECON150'],
['s1', 'HIST140'], ['s4', 'HIST140'], ['s4', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 2, 2]],
[5, 0, 6, 56]),
('partial repair guard 3',
[[['s1', 'MATH101H'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 2, 'ECON150': 1}, 2,
[5, 2, 1]],
[2, 0, 2, 12]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('normal control 5',
[[['s5', 'MATH101H'], ['s2', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s5', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 5, 'PHYS110': 0, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 6, 'ECON150': 1}, 3,
[10, 3, 4]],
[1, 0, 2, 12]),
('normal control 6',
[[['s5', 'MATH101'], ['s1', 'CHEM120'], ['s4', 'MATH101H'], ['s4', 'HIST140'], ['s3', 'MATH101'],
['s4', 'ECON150'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 9, 'ECON150': 0}, 4,
[5, 3, 1]],
[0, 2, 0, 6]),
('normal control 7',
[[['s2', 'MATH101'], ['s1', 'HIST140'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'CHEM120'],
['s1', 'BIO130'], ['s1', 'BIO130'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 8, 'HIST140': 8, 'ECON150': 5}, 3,
[10, 3, 1]],
[1, 0, 1, 11]),
('normal control 8',
[[['s5', 'MATH101'], ['s5', 'ECON150'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'PHYS110'],
['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s5', 'MATH101H'], ['s2', 'BIO130'], ['s3', 'ECON150']],
{'MATH101': 0, 'MATH101H': 5, 'PHYS110': 11, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 11, 'ECON150': 2}, 4,
[10, 1, 2]],
[0, 3, 4, 7])],
[('regression: two in day lower bound 1',
[[['s5', 'MATH101'], ['s5', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'MATH101'], ['s4', 'CHEM120'], ['s3', 'PHYS110'],
['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 9, 'ECON150': 1}, 4,
[5, 1, 1]],
[0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'ECON150'], ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s1', 'HIST140'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s2', 'PHYS110']],
{'MATH101': 6, 'MATH101H': 8, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 8, 'ECON150': 2}, 3,
[5, 3, 2]],
[3, 0, 3, 18]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s3', 'HIST140'], ['s4', 'MATH101'], ['s1', 'MATH101'], ['s5', 'MATH101'],
['s3', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s2', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 1, 2]],
[1, 0, 3, 13]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'MATH101'], ['s5', 'PHYS110'], ['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 6, 'ECON150': 0}, 3,
[5, 3, 4]],
[2, 1, 4, 17]),
('normal control 6',
[[['s4', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s3', 'MATH101H'],
['s2', 'PHYS110'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 10, 'ECON150': 11}, 4,
[10, 1, 1]],
[3, 1, 3, 34]),
('normal control 7',
[[['s1', 'HIST140'], ['s1', 'MATH101']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 2, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s4', 'CHEM120'], ['s4', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 5, 'ECON150': 4}, 2,
[10, 2, 2]],
[0, 0, 0, 0])]]
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: two in day lower bound 1 | [0, 1, 0, 2] | [0, 0, 0, 0] | Failed |
| regression variant: two in day lower bound 2 | [1, 1, 2, 13] | [1, 0, 2, 12] | Failed |
| partial repair guard 3 | [3, 1, 16, 49] | [3, 0, 16, 46] | Failed |
| boundary control 4 | [0, 1, 1, 3] | [0, 1, 1, 3] | Passed |
| normal control 5 | [3, 0, 3, 33] | [3, 0, 3, 33] | Passed |
| normal control 6 | [2, 2, 8, 20] | [2, 0, 8, 18] | Failed |
| normal control 7 | [0, 1, 0, 1] | [0, 0, 0, 0] | Failed |
| normal control 8 | [0, 0, 0, 0] | [0, 0, 0, 0] | Passed |
SHA-256 / 597cb5bf958a8aa22fc33d9321a3d28249391b71f520a0955c9b90738fefe98b
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, spd, w):
wr, wd, spread = w
by = {}
for st, ex in enrol:
by.setdefault(st, set()).add(ex)
row = day = spr = 0
for st in by:
ps = sorted(period[e] for e in by[st])
for i in range(len(ps)):
for j in range(i + 1, len(ps)):
a, b = ps[i], ps[j]
if a // spd == b // spd:
if b - a == 1:
row += 1
elif b - a >= 0:
day += 1
if 0 < b - a <= spread:
spr += 1
return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: two in day lower bound 1',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'ECON150'],
['s4', 'ECON150'], ['s4', 'HIST140'], ['s3', 'MATH101'], ['s1', 'BIO130']],
{'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 5, 'ECON150': 2}, 2,
[10, 1, 2]],
[1, 0, 2, 12]),
('partial repair guard 3',
[[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s3', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 3, 4]],
[3, 0, 16, 46]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
('normal control 5',
[[['s1', 'ECON150'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s1', 'HIST140'], ['s5', 'PHYS110'],
['s1', 'MATH101'], ['s1', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 10, 'BIO130': 1, 'HIST140': 9, 'ECON150': 2}, 4,
[10, 2, 4]],
[3, 0, 3, 33]),
('normal control 6',
[[['s5', 'HIST140'], ['s3', 'PHYS110'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s1', 'HIST140'],
['s3', 'MATH101'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s3', 'ECON150'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'BIO130'], ['s5', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 2, 'ECON150': 4}, 2,
[5, 1, 4]],
[2, 0, 8, 18]),
('normal control 7',
[[['s4', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'CHEM120']],
{'MATH101': 8, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 8, 'ECON150': 4}, 4,
[10, 1, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s2', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 1, 4]],
[0, 0, 0, 0])],
[('regression: two in day lower bound 1',
[[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
['s1', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
[10, 3, 2]],
[0, 0, 4, 4]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
['s4', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
[10, 1, 2]],
[1, 4, 6, 20]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s2', 'ECON150'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s4', 'MATH101H'],
['s1', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'HIST140'],
['s5', 'CHEM120'], ['s5', 'HIST140']],
{'MATH101': 6, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0}, 3,
[5, 3, 2]],
[0, 6, 8, 26]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
('normal control 5',
[[['s3', 'MATH101'], ['s1', 'BIO130'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s1', 'CHEM120'], ['s3', 'MATH101H'], ['s3', 'BIO130']],
{'MATH101': 6, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 8, 'BIO130': 2, 'HIST140': 7, 'ECON150': 3}, 3,
[5, 2, 2]],
[3, 1, 4, 21]),
('normal control 6',
[[['s2', 'BIO130'], ['s2', 'PHYS110'], ['s1', 'MATH101'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
['s3', 'BIO130'], ['s3', 'ECON150'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s4', 'MATH101'],
['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s1', 'HIST140'], ['s4', 'HIST140'],
['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 5, 'ECON150': 4}, 2,
[5, 2, 4]],
[0, 0, 13, 13]),
('normal control 7',
[[['s5', 'PHYS110'], ['s2', 'MATH101H'], ['s4', 'HIST140'], ['s1', 'BIO130'], ['s2', 'BIO130'],
['s5', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101'], ['s3', 'MATH101'],
['s5', 'BIO130'], ['s4', 'MATH101H'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 8, 'BIO130': 6, 'HIST140': 1, 'ECON150': 2}, 3,
[5, 3, 1]],
[0, 1, 0, 3]),
('normal control 8',
[[['s4', 'MATH101'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s5', 'PHYS110'], ['s1', 'MATH101H'],
['s2', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s2', 'ECON150'],
['s4', 'PHYS110'], ['s3', 'ECON150'], ['s1', 'PHYS110'], ['s3', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 4, 'ECON150': 2}, 2,
[5, 3, 2]],
[3, 0, 8, 23])],
[('regression: two in day lower bound 1',
[[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
{'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
[5, 2, 4]],
[2, 0, 2, 12]),
('regression variant: two in day lower bound 2',
[[['s3', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s3', 'HIST140'], ['s3', 'BIO130'],
['s4', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'CHEM120'], ['s2', 'ECON150'],
['s1', 'HIST140'], ['s1', 'BIO130']],
{'MATH101': 5, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 0, 'ECON150': 4}, 2,
[5, 1, 2]],
[2, 0, 4, 14]),
('partial repair guard 3',
[[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
{'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
[10, 3, 4]],
[0, 0, 3, 3]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'MATH101'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s3', 'MATH101'], ['s3', 'MATH101H'],
['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'HIST140'], ['s4', 'MATH101']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 6, 'HIST140': 5, 'ECON150': 11}, 4,
[10, 1, 2]],
[0, 3, 3, 6]),
('normal control 6',
[[['s1', 'MATH101'], ['s2', 'MATH101'], ['s5', 'BIO130'], ['s4', 'PHYS110'], ['s5', 'ECON150'],
['s3', 'ECON150'], ['s4', 'ECON150'], ['s5', 'MATH101'], ['s4', 'CHEM120'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s4', 'MATH101H'], ['s5', 'CHEM120'], ['s2', 'BIO130']],
{'MATH101': 8, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}, 3,
[10, 3, 4]],
[2, 1, 9, 32]),
('normal control 7',
[[['s1', 'HIST140'], ['s4', 'PHYS110'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s2', 'HIST140'],
['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'MATH101'], ['s2', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 2, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 1, 2]],
[1, 0, 5, 15]),
('normal control 8',
[[['s3', 'BIO130'], ['s4', 'MATH101'], ['s5', 'ECON150'], ['s1', 'MATH101H'], ['s1', 'BIO130'],
['s5', 'PHYS110'], ['s5', 'BIO130']],
{'MATH101': 1, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}, 2,
[10, 3, 2]],
[1, 0, 1, 11])],
[('regression: two in day lower bound 1',
[[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
['s5', 'ECON150']],
{'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
[10, 3, 1]],
[0, 0, 1, 1]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'BIO130'], ['s1', 'BIO130'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'ECON150'],
['s1', 'HIST140'], ['s4', 'HIST140'], ['s4', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 2, 2]],
[5, 0, 6, 56]),
('partial repair guard 3',
[[['s1', 'MATH101H'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 2, 'ECON150': 1}, 2,
[5, 2, 1]],
[2, 0, 2, 12]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('normal control 5',
[[['s5', 'MATH101H'], ['s2', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s5', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 5, 'PHYS110': 0, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 6, 'ECON150': 1}, 3,
[10, 3, 4]],
[1, 0, 2, 12]),
('normal control 6',
[[['s5', 'MATH101'], ['s1', 'CHEM120'], ['s4', 'MATH101H'], ['s4', 'HIST140'], ['s3', 'MATH101'],
['s4', 'ECON150'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 9, 'ECON150': 0}, 4,
[5, 3, 1]],
[0, 2, 0, 6]),
('normal control 7',
[[['s2', 'MATH101'], ['s1', 'HIST140'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'CHEM120'],
['s1', 'BIO130'], ['s1', 'BIO130'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 8, 'HIST140': 8, 'ECON150': 5}, 3,
[10, 3, 1]],
[1, 0, 1, 11]),
('normal control 8',
[[['s5', 'MATH101'], ['s5', 'ECON150'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'PHYS110'],
['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s5', 'MATH101H'], ['s2', 'BIO130'], ['s3', 'ECON150']],
{'MATH101': 0, 'MATH101H': 5, 'PHYS110': 11, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 11, 'ECON150': 2}, 4,
[10, 1, 2]],
[0, 3, 4, 7])],
[('regression: two in day lower bound 1',
[[['s5', 'MATH101'], ['s5', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'MATH101'], ['s4', 'CHEM120'], ['s3', 'PHYS110'],
['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 9, 'ECON150': 1}, 4,
[5, 1, 1]],
[0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'ECON150'], ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s1', 'HIST140'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s2', 'PHYS110']],
{'MATH101': 6, 'MATH101H': 8, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 8, 'ECON150': 2}, 3,
[5, 3, 2]],
[3, 0, 3, 18]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s3', 'HIST140'], ['s4', 'MATH101'], ['s1', 'MATH101'], ['s5', 'MATH101'],
['s3', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s2', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 1, 2]],
[1, 0, 3, 13]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'MATH101'], ['s5', 'PHYS110'], ['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 6, 'ECON150': 0}, 3,
[5, 3, 4]],
[2, 1, 4, 17]),
('normal control 6',
[[['s4', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s3', 'MATH101H'],
['s2', 'PHYS110'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 10, 'ECON150': 11}, 4,
[10, 1, 1]],
[3, 1, 3, 34]),
('normal control 7',
[[['s1', 'HIST140'], ['s1', 'MATH101']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 2, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s4', 'CHEM120'], ['s4', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 5, 'ECON150': 4}, 2,
[10, 2, 2]],
[0, 0, 0, 0])]]
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: two in day lower bound 1 | [0, 1, 0, 2] | [0, 0, 0, 0] | Failed |
| regression variant: two in day lower bound 2 | [1, 1, 2, 13] | [1, 0, 2, 12] | Failed |
| partial repair guard 3 | [3, 1, 16, 49] | [3, 0, 16, 46] | Failed |
| boundary control 4 | [0, 1, 1, 3] | [0, 1, 1, 3] | Passed |
| normal control 5 | [3, 0, 3, 33] | [3, 0, 3, 33] | Passed |
| normal control 6 | [2, 2, 8, 20] | [2, 0, 8, 18] | Failed |
| normal control 7 | [0, 1, 0, 1] | [0, 0, 0, 0] | Failed |
| normal control 8 | [0, 0, 0, 0] | [0, 0, 0, 0] | Passed |
SHA-256 / e4b0769f79c3035b955556f974271cd9c489e98021e5725d73aeb1e6a1cd9bd3
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(enrol, period, spd, w):
wr, wd, spread = w
by = {}
for st, ex in enrol:
by.setdefault(st, set()).add(ex)
row = day = spr = 0
for st in by:
ps = sorted(period[e] for e in by[st])
for i in range(len(ps)):
for j in range(i + 1, len(ps)):
a, b = ps[i], ps[j]
if a // spd == b // spd:
if b - a == 1:
row += 1
elif b - a > 1:
day += 1
if 0 < b - a <= spread:
spr += 1
return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: two in day lower bound 1',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'ECON150'],
['s4', 'ECON150'], ['s4', 'HIST140'], ['s3', 'MATH101'], ['s1', 'BIO130']],
{'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 5, 'ECON150': 2}, 2,
[10, 1, 2]],
[1, 0, 2, 12]),
('partial repair guard 3',
[[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
['s3', 'MATH101'], ['s2', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 3, 4]],
[3, 0, 16, 46]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
('normal control 5',
[[['s1', 'ECON150'], ['s5', 'HIST140'], ['s3', 'MATH101H'], ['s1', 'HIST140'], ['s5', 'PHYS110'],
['s1', 'MATH101'], ['s1', 'CHEM120']],
{'MATH101': 1, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 10, 'BIO130': 1, 'HIST140': 9, 'ECON150': 2}, 4,
[10, 2, 4]],
[3, 0, 3, 33]),
('normal control 6',
[[['s5', 'HIST140'], ['s3', 'PHYS110'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s1', 'HIST140'],
['s3', 'MATH101'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s3', 'ECON150'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'BIO130'], ['s5', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 2, 'ECON150': 4}, 2,
[5, 1, 4]],
[2, 0, 8, 18]),
('normal control 7',
[[['s4', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'CHEM120']],
{'MATH101': 8, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 8, 'ECON150': 4}, 4,
[10, 1, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s2', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 1, 4]],
[0, 0, 0, 0])],
[('regression: two in day lower bound 1',
[[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
['s1', 'ECON150'], ['s2', 'BIO130']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
[10, 3, 2]],
[0, 0, 4, 4]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
['s4', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
[10, 1, 2]],
[1, 4, 6, 20]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s2', 'ECON150'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s4', 'MATH101H'],
['s1', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'HIST140'],
['s5', 'CHEM120'], ['s5', 'HIST140']],
{'MATH101': 6, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0}, 3,
[5, 3, 2]],
[0, 6, 8, 26]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
('normal control 5',
[[['s3', 'MATH101'], ['s1', 'BIO130'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s1', 'CHEM120'], ['s3', 'MATH101H'], ['s3', 'BIO130']],
{'MATH101': 6, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 8, 'BIO130': 2, 'HIST140': 7, 'ECON150': 3}, 3,
[5, 2, 2]],
[3, 1, 4, 21]),
('normal control 6',
[[['s2', 'BIO130'], ['s2', 'PHYS110'], ['s1', 'MATH101'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
['s3', 'BIO130'], ['s3', 'ECON150'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s4', 'MATH101'],
['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s1', 'HIST140'], ['s4', 'HIST140'],
['s5', 'HIST140']],
{'MATH101': 3, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 5, 'ECON150': 4}, 2,
[5, 2, 4]],
[0, 0, 13, 13]),
('normal control 7',
[[['s5', 'PHYS110'], ['s2', 'MATH101H'], ['s4', 'HIST140'], ['s1', 'BIO130'], ['s2', 'BIO130'],
['s5', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101'], ['s3', 'MATH101'],
['s5', 'BIO130'], ['s4', 'MATH101H'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 8, 'BIO130': 6, 'HIST140': 1, 'ECON150': 2}, 3,
[5, 3, 1]],
[0, 1, 0, 3]),
('normal control 8',
[[['s4', 'MATH101'], ['s1', 'ECON150'], ['s4', 'BIO130'], ['s5', 'PHYS110'], ['s1', 'MATH101H'],
['s2', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s2', 'ECON150'],
['s4', 'PHYS110'], ['s3', 'ECON150'], ['s1', 'PHYS110'], ['s3', 'PHYS110']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 4, 'ECON150': 2}, 2,
[5, 3, 2]],
[3, 0, 8, 23])],
[('regression: two in day lower bound 1',
[[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
{'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
[5, 2, 4]],
[2, 0, 2, 12]),
('regression variant: two in day lower bound 2',
[[['s3', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s3', 'HIST140'], ['s3', 'BIO130'],
['s4', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'CHEM120'], ['s2', 'ECON150'],
['s1', 'HIST140'], ['s1', 'BIO130']],
{'MATH101': 5, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 0, 'ECON150': 4}, 2,
[5, 1, 2]],
[2, 0, 4, 14]),
('partial repair guard 3',
[[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
{'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
[10, 3, 4]],
[0, 0, 3, 3]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'MATH101'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s3', 'MATH101'], ['s3', 'MATH101H'],
['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'HIST140'], ['s4', 'MATH101']],
{'MATH101': 3, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 6, 'HIST140': 5, 'ECON150': 11}, 4,
[10, 1, 2]],
[0, 3, 3, 6]),
('normal control 6',
[[['s1', 'MATH101'], ['s2', 'MATH101'], ['s5', 'BIO130'], ['s4', 'PHYS110'], ['s5', 'ECON150'],
['s3', 'ECON150'], ['s4', 'ECON150'], ['s5', 'MATH101'], ['s4', 'CHEM120'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s4', 'MATH101H'], ['s5', 'CHEM120'], ['s2', 'BIO130']],
{'MATH101': 8, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}, 3,
[10, 3, 4]],
[2, 1, 9, 32]),
('normal control 7',
[[['s1', 'HIST140'], ['s4', 'PHYS110'], ['s4', 'HIST140'], ['s2', 'CHEM120'], ['s2', 'HIST140'],
['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'MATH101'], ['s2', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 2, 'HIST140': 3, 'ECON150': 5}, 2,
[10, 1, 2]],
[1, 0, 5, 15]),
('normal control 8',
[[['s3', 'BIO130'], ['s4', 'MATH101'], ['s5', 'ECON150'], ['s1', 'MATH101H'], ['s1', 'BIO130'],
['s5', 'PHYS110'], ['s5', 'BIO130']],
{'MATH101': 1, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}, 2,
[10, 3, 2]],
[1, 0, 1, 11])],
[('regression: two in day lower bound 1',
[[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
['s5', 'ECON150']],
{'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
[10, 3, 1]],
[0, 0, 1, 1]),
('regression variant: two in day lower bound 2',
[[['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'BIO130'], ['s1', 'BIO130'], ['s3', 'MATH101H'],
['s5', 'MATH101'], ['s2', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'ECON150'],
['s1', 'HIST140'], ['s4', 'HIST140'], ['s4', 'CHEM120']],
{'MATH101': 2, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 2, 2]],
[5, 0, 6, 56]),
('partial repair guard 3',
[[['s1', 'MATH101H'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'PHYS110']],
{'MATH101': 0, 'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 2, 'ECON150': 1}, 2,
[5, 2, 1]],
[2, 0, 2, 12]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
('normal control 5',
[[['s5', 'MATH101H'], ['s2', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s1', 'HIST140'],
['s5', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 5, 'PHYS110': 0, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 6, 'ECON150': 1}, 3,
[10, 3, 4]],
[1, 0, 2, 12]),
('normal control 6',
[[['s5', 'MATH101'], ['s1', 'CHEM120'], ['s4', 'MATH101H'], ['s4', 'HIST140'], ['s3', 'MATH101'],
['s4', 'ECON150'], ['s4', 'CHEM120']],
{'MATH101': 4, 'MATH101H': 0, 'PHYS110': 10, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 9, 'ECON150': 0}, 4,
[5, 3, 1]],
[0, 2, 0, 6]),
('normal control 7',
[[['s2', 'MATH101'], ['s1', 'HIST140'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'CHEM120'],
['s1', 'BIO130'], ['s1', 'BIO130'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 8, 'HIST140': 8, 'ECON150': 5}, 3,
[10, 3, 1]],
[1, 0, 1, 11]),
('normal control 8',
[[['s5', 'MATH101'], ['s5', 'ECON150'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'PHYS110'],
['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s5', 'MATH101H'], ['s2', 'BIO130'], ['s3', 'ECON150']],
{'MATH101': 0, 'MATH101H': 5, 'PHYS110': 11, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 11, 'ECON150': 2}, 4,
[10, 1, 2]],
[0, 3, 4, 7])],
[('regression: two in day lower bound 1',
[[['s5', 'MATH101'], ['s5', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
['s3', 'MATH101'], ['s1', 'CHEM120'], ['s1', 'MATH101'], ['s4', 'CHEM120'], ['s3', 'PHYS110'],
['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'PHYS110']],
{'MATH101': 9, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 10, 'HIST140': 9, 'ECON150': 1}, 4,
[5, 1, 1]],
[0, 0, 0, 0]),
('regression variant: two in day lower bound 2',
[[['s2', 'ECON150'], ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s1', 'HIST140'], ['s2', 'MATH101H'],
['s1', 'MATH101H'], ['s2', 'PHYS110']],
{'MATH101': 6, 'MATH101H': 8, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 8, 'ECON150': 2}, 3,
[5, 3, 2]],
[3, 0, 3, 18]),
('partial repair guard 3',
[[['s2', 'BIO130'], ['s3', 'HIST140'], ['s4', 'MATH101'], ['s1', 'MATH101'], ['s5', 'MATH101'],
['s3', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s3', 'HIST140'],
['s4', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s2', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 4, 'HIST140': 4, 'ECON150': 4}, 2,
[10, 1, 2]],
[1, 0, 3, 13]),
('boundary control 4',
[[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
('normal control 5',
[[['s5', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'MATH101'], ['s5', 'PHYS110'], ['s5', 'HIST140']],
{'MATH101': 1, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 6, 'ECON150': 0}, 3,
[5, 3, 4]],
[2, 1, 4, 17]),
('normal control 6',
[[['s4', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s2', 'CHEM120'],
['s2', 'BIO130'], ['s4', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s3', 'MATH101H'],
['s2', 'PHYS110'], ['s1', 'ECON150']],
{'MATH101': 7, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 10, 'ECON150': 11}, 4,
[10, 1, 1]],
[3, 1, 3, 34]),
('normal control 7',
[[['s1', 'HIST140'], ['s1', 'MATH101']],
{'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
[10, 2, 1]],
[0, 0, 0, 0]),
('normal control 8',
[[['s4', 'CHEM120'], ['s4', 'MATH101H']],
{'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 5, 'ECON150': 4}, 2,
[10, 2, 2]],
[0, 0, 0, 0])]]
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: two in day lower bound 1 | [0, 0, 0, 0] | [0, 0, 0, 0] | Passed |
| regression variant: two in day lower bound 2 | [1, 0, 2, 12] | [1, 0, 2, 12] | Passed |
| partial repair guard 3 | [3, 0, 16, 46] | [3, 0, 16, 46] | Passed |
| boundary control 4 | [0, 1, 1, 3] | [0, 1, 1, 3] | Passed |
| normal control 5 | [3, 0, 3, 33] | [3, 0, 3, 33] | Passed |
| normal control 6 | [2, 0, 8, 18] | [2, 0, 8, 18] | Passed |
| normal control 7 | [0, 0, 0, 0] | [0, 0, 0, 0] | Passed |
| normal control 8 | [0, 0, 0, 0] | [0, 0, 0, 0] | Passed |
SHA-256 / b70e938899ec8a1b7ace6135af06902df5ac5f9cd406bb4cf11a1474439131dc
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.878152+00:00.
Case digest / 8f5bae863b336436028295efb440305372b12d831eb82dc6d4f4acde6cf11ba0