FA-94511 / Exam timetabling constraints / Open access
Duplicated sitting rows count as extra exams · case 01
A repeated registration row pushes a student over the daily limit.
ROOT CAUSE
Starts are collected per row instead of per distinct exam.
VERIFIED REPAIR
Keep one start per distinct exam.
Unsuccessful approach: Deduplicating start times merges two different exams at the same time.
Case contract
sits [student, exam, start minute] (rows may repeat an exam). A student violates the limit if more than limit distinct exams start inside some half-open 24-hour window [t, t + 1440). Return [student, maximum count] for violators, by student.
Why this case matters
Maximum-exams-per-day rules are stated as rolling windows; calendar bucketing and inclusive windows both misreport.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, limit):
by = {}
for st, ex, t in sits:
by.setdefault(st, []).append(t)
out = []
for st in sorted(by):
ts = sorted(by[st])
best = 0
j = 0
for i in range(len(ts)):
while ts[i] - ts[j] >= 1440:
j += 1
best = max(best, i - j + 1)
if best > limit:
out.append([st, best])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated exam rows 1', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1],
[['s1', 2]]),
('regression variant: repeated exam rows 2',
[[['s3', 'ECON150', 1560], ['s4', 'BIO130', 2221], ['s3', 'MATH101H', 1740], ['s3', 'CHEM120', 840],
['s2', 'CHEM120', 720], ['s2', 'MATH101H', 540], ['s4', 'HIST140', 600], ['s3', 'MATH101', 840],
['s4', 'PHYS110', 3662], ['s3', 'ECON150', 1560], ['s3', 'BIO130', 540], ['s4', 'MATH101', 2041]],
2],
[['s3', 5]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 540], ['s2', 'PHYS110', 900], ['s2', 'HIST140', 600], ['s1', 'ECON150', 1800],
['s1', 'CHEM120', 540]],
2],
[['s1', 3]]),
('normal control 4',
[[['s2', 'BIO130', 540], ['s3', 'ECON150', 540], ['s2', 'MATH101', 1380], ['s3', 'MATH101H', 2100],
['s3', 'PHYS110', 1260]],
3],
[]),
('normal control 5',
[[['s3', 'MATH101H', 2041], ['s3', 'BIO130', 600], ['s3', 'PHYS110', 3301], ['s3', 'ECON150', 4561],
['s3', 'ECON150', 4561]],
3],
[]),
('normal control 6',
[[['s4', 'MATH101', 4680], ['s4', 'CHEM120', 540], ['s5', 'BIO130', 600], ['s5', 'CHEM120', 2040],
['s4', 'BIO130', 7381], ['s4', 'HIST140', 6121], ['s4', 'MATH101H', 1800], ['s4', 'MATH101', 4680]],
2],
[]),
('normal control 7',
[[['s1', 'ECON150', 4861], ['s3', 'HIST140', 540], ['s1', 'PHYS110', 1981], ['s1', 'BIO130', 540],
['s3', 'CHEM120', 540], ['s3', 'MATH101', 1800], ['s1', 'MATH101H', 4861]],
2],
[['s3', 3]]),
('normal control 8',
[[['s3', 'CHEM120', 2039], ['s1', 'PHYS110', 540], ['s3', 'MATH101H', 600], ['s1', 'MATH101H', 2280],
['s1', 'MATH101H', 2280], ['s1', 'ECON150', 540], ['s3', 'BIO130', 3478], ['s2', 'BIO130', 540],
['s1', 'CHEM120', 1020], ['s2', 'ECON150', 720], ['s1', 'BIO130', 840]],
1],
[['s1', 4], ['s2', 2], ['s3', 2]])],
[('regression: repeated exam rows 1',
[[['s5', 'MATH101H', 600], ['s5', 'MATH101', 780], ['s5', 'MATH101', 780]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('partial repair guard 3',
[[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
['s4', 'CHEM120', 3060]],
1],
[['s2', 2], ['s4', 2], ['s5', 3]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
('normal control 5',
[[['s4', 'MATH101', 600], ['s4', 'MATH101H', 4919], ['s2', 'HIST140', 6479], ['s2', 'PHYS110', 6179],
['s2', 'MATH101', 600], ['s4', 'MATH101', 600], ['s2', 'BIO130', 1860], ['s4', 'HIST140', 3480],
['s2', 'CHEM120', 4740]],
3],
[]),
('normal control 6',
[[['s3', 'CHEM120', 600], ['s3', 'MATH101H', 7202], ['s3', 'HIST140', 5761], ['s1', 'MATH101H', 3420],
['s3', 'BIO130', 4320], ['s3', 'MATH101', 3480], ['s1', 'BIO130', 540]],
3],
[]),
('normal control 7',
[[['s5', 'ECON150', 1980], ['s5', 'CHEM120', 3000], ['s2', 'MATH101H', 2041], ['s2', 'HIST140', 2761],
['s2', 'BIO130', 600], ['s1', 'PHYS110', 540], ['s2', 'CHEM120', 3601], ['s1', 'HIST140', 1380],
['s5', 'MATH101H', 540], ['s5', 'PHYS110', 2280]],
2],
[['s5', 3]]),
('normal control 8',
[[['s1', 'CHEM120', 5400], ['s2', 'PHYS110', 840], ['s4', 'HIST140', 540], ['s4', 'BIO130', 2520],
['s2', 'CHEM120', 540], ['s1', 'MATH101H', 540], ['s1', 'ECON150', 540], ['s1', 'BIO130', 2520],
['s2', 'MATH101', 2279], ['s1', 'MATH101', 1800], ['s4', 'MATH101', 1260]],
3],
[])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 600], ['s5', 'HIST140', 600], ['s5', 'MATH101H', 1440]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s4', 'BIO130', 540], ['s3', 'PHYS110', 840], ['s1', 'PHYS110', 1440], ['s3', 'CHEM120', 540],
['s1', 'MATH101', 1440], ['s4', 'PHYS110', 1380], ['s1', 'MATH101H', 1440], ['s3', 'ECON150', 1680],
['s3', 'CHEM120', 540], ['s1', 'ECON150', 600]],
1],
[['s1', 4], ['s3', 3], ['s4', 2]]),
('boundary control 3', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
('normal control 4',
[[['s1', 'HIST140', 840], ['s4', 'MATH101H', 2280], ['s4', 'MATH101', 1440], ['s4', 'ECON150', 1440],
['s4', 'PHYS110', 600], ['s4', 'BIO130', 3721], ['s1', 'PHYS110', 540]],
2],
[['s4', 3]]),
('normal control 5',
[[['s3', 'ECON150', 1860], ['s3', 'MATH101', 600], ['s5', 'MATH101', 3600], ['s5', 'BIO130', 3600],
['s5', 'MATH101H', 720], ['s5', 'MATH101', 3600], ['s5', 'ECON150', 540], ['s5', 'PHYS110', 5041],
['s3', 'PHYS110', 600]],
3],
[]),
('normal control 6',
[[['s2', 'BIO130', 3721], ['s2', 'CHEM120', 2881], ['s2', 'PHYS110', 600], ['s2', 'HIST140', 2041]], 2],
[]),
('normal control 7',
[[['s5', 'HIST140', 780], ['s4', 'PHYS110', 600], ['s5', 'BIO130', 600], ['s4', 'MATH101', 2039],
['s5', 'PHYS110', 1500]],
3],
[]),
('normal control 8', [[['s1', 'PHYS110', 600], ['s1', 'CHEM120', 1860]], 2], [])],
[('regression: repeated exam rows 1',
[[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
[]),
('regression variant: repeated exam rows 2',
[[['s3', 'MATH101', 3480], ['s3', 'MATH101H', 3780], ['s3', 'PHYS110', 600], ['s3', 'BIO130', 5040],
['s3', 'ECON150', 6479], ['s3', 'BIO130', 5040]],
2],
[]),
('partial repair guard 3',
[[['s5', 'HIST140', 540], ['s5', 'MATH101', 4859], ['s1', 'HIST140', 540], ['s1', 'ECON150', 1260],
['s5', 'ECON150', 3420], ['s1', 'MATH101H', 1260]],
2],
[['s1', 3]]),
('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
('normal control 5', [[['s4', 'HIST140', 1260], ['s4', 'CHEM120', 540], ['s4', 'MATH101H', 2520]], 1],
[['s4', 2]]),
('normal control 6',
[[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
2],
[]),
('normal control 7',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('normal control 8',
[[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
3],
[['s4', 5]])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 2760], ['s5', 'ECON150', 600], ['s5', 'MATH101', 1860], ['s5', 'CHEM120', 1860],
['s5', 'HIST140', 2760], ['s5', 'BIO130', 2580]],
2],
[['s5', 4]]),
('regression variant: repeated exam rows 2',
[[['s1', 'BIO130', 1979], ['s1', 'CHEM120', 540], ['s1', 'ECON150', 3418], ['s1', 'BIO130', 1979],
['s1', 'MATH101H', 4138]],
2],
[]),
('partial repair guard 3',
[[['s2', 'HIST140', 2039], ['s3', 'MATH101', 2279], ['s3', 'BIO130', 540], ['s2', 'HIST140', 2039],
['s3', 'HIST140', 3718], ['s2', 'MATH101', 2339], ['s1', 'PHYS110', 540], ['s3', 'ECON150', 4018],
['s1', 'MATH101', 2640], ['s2', 'BIO130', 600], ['s2', 'CHEM120', 2339], ['s1', 'ECON150', 3480],
['s1', 'HIST140', 1800], ['s3', 'MATH101H', 840]],
1],
[['s1', 2], ['s2', 3], ['s3', 2]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
('normal control 5',
[[['s5', 'HIST140', 2821], ['s1', 'PHYS110', 600], ['s5', 'ECON150', 1981], ['s1', 'CHEM120', 2040],
['s3', 'CHEM120', 600], ['s3', 'MATH101H', 960], ['s5', 'MATH101H', 540], ['s3', 'BIO130', 780]],
3],
[]),
('normal control 6',
[[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
3],
[]),
('normal control 7',
[[['s2', 'MATH101', 4500], ['s2', 'MATH101H', 3480], ['s4', 'PHYS110', 540], ['s4', 'CHEM120', 1980],
['s3', 'MATH101', 600], ['s3', 'PHYS110', 4561], ['s2', 'BIO130', 4320], ['s2', 'CHEM120', 2039],
['s3', 'MATH101H', 2881], ['s2', 'HIST140', 600], ['s3', 'ECON150', 3721], ['s3', 'CHEM120', 1440]],
3],
[]),
('normal control 8',
[[['s2', 'MATH101H', 600], ['s2', 'HIST140', 3780], ['s1', 'CHEM120', 1980], ['s1', 'PHYS110', 2160],
['s2', 'CHEM120', 600], ['s1', 'MATH101H', 2160], ['s3', 'MATH101', 540], ['s3', 'CHEM120', 3119],
['s3', 'HIST140', 840], ['s2', 'MATH101', 900], ['s1', 'BIO130', 540], ['s3', 'MATH101H', 2279],
['s3', 'BIO130', 4379]],
3],
[])]]
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: repeated exam rows 1 | [['s1', 3]] | [['s1', 2]] | Failed |
| regression variant: repeated exam rows 2 | [['s3', 6]] | [['s3', 5]] | Failed |
| partial repair guard 3 | [['s1', 3]] | [['s1', 3]] | Passed |
| normal control 4 | [] | [] | Passed |
| normal control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [['s3', 3]] | [['s3', 3]] | Passed |
| normal control 8 | [['s1', 4], ['s2', 2], ['s3', 2]] | [['s1', 4], ['s2', 2], ['s3', 2]] | Passed |
SHA-256 / 91dc316a850b251f59102e7408f3a591c1bd3b1380875a19d688b419877ca987
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, limit):
by = {}
for st, ex, t in sits:
by.setdefault(st, []).append(t)
out = []
for st in sorted(by):
ts = sorted(set(by[st]))
best = 0
j = 0
for i in range(len(ts)):
while ts[i] - ts[j] >= 1440:
j += 1
best = max(best, i - j + 1)
if best > limit:
out.append([st, best])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated exam rows 1', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1],
[['s1', 2]]),
('regression variant: repeated exam rows 2',
[[['s3', 'ECON150', 1560], ['s4', 'BIO130', 2221], ['s3', 'MATH101H', 1740], ['s3', 'CHEM120', 840],
['s2', 'CHEM120', 720], ['s2', 'MATH101H', 540], ['s4', 'HIST140', 600], ['s3', 'MATH101', 840],
['s4', 'PHYS110', 3662], ['s3', 'ECON150', 1560], ['s3', 'BIO130', 540], ['s4', 'MATH101', 2041]],
2],
[['s3', 5]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 540], ['s2', 'PHYS110', 900], ['s2', 'HIST140', 600], ['s1', 'ECON150', 1800],
['s1', 'CHEM120', 540]],
2],
[['s1', 3]]),
('normal control 4',
[[['s2', 'BIO130', 540], ['s3', 'ECON150', 540], ['s2', 'MATH101', 1380], ['s3', 'MATH101H', 2100],
['s3', 'PHYS110', 1260]],
3],
[]),
('normal control 5',
[[['s3', 'MATH101H', 2041], ['s3', 'BIO130', 600], ['s3', 'PHYS110', 3301], ['s3', 'ECON150', 4561],
['s3', 'ECON150', 4561]],
3],
[]),
('normal control 6',
[[['s4', 'MATH101', 4680], ['s4', 'CHEM120', 540], ['s5', 'BIO130', 600], ['s5', 'CHEM120', 2040],
['s4', 'BIO130', 7381], ['s4', 'HIST140', 6121], ['s4', 'MATH101H', 1800], ['s4', 'MATH101', 4680]],
2],
[]),
('normal control 7',
[[['s1', 'ECON150', 4861], ['s3', 'HIST140', 540], ['s1', 'PHYS110', 1981], ['s1', 'BIO130', 540],
['s3', 'CHEM120', 540], ['s3', 'MATH101', 1800], ['s1', 'MATH101H', 4861]],
2],
[['s3', 3]]),
('normal control 8',
[[['s3', 'CHEM120', 2039], ['s1', 'PHYS110', 540], ['s3', 'MATH101H', 600], ['s1', 'MATH101H', 2280],
['s1', 'MATH101H', 2280], ['s1', 'ECON150', 540], ['s3', 'BIO130', 3478], ['s2', 'BIO130', 540],
['s1', 'CHEM120', 1020], ['s2', 'ECON150', 720], ['s1', 'BIO130', 840]],
1],
[['s1', 4], ['s2', 2], ['s3', 2]])],
[('regression: repeated exam rows 1',
[[['s5', 'MATH101H', 600], ['s5', 'MATH101', 780], ['s5', 'MATH101', 780]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('partial repair guard 3',
[[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
['s4', 'CHEM120', 3060]],
1],
[['s2', 2], ['s4', 2], ['s5', 3]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
('normal control 5',
[[['s4', 'MATH101', 600], ['s4', 'MATH101H', 4919], ['s2', 'HIST140', 6479], ['s2', 'PHYS110', 6179],
['s2', 'MATH101', 600], ['s4', 'MATH101', 600], ['s2', 'BIO130', 1860], ['s4', 'HIST140', 3480],
['s2', 'CHEM120', 4740]],
3],
[]),
('normal control 6',
[[['s3', 'CHEM120', 600], ['s3', 'MATH101H', 7202], ['s3', 'HIST140', 5761], ['s1', 'MATH101H', 3420],
['s3', 'BIO130', 4320], ['s3', 'MATH101', 3480], ['s1', 'BIO130', 540]],
3],
[]),
('normal control 7',
[[['s5', 'ECON150', 1980], ['s5', 'CHEM120', 3000], ['s2', 'MATH101H', 2041], ['s2', 'HIST140', 2761],
['s2', 'BIO130', 600], ['s1', 'PHYS110', 540], ['s2', 'CHEM120', 3601], ['s1', 'HIST140', 1380],
['s5', 'MATH101H', 540], ['s5', 'PHYS110', 2280]],
2],
[['s5', 3]]),
('normal control 8',
[[['s1', 'CHEM120', 5400], ['s2', 'PHYS110', 840], ['s4', 'HIST140', 540], ['s4', 'BIO130', 2520],
['s2', 'CHEM120', 540], ['s1', 'MATH101H', 540], ['s1', 'ECON150', 540], ['s1', 'BIO130', 2520],
['s2', 'MATH101', 2279], ['s1', 'MATH101', 1800], ['s4', 'MATH101', 1260]],
3],
[])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 600], ['s5', 'HIST140', 600], ['s5', 'MATH101H', 1440]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s4', 'BIO130', 540], ['s3', 'PHYS110', 840], ['s1', 'PHYS110', 1440], ['s3', 'CHEM120', 540],
['s1', 'MATH101', 1440], ['s4', 'PHYS110', 1380], ['s1', 'MATH101H', 1440], ['s3', 'ECON150', 1680],
['s3', 'CHEM120', 540], ['s1', 'ECON150', 600]],
1],
[['s1', 4], ['s3', 3], ['s4', 2]]),
('boundary control 3', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
('normal control 4',
[[['s1', 'HIST140', 840], ['s4', 'MATH101H', 2280], ['s4', 'MATH101', 1440], ['s4', 'ECON150', 1440],
['s4', 'PHYS110', 600], ['s4', 'BIO130', 3721], ['s1', 'PHYS110', 540]],
2],
[['s4', 3]]),
('normal control 5',
[[['s3', 'ECON150', 1860], ['s3', 'MATH101', 600], ['s5', 'MATH101', 3600], ['s5', 'BIO130', 3600],
['s5', 'MATH101H', 720], ['s5', 'MATH101', 3600], ['s5', 'ECON150', 540], ['s5', 'PHYS110', 5041],
['s3', 'PHYS110', 600]],
3],
[]),
('normal control 6',
[[['s2', 'BIO130', 3721], ['s2', 'CHEM120', 2881], ['s2', 'PHYS110', 600], ['s2', 'HIST140', 2041]], 2],
[]),
('normal control 7',
[[['s5', 'HIST140', 780], ['s4', 'PHYS110', 600], ['s5', 'BIO130', 600], ['s4', 'MATH101', 2039],
['s5', 'PHYS110', 1500]],
3],
[]),
('normal control 8', [[['s1', 'PHYS110', 600], ['s1', 'CHEM120', 1860]], 2], [])],
[('regression: repeated exam rows 1',
[[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
[]),
('regression variant: repeated exam rows 2',
[[['s3', 'MATH101', 3480], ['s3', 'MATH101H', 3780], ['s3', 'PHYS110', 600], ['s3', 'BIO130', 5040],
['s3', 'ECON150', 6479], ['s3', 'BIO130', 5040]],
2],
[]),
('partial repair guard 3',
[[['s5', 'HIST140', 540], ['s5', 'MATH101', 4859], ['s1', 'HIST140', 540], ['s1', 'ECON150', 1260],
['s5', 'ECON150', 3420], ['s1', 'MATH101H', 1260]],
2],
[['s1', 3]]),
('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
('normal control 5', [[['s4', 'HIST140', 1260], ['s4', 'CHEM120', 540], ['s4', 'MATH101H', 2520]], 1],
[['s4', 2]]),
('normal control 6',
[[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
2],
[]),
('normal control 7',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('normal control 8',
[[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
3],
[['s4', 5]])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 2760], ['s5', 'ECON150', 600], ['s5', 'MATH101', 1860], ['s5', 'CHEM120', 1860],
['s5', 'HIST140', 2760], ['s5', 'BIO130', 2580]],
2],
[['s5', 4]]),
('regression variant: repeated exam rows 2',
[[['s1', 'BIO130', 1979], ['s1', 'CHEM120', 540], ['s1', 'ECON150', 3418], ['s1', 'BIO130', 1979],
['s1', 'MATH101H', 4138]],
2],
[]),
('partial repair guard 3',
[[['s2', 'HIST140', 2039], ['s3', 'MATH101', 2279], ['s3', 'BIO130', 540], ['s2', 'HIST140', 2039],
['s3', 'HIST140', 3718], ['s2', 'MATH101', 2339], ['s1', 'PHYS110', 540], ['s3', 'ECON150', 4018],
['s1', 'MATH101', 2640], ['s2', 'BIO130', 600], ['s2', 'CHEM120', 2339], ['s1', 'ECON150', 3480],
['s1', 'HIST140', 1800], ['s3', 'MATH101H', 840]],
1],
[['s1', 2], ['s2', 3], ['s3', 2]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
('normal control 5',
[[['s5', 'HIST140', 2821], ['s1', 'PHYS110', 600], ['s5', 'ECON150', 1981], ['s1', 'CHEM120', 2040],
['s3', 'CHEM120', 600], ['s3', 'MATH101H', 960], ['s5', 'MATH101H', 540], ['s3', 'BIO130', 780]],
3],
[]),
('normal control 6',
[[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
3],
[]),
('normal control 7',
[[['s2', 'MATH101', 4500], ['s2', 'MATH101H', 3480], ['s4', 'PHYS110', 540], ['s4', 'CHEM120', 1980],
['s3', 'MATH101', 600], ['s3', 'PHYS110', 4561], ['s2', 'BIO130', 4320], ['s2', 'CHEM120', 2039],
['s3', 'MATH101H', 2881], ['s2', 'HIST140', 600], ['s3', 'ECON150', 3721], ['s3', 'CHEM120', 1440]],
3],
[]),
('normal control 8',
[[['s2', 'MATH101H', 600], ['s2', 'HIST140', 3780], ['s1', 'CHEM120', 1980], ['s1', 'PHYS110', 2160],
['s2', 'CHEM120', 600], ['s1', 'MATH101H', 2160], ['s3', 'MATH101', 540], ['s3', 'CHEM120', 3119],
['s3', 'HIST140', 840], ['s2', 'MATH101', 900], ['s1', 'BIO130', 540], ['s3', 'MATH101H', 2279],
['s3', 'BIO130', 4379]],
3],
[])]]
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: repeated exam rows 1 | [['s1', 2]] | [['s1', 2]] | Passed |
| regression variant: repeated exam rows 2 | [['s3', 4]] | [['s3', 5]] | Failed |
| partial repair guard 3 | [] | [['s1', 3]] | Failed |
| normal control 4 | [] | [] | Passed |
| normal control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [] | [['s3', 3]] | Failed |
| normal control 8 | [['s1', 3], ['s2', 2], ['s3', 2]] | [['s1', 4], ['s2', 2], ['s3', 2]] | Failed |
SHA-256 / 22ae4c3cb1399cde4f25e470546d0271be92fab74fbd3c95f28ae2ca5a259ad9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(sits, limit):
by = {}
for st, ex, t in sits:
by.setdefault(st, {})[ex] = t
out = []
for st in sorted(by):
ts = sorted(by[st].values())
best = 0
j = 0
for i in range(len(ts)):
while ts[i] - ts[j] >= 1440:
j += 1
best = max(best, i - j + 1)
if best > limit:
out.append([st, best])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated exam rows 1', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1],
[['s1', 2]]),
('regression variant: repeated exam rows 2',
[[['s3', 'ECON150', 1560], ['s4', 'BIO130', 2221], ['s3', 'MATH101H', 1740], ['s3', 'CHEM120', 840],
['s2', 'CHEM120', 720], ['s2', 'MATH101H', 540], ['s4', 'HIST140', 600], ['s3', 'MATH101', 840],
['s4', 'PHYS110', 3662], ['s3', 'ECON150', 1560], ['s3', 'BIO130', 540], ['s4', 'MATH101', 2041]],
2],
[['s3', 5]]),
('partial repair guard 3',
[[['s1', 'PHYS110', 540], ['s2', 'PHYS110', 900], ['s2', 'HIST140', 600], ['s1', 'ECON150', 1800],
['s1', 'CHEM120', 540]],
2],
[['s1', 3]]),
('normal control 4',
[[['s2', 'BIO130', 540], ['s3', 'ECON150', 540], ['s2', 'MATH101', 1380], ['s3', 'MATH101H', 2100],
['s3', 'PHYS110', 1260]],
3],
[]),
('normal control 5',
[[['s3', 'MATH101H', 2041], ['s3', 'BIO130', 600], ['s3', 'PHYS110', 3301], ['s3', 'ECON150', 4561],
['s3', 'ECON150', 4561]],
3],
[]),
('normal control 6',
[[['s4', 'MATH101', 4680], ['s4', 'CHEM120', 540], ['s5', 'BIO130', 600], ['s5', 'CHEM120', 2040],
['s4', 'BIO130', 7381], ['s4', 'HIST140', 6121], ['s4', 'MATH101H', 1800], ['s4', 'MATH101', 4680]],
2],
[]),
('normal control 7',
[[['s1', 'ECON150', 4861], ['s3', 'HIST140', 540], ['s1', 'PHYS110', 1981], ['s1', 'BIO130', 540],
['s3', 'CHEM120', 540], ['s3', 'MATH101', 1800], ['s1', 'MATH101H', 4861]],
2],
[['s3', 3]]),
('normal control 8',
[[['s3', 'CHEM120', 2039], ['s1', 'PHYS110', 540], ['s3', 'MATH101H', 600], ['s1', 'MATH101H', 2280],
['s1', 'MATH101H', 2280], ['s1', 'ECON150', 540], ['s3', 'BIO130', 3478], ['s2', 'BIO130', 540],
['s1', 'CHEM120', 1020], ['s2', 'ECON150', 720], ['s1', 'BIO130', 840]],
1],
[['s1', 4], ['s2', 2], ['s3', 2]])],
[('regression: repeated exam rows 1',
[[['s5', 'MATH101H', 600], ['s5', 'MATH101', 780], ['s5', 'MATH101', 780]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('partial repair guard 3',
[[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
['s4', 'CHEM120', 3060]],
1],
[['s2', 2], ['s4', 2], ['s5', 3]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
('normal control 5',
[[['s4', 'MATH101', 600], ['s4', 'MATH101H', 4919], ['s2', 'HIST140', 6479], ['s2', 'PHYS110', 6179],
['s2', 'MATH101', 600], ['s4', 'MATH101', 600], ['s2', 'BIO130', 1860], ['s4', 'HIST140', 3480],
['s2', 'CHEM120', 4740]],
3],
[]),
('normal control 6',
[[['s3', 'CHEM120', 600], ['s3', 'MATH101H', 7202], ['s3', 'HIST140', 5761], ['s1', 'MATH101H', 3420],
['s3', 'BIO130', 4320], ['s3', 'MATH101', 3480], ['s1', 'BIO130', 540]],
3],
[]),
('normal control 7',
[[['s5', 'ECON150', 1980], ['s5', 'CHEM120', 3000], ['s2', 'MATH101H', 2041], ['s2', 'HIST140', 2761],
['s2', 'BIO130', 600], ['s1', 'PHYS110', 540], ['s2', 'CHEM120', 3601], ['s1', 'HIST140', 1380],
['s5', 'MATH101H', 540], ['s5', 'PHYS110', 2280]],
2],
[['s5', 3]]),
('normal control 8',
[[['s1', 'CHEM120', 5400], ['s2', 'PHYS110', 840], ['s4', 'HIST140', 540], ['s4', 'BIO130', 2520],
['s2', 'CHEM120', 540], ['s1', 'MATH101H', 540], ['s1', 'ECON150', 540], ['s1', 'BIO130', 2520],
['s2', 'MATH101', 2279], ['s1', 'MATH101', 1800], ['s4', 'MATH101', 1260]],
3],
[])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 600], ['s5', 'HIST140', 600], ['s5', 'MATH101H', 1440]], 1], [['s5', 2]]),
('regression variant: repeated exam rows 2',
[[['s4', 'BIO130', 540], ['s3', 'PHYS110', 840], ['s1', 'PHYS110', 1440], ['s3', 'CHEM120', 540],
['s1', 'MATH101', 1440], ['s4', 'PHYS110', 1380], ['s1', 'MATH101H', 1440], ['s3', 'ECON150', 1680],
['s3', 'CHEM120', 540], ['s1', 'ECON150', 600]],
1],
[['s1', 4], ['s3', 3], ['s4', 2]]),
('boundary control 3', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
('normal control 4',
[[['s1', 'HIST140', 840], ['s4', 'MATH101H', 2280], ['s4', 'MATH101', 1440], ['s4', 'ECON150', 1440],
['s4', 'PHYS110', 600], ['s4', 'BIO130', 3721], ['s1', 'PHYS110', 540]],
2],
[['s4', 3]]),
('normal control 5',
[[['s3', 'ECON150', 1860], ['s3', 'MATH101', 600], ['s5', 'MATH101', 3600], ['s5', 'BIO130', 3600],
['s5', 'MATH101H', 720], ['s5', 'MATH101', 3600], ['s5', 'ECON150', 540], ['s5', 'PHYS110', 5041],
['s3', 'PHYS110', 600]],
3],
[]),
('normal control 6',
[[['s2', 'BIO130', 3721], ['s2', 'CHEM120', 2881], ['s2', 'PHYS110', 600], ['s2', 'HIST140', 2041]], 2],
[]),
('normal control 7',
[[['s5', 'HIST140', 780], ['s4', 'PHYS110', 600], ['s5', 'BIO130', 600], ['s4', 'MATH101', 2039],
['s5', 'PHYS110', 1500]],
3],
[]),
('normal control 8', [[['s1', 'PHYS110', 600], ['s1', 'CHEM120', 1860]], 2], [])],
[('regression: repeated exam rows 1',
[[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
[]),
('regression variant: repeated exam rows 2',
[[['s3', 'MATH101', 3480], ['s3', 'MATH101H', 3780], ['s3', 'PHYS110', 600], ['s3', 'BIO130', 5040],
['s3', 'ECON150', 6479], ['s3', 'BIO130', 5040]],
2],
[]),
('partial repair guard 3',
[[['s5', 'HIST140', 540], ['s5', 'MATH101', 4859], ['s1', 'HIST140', 540], ['s1', 'ECON150', 1260],
['s5', 'ECON150', 3420], ['s1', 'MATH101H', 1260]],
2],
[['s1', 3]]),
('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
('normal control 5', [[['s4', 'HIST140', 1260], ['s4', 'CHEM120', 540], ['s4', 'MATH101H', 2520]], 1],
[['s4', 2]]),
('normal control 6',
[[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
2],
[]),
('normal control 7',
[[['s1', 'PHYS110', 600], ['s4', 'MATH101', 600], ['s4', 'ECON150', 3480], ['s4', 'HIST140', 2040],
['s2', 'MATH101', 1860], ['s1', 'ECON150', 900], ['s2', 'HIST140', 4740], ['s2', 'ECON150', 600],
['s2', 'MATH101', 1860], ['s4', 'MATH101H', 2220]],
1],
[['s1', 2], ['s2', 2], ['s4', 2]]),
('normal control 8',
[[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
3],
[['s4', 5]])],
[('regression: repeated exam rows 1',
[[['s5', 'HIST140', 2760], ['s5', 'ECON150', 600], ['s5', 'MATH101', 1860], ['s5', 'CHEM120', 1860],
['s5', 'HIST140', 2760], ['s5', 'BIO130', 2580]],
2],
[['s5', 4]]),
('regression variant: repeated exam rows 2',
[[['s1', 'BIO130', 1979], ['s1', 'CHEM120', 540], ['s1', 'ECON150', 3418], ['s1', 'BIO130', 1979],
['s1', 'MATH101H', 4138]],
2],
[]),
('partial repair guard 3',
[[['s2', 'HIST140', 2039], ['s3', 'MATH101', 2279], ['s3', 'BIO130', 540], ['s2', 'HIST140', 2039],
['s3', 'HIST140', 3718], ['s2', 'MATH101', 2339], ['s1', 'PHYS110', 540], ['s3', 'ECON150', 4018],
['s1', 'MATH101', 2640], ['s2', 'BIO130', 600], ['s2', 'CHEM120', 2339], ['s1', 'ECON150', 3480],
['s1', 'HIST140', 1800], ['s3', 'MATH101H', 840]],
1],
[['s1', 2], ['s2', 3], ['s3', 2]]),
('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
('normal control 5',
[[['s5', 'HIST140', 2821], ['s1', 'PHYS110', 600], ['s5', 'ECON150', 1981], ['s1', 'CHEM120', 2040],
['s3', 'CHEM120', 600], ['s3', 'MATH101H', 960], ['s5', 'MATH101H', 540], ['s3', 'BIO130', 780]],
3],
[]),
('normal control 6',
[[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
3],
[]),
('normal control 7',
[[['s2', 'MATH101', 4500], ['s2', 'MATH101H', 3480], ['s4', 'PHYS110', 540], ['s4', 'CHEM120', 1980],
['s3', 'MATH101', 600], ['s3', 'PHYS110', 4561], ['s2', 'BIO130', 4320], ['s2', 'CHEM120', 2039],
['s3', 'MATH101H', 2881], ['s2', 'HIST140', 600], ['s3', 'ECON150', 3721], ['s3', 'CHEM120', 1440]],
3],
[]),
('normal control 8',
[[['s2', 'MATH101H', 600], ['s2', 'HIST140', 3780], ['s1', 'CHEM120', 1980], ['s1', 'PHYS110', 2160],
['s2', 'CHEM120', 600], ['s1', 'MATH101H', 2160], ['s3', 'MATH101', 540], ['s3', 'CHEM120', 3119],
['s3', 'HIST140', 840], ['s2', 'MATH101', 900], ['s1', 'BIO130', 540], ['s3', 'MATH101H', 2279],
['s3', 'BIO130', 4379]],
3],
[])]]
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: repeated exam rows 1 | [['s1', 2]] | [['s1', 2]] | Passed |
| regression variant: repeated exam rows 2 | [['s3', 5]] | [['s3', 5]] | Passed |
| partial repair guard 3 | [['s1', 3]] | [['s1', 3]] | Passed |
| normal control 4 | [] | [] | Passed |
| normal control 5 | [] | [] | Passed |
| normal control 6 | [] | [] | Passed |
| normal control 7 | [['s3', 3]] | [['s3', 3]] | Passed |
| normal control 8 | [['s1', 4], ['s2', 2], ['s3', 2]] | [['s1', 4], ['s2', 2], ['s3', 2]] | Passed |
SHA-256 / 20dbe5739d64f43484877ecfea82dbaacd052f842c879f5f34b1ebd2fec25b9c
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:05.181007+00:00.
Case digest / 3d844c1dfa14d0939d9c48149f7b0227f509ed3710a68d9cbae0710f9c29d583