FA-94591 / Exam timetabling constraints / Open access
Daily maximum finding repeated for every extra duty · case 01
An invigilator two duties over the limit gets two daily_max findings.
ROOT CAUSE
The finding fires on every duty beyond the limit.
VERIFIED REPAIR
Report daily_max once, when the count first exceeds the limit.
Unsuccessful approach: Firing at the limit reports compliant days.
Case contract
duties [invigilator, exam, period]; teach invigilator -> busy periods; subj invigilator -> subject code; exam subject is the part of the exam id before "-". Findings: busy (duty in a busy period), own_subject, double (same invigilator already on duty that period), daily_max (reported once, on the first duty that exceeds maxday on a day = period // spd). Return sorted [invigilator, exam, finding] rows.
Why this case matters
Invigilation rosters must respect teaching commitments, conflict-of-interest rules and daily limits.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(duties, teach, subj, maxday, spd):
out = []
seen = {}
per_day = {}
for inv, ex, p in duties:
if p in teach.get(inv, []):
out.append([inv, ex, 'busy'])
if ex.split('-')[0] == subj.get(inv):
out.append([inv, ex, 'own_subject'])
if (inv, p) in seen:
out.append([inv, ex, 'double'])
seen[(inv, p)] = ex
d = (inv, p // spd)
per_day[d] = per_day.get(d, 0) + 1
if per_day[d] > maxday:
out.append([inv, ex, 'daily_max'])
return sorted(out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily max once 1',
[[['ann', 'CHEM-110', 2], ['ann', 'MATH-101', 0], ['cy', 'MATH-101', 1], ['ann', 'MATH-101', 1],
['cy', 'MATH-101', 2], ['ann', 'BIO-201', 2], ['ann', 'BIOL-300', 3]],
{'ann': [2], 'bob': [1, 4], 'cy': [0, 1]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'BIO'}, 2, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']]),
('regression variant: daily max once 2',
[[['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4], ['bob', 'BIOL-300', 4], ['bob', 'BIO-201', 5]],
{'bob': [], 'cy': [4, 5]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIOL'}, 1, 3],
[['bob', 'BIOL-300', 'daily_max']]),
('partial repair guard 3',
[[['bob', 'MATH-101', 4], ['bob', 'MATH-101', 4], ['cy', 'BIO-201', 2]], {'ann': [0, 5], 'bob': []},
{'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 2],
[['bob', 'MATH-101', 'double']]),
('boundary control 4', [[['ann', 'MATH-101', 2], ['ann', 'CHEM-110', 3]], {}, {}, 1, 3], []),
('normal control 5',
[[['ann', 'MATH-101', 2], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 5], ['bob', 'BIOL-300', 0]],
{'ann': [], 'bob': [3, 4]}, {'ann': 'MATH', 'bob': 'MATH', 'cy': 'BIO'}, 1, 2],
[['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'],
['bob', 'MATH-101', 'own_subject']]),
('normal control 6',
[[['ann', 'BIO-201', 0], ['cy', 'BIOL-300', 0], ['cy', 'BIOL-300', 3], ['bob', 'BIO-201', 2],
['cy', 'BIO-201', 1], ['bob', 'BIO-201', 4], ['ann', 'CHEM-110', 0]],
{'ann': [2], 'cy': []}, {'ann': 'CHEM', 'bob': 'CHEM', 'cy': 'MATH'}, 1, 2],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'daily_max']]),
('normal control 7',
[[['ann', 'BIO-201', 4], ['cy', 'MATH-101', 4], ['ann', 'CHEM-110', 3], ['bob', 'MATH-101', 4],
['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5]],
{'ann': [0], 'bob': [3]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2],
['ann', 'BIO-201', 4], ['ann', 'BIO-201', 4]],
{'ann': [0, 2], 'bob': [0, 5], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 2],
[['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 1], ['cy', 'BIOL-300', 2], ['cy', 'BIO-201', 1], ['ann', 'BIO-201', 5],
['ann', 'CHEM-110', 5], ['ann', 'BIOL-300', 4], ['cy', 'BIOL-300', 2]],
{'ann': [1], 'bob': [1, 5], 'cy': []}, {'ann': 'CHEM', 'bob': 'MATH', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'double'], ['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 5], ['ann', 'BIOL-300', 0], ['cy', 'BIO-201', 5],
['ann', 'BIO-201', 3], ['cy', 'CHEM-110', 5]],
{'ann': [2, 3], 'bob': [0, 4], 'cy': [3]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'own_subject'], ['cy', 'BIO-201', 'daily_max'],
['cy', 'BIO-201', 'double'], ['cy', 'CHEM-110', 'double'], ['cy', 'MATH-101', 'own_subject']]),
('partial repair guard 3',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 2], ['bob', 'BIO-201', 3], ['ann', 'CHEM-110', 3],
['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5]],
{'ann': [3], 'bob': [1], 'cy': [0, 4]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'busy'], ['bob', 'BIO-201', 'daily_max'], ['cy', 'CHEM-110', 'daily_max'],
['cy', 'MATH-101', 'busy'], ['cy', 'MATH-101', 'own_subject']]),
('boundary control 4', [[['ann', 'BIOL-300', 0]], {}, {'ann': 'BIO'}, 2, 3], []),
('normal control 5',
[[['cy', 'BIO-201', 2], ['ann', 'MATH-101', 1], ['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4]],
{'ann': [2, 4], 'bob': [0]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIO'}, 1, 2],
[['ann', 'BIO-201', 'busy'], ['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIO-201', 'own_subject']]),
('normal control 6',
[[['cy', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['ann', 'CHEM-110', 4], ['cy', 'CHEM-110', 2],
['ann', 'CHEM-110', 0]],
{'ann': [2], 'bob': [2, 4], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'MATH'}, 2, 3],
[['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double']]),
('normal control 7',
[[['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {'ann': [2], 'bob': [3, 5], 'cy': [3, 4]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIOL'}, 2, 2],
[['ann', 'BIO-201', 'busy']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['cy', 'MATH-101', 3], ['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['ann', 'MATH-101', 2], ['bob', 'BIO-201', 2]],
{'ann': [0], 'bob': [0, 4]}, {'ann': 'BIOL', 'bob': 'MATH', 'cy': 'MATH'}, 2, 2],
[['ann', 'MATH-101', 'busy'], ['bob', 'BIO-201', 'busy'], ['cy', 'MATH-101', 'own_subject']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 2], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['cy', 'CHEM-110', 2],
['bob', 'BIOL-300', 1]],
{'ann': [1], 'bob': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIOL'}, 1, 2],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'double'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double'], ['cy', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'own_subject'], ['cy', 'CHEM-110', 'double']]),
('regression variant: daily max once 2',
[[['bob', 'MATH-101', 4], ['ann', 'BIO-201', 5], ['ann', 'MATH-101', 5], ['ann', 'CHEM-110', 1],
['bob', 'CHEM-110', 0], ['ann', 'BIO-201', 5], ['cy', 'CHEM-110', 1]],
{'ann': [2, 4], 'bob': [3, 4], 'cy': [0, 3]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'double'], ['ann', 'MATH-101', 'daily_max'], ['ann', 'MATH-101', 'double'],
['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('partial repair guard 3',
[[['ann', 'BIO-201', 2], ['bob', 'BIOL-300', 3], ['bob', 'BIOL-300', 4], ['ann', 'BIOL-300', 4],
['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 1], ['cy', 'BIO-201', 2]],
{'ann': [0], 'bob': [4, 5]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'daily_max'], ['ann', 'BIOL-300', 'own_subject'], ['bob', 'BIOL-300', 'busy'],
['bob', 'BIOL-300', 'daily_max'], ['bob', 'CHEM-110', 'own_subject']]),
('boundary control 4', [[['ann', 'MATH-101', 0], ['bob', 'CHEM-110', 0]], {}, {}, 2, 3], []),
('normal control 5',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 6',
[[['ann', 'CHEM-110', 0], ['bob', 'MATH-101', 5], ['cy', 'BIO-201', 2], ['cy', 'BIO-201', 0],
['ann', 'BIO-201', 2]],
{'bob': []}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 2, 3],
[['ann', 'BIO-201', 'own_subject']]),
('normal control 7',
[[['ann', 'BIO-201', 2], ['cy', 'BIO-201', 3]], {'ann': [4], 'bob': [3, 4]},
{'ann': 'CHEM', 'bob': 'MATH', 'cy': 'CHEM'}, 2, 2],
[]),
('normal control 8',
[[['ann', 'BIO-201', 4], ['ann', 'MATH-101', 1], ['ann', 'CHEM-110', 2], ['ann', 'CHEM-110', 5],
['bob', 'MATH-101', 1], ['cy', 'BIO-201', 3]],
{'ann': [1, 3], 'bob': [2, 4], 'cy': [1]}, {'ann': 'BIO', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'own_subject'], ['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'daily_max'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'MATH-101', 4], ['bob', 'CHEM-110', 3], ['cy', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['bob', 'CHEM-110', 0], ['ann', 'BIOL-300', 4]],
{'bob': [2, 5], 'cy': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['cy', 'BIO-201', 'daily_max'], ['cy', 'BIO-201', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'BIO-201', 1], ['cy', 'BIO-201', 0], ['cy', 'CHEM-110', 0], ['cy', 'MATH-101', 1],
['cy', 'CHEM-110', 5], ['ann', 'CHEM-110', 0], ['cy', 'BIOL-300', 2]],
{'ann': [2, 5], 'bob': [1], 'cy': [2]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 3],
[['cy', 'BIOL-300', 'busy'], ['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double'],
['cy', 'CHEM-110', 'own_subject'], ['cy', 'CHEM-110', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('partial repair guard 3',
[[['ann', 'BIOL-300', 2], ['ann', 'BIO-201', 1], ['cy', 'BIOL-300', 5], ['cy', 'MATH-101', 0]],
{'ann': [3], 'cy': [3]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 2],
[['cy', 'MATH-101', 'own_subject']]),
('boundary control 4',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {}, {}, 2, 3],
[['ann', 'BIO-201', 'daily_max']]),
('normal control 5',
[[['cy', 'MATH-101', 1], ['bob', 'MATH-101', 3], ['ann', 'BIO-201', 5], ['ann', 'BIO-201', 0],
['bob', 'MATH-101', 4], ['bob', 'BIOL-300', 5]],
{'ann': [], 'bob': [0, 4], 'cy': [1, 2]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'BIOL'}, 2, 3],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'own_subject'], ['bob', 'MATH-101', 'busy'],
['cy', 'MATH-101', 'busy']]),
('normal control 6',
[[['bob', 'MATH-101', 4], ['cy', 'MATH-101', 1], ['ann', 'BIOL-300', 2], ['cy', 'MATH-101', 5]],
{'bob': [2, 4], 'cy': [4]}, {'ann': 'BIO', 'bob': 'MATH', 'cy': 'MATH'}, 2, 3],
[['bob', 'MATH-101', 'busy'], ['bob', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject'],
['cy', 'MATH-101', 'own_subject']]),
('normal control 7',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 8',
[[['bob', 'BIOL-300', 5], ['cy', 'MATH-101', 4], ['cy', 'BIO-201', 1], ['bob', 'MATH-101', 3],
['bob', 'CHEM-110', 2]],
{'ann': [1], 'bob': [1, 2], 'cy': [4]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 2, 3],
[['bob', 'CHEM-110', 'busy'], ['cy', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['bob', 'BIO-201', 3], ['ann', 'BIOL-300', 4], ['ann', 'BIOL-300', 4], ['ann', 'BIO-201', 2],
['ann', 'MATH-101', 1], ['ann', 'BIOL-300', 0]],
{'ann': [0], 'bob': [5], 'cy': []}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 1, 3],
[['ann', 'BIOL-300', 'busy'], ['ann', 'BIOL-300', 'daily_max'], ['ann', 'BIOL-300', 'double'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'MATH-101', 'daily_max'],
['bob', 'BIO-201', 'own_subject']]),
('partial repair guard 2',
[[['cy', 'MATH-101', 3], ['bob', 'MATH-101', 0], ['ann', 'MATH-101', 5], ['cy', 'MATH-101', 3]],
{'ann': [0], 'cy': [0]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 3],
[['ann', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('boundary control 3', [[['ann', 'BIO-201', 0]], {}, {'ann': 'BIOL'}, 2, 3], []),
('normal control 4',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2]], {'ann': [5], 'bob': [0, 4]},
{'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'MATH-101', 'daily_max']]),
('normal control 5',
[[['bob', 'CHEM-110', 1], ['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5], ['cy', 'BIO-201', 4],
['bob', 'BIOL-300', 1], ['bob', 'BIO-201', 2]],
{'ann': [], 'bob': [1], 'cy': [1, 3]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'BIOL'}, 2, 2],
[['bob', 'BIOL-300', 'busy'], ['bob', 'BIOL-300', 'double'], ['bob', 'CHEM-110', 'busy'],
['bob', 'CHEM-110', 'own_subject']]),
('normal control 6',
[[['cy', 'MATH-101', 0], ['bob', 'BIOL-300', 1]], {'ann': [1, 5], 'bob': [], 'cy': [0, 2]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIO'}, 1, 3],
[['cy', 'MATH-101', 'busy']]),
('normal control 7',
[[['cy', 'CHEM-110', 3], ['bob', 'MATH-101', 4], ['cy', 'MATH-101', 0], ['ann', 'MATH-101', 0]],
{'ann': [3], 'bob': [4], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2], ['bob', 'BIO-201', 0], ['cy', 'BIO-201', 0],
['bob', 'BIO-201', 0]],
{'ann': [], 'bob': [1, 5], 'cy': [1]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 2],
[['bob', 'BIO-201', 'double'], ['cy', 'BIO-201', 'own_subject']])]]
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: daily max once 1 | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'daily_max'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']] | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']] | Failed |
| regression variant: daily max once 2 | [['bob', 'BIO-201', 'daily_max'], ['bob', 'BIOL-300', 'daily_max']] | [['bob', 'BIOL-300', 'daily_max']] | Failed |
| partial repair guard 3 | [['bob', 'MATH-101', 'double']] | [['bob', 'MATH-101', 'double']] | Passed |
| boundary control 4 | [] | [] | Passed |
| normal control 5 | [['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | [['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | Passed |
| normal control 6 | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['cy', 'BIO-201', 'daily_max']] | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['cy', 'BIO-201', 'daily_max']] | Passed |
| normal control 7 | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | [['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | Failed |
| normal control 8 | [['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'MATH-101', 'busy']] | [['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'MATH-101', 'busy']] | Passed |
SHA-256 / ae562645aaecd62c95dde485b67926644ceec6671ef4ce5ec5b9a5ef8a778f43
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(duties, teach, subj, maxday, spd):
out = []
seen = {}
per_day = {}
for inv, ex, p in duties:
if p in teach.get(inv, []):
out.append([inv, ex, 'busy'])
if ex.split('-')[0] == subj.get(inv):
out.append([inv, ex, 'own_subject'])
if (inv, p) in seen:
out.append([inv, ex, 'double'])
seen[(inv, p)] = ex
d = (inv, p // spd)
per_day[d] = per_day.get(d, 0) + 1
if per_day[d] == maxday:
out.append([inv, ex, 'daily_max'])
return sorted(out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily max once 1',
[[['ann', 'CHEM-110', 2], ['ann', 'MATH-101', 0], ['cy', 'MATH-101', 1], ['ann', 'MATH-101', 1],
['cy', 'MATH-101', 2], ['ann', 'BIO-201', 2], ['ann', 'BIOL-300', 3]],
{'ann': [2], 'bob': [1, 4], 'cy': [0, 1]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'BIO'}, 2, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']]),
('regression variant: daily max once 2',
[[['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4], ['bob', 'BIOL-300', 4], ['bob', 'BIO-201', 5]],
{'bob': [], 'cy': [4, 5]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIOL'}, 1, 3],
[['bob', 'BIOL-300', 'daily_max']]),
('partial repair guard 3',
[[['bob', 'MATH-101', 4], ['bob', 'MATH-101', 4], ['cy', 'BIO-201', 2]], {'ann': [0, 5], 'bob': []},
{'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 2],
[['bob', 'MATH-101', 'double']]),
('boundary control 4', [[['ann', 'MATH-101', 2], ['ann', 'CHEM-110', 3]], {}, {}, 1, 3], []),
('normal control 5',
[[['ann', 'MATH-101', 2], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 5], ['bob', 'BIOL-300', 0]],
{'ann': [], 'bob': [3, 4]}, {'ann': 'MATH', 'bob': 'MATH', 'cy': 'BIO'}, 1, 2],
[['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'],
['bob', 'MATH-101', 'own_subject']]),
('normal control 6',
[[['ann', 'BIO-201', 0], ['cy', 'BIOL-300', 0], ['cy', 'BIOL-300', 3], ['bob', 'BIO-201', 2],
['cy', 'BIO-201', 1], ['bob', 'BIO-201', 4], ['ann', 'CHEM-110', 0]],
{'ann': [2], 'cy': []}, {'ann': 'CHEM', 'bob': 'CHEM', 'cy': 'MATH'}, 1, 2],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'daily_max']]),
('normal control 7',
[[['ann', 'BIO-201', 4], ['cy', 'MATH-101', 4], ['ann', 'CHEM-110', 3], ['bob', 'MATH-101', 4],
['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5]],
{'ann': [0], 'bob': [3]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2],
['ann', 'BIO-201', 4], ['ann', 'BIO-201', 4]],
{'ann': [0, 2], 'bob': [0, 5], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 2],
[['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 1], ['cy', 'BIOL-300', 2], ['cy', 'BIO-201', 1], ['ann', 'BIO-201', 5],
['ann', 'CHEM-110', 5], ['ann', 'BIOL-300', 4], ['cy', 'BIOL-300', 2]],
{'ann': [1], 'bob': [1, 5], 'cy': []}, {'ann': 'CHEM', 'bob': 'MATH', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'double'], ['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 5], ['ann', 'BIOL-300', 0], ['cy', 'BIO-201', 5],
['ann', 'BIO-201', 3], ['cy', 'CHEM-110', 5]],
{'ann': [2, 3], 'bob': [0, 4], 'cy': [3]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'own_subject'], ['cy', 'BIO-201', 'daily_max'],
['cy', 'BIO-201', 'double'], ['cy', 'CHEM-110', 'double'], ['cy', 'MATH-101', 'own_subject']]),
('partial repair guard 3',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 2], ['bob', 'BIO-201', 3], ['ann', 'CHEM-110', 3],
['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5]],
{'ann': [3], 'bob': [1], 'cy': [0, 4]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'busy'], ['bob', 'BIO-201', 'daily_max'], ['cy', 'CHEM-110', 'daily_max'],
['cy', 'MATH-101', 'busy'], ['cy', 'MATH-101', 'own_subject']]),
('boundary control 4', [[['ann', 'BIOL-300', 0]], {}, {'ann': 'BIO'}, 2, 3], []),
('normal control 5',
[[['cy', 'BIO-201', 2], ['ann', 'MATH-101', 1], ['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4]],
{'ann': [2, 4], 'bob': [0]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIO'}, 1, 2],
[['ann', 'BIO-201', 'busy'], ['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIO-201', 'own_subject']]),
('normal control 6',
[[['cy', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['ann', 'CHEM-110', 4], ['cy', 'CHEM-110', 2],
['ann', 'CHEM-110', 0]],
{'ann': [2], 'bob': [2, 4], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'MATH'}, 2, 3],
[['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double']]),
('normal control 7',
[[['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {'ann': [2], 'bob': [3, 5], 'cy': [3, 4]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIOL'}, 2, 2],
[['ann', 'BIO-201', 'busy']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['cy', 'MATH-101', 3], ['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['ann', 'MATH-101', 2], ['bob', 'BIO-201', 2]],
{'ann': [0], 'bob': [0, 4]}, {'ann': 'BIOL', 'bob': 'MATH', 'cy': 'MATH'}, 2, 2],
[['ann', 'MATH-101', 'busy'], ['bob', 'BIO-201', 'busy'], ['cy', 'MATH-101', 'own_subject']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 2], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['cy', 'CHEM-110', 2],
['bob', 'BIOL-300', 1]],
{'ann': [1], 'bob': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIOL'}, 1, 2],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'double'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double'], ['cy', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'own_subject'], ['cy', 'CHEM-110', 'double']]),
('regression variant: daily max once 2',
[[['bob', 'MATH-101', 4], ['ann', 'BIO-201', 5], ['ann', 'MATH-101', 5], ['ann', 'CHEM-110', 1],
['bob', 'CHEM-110', 0], ['ann', 'BIO-201', 5], ['cy', 'CHEM-110', 1]],
{'ann': [2, 4], 'bob': [3, 4], 'cy': [0, 3]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'double'], ['ann', 'MATH-101', 'daily_max'], ['ann', 'MATH-101', 'double'],
['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('partial repair guard 3',
[[['ann', 'BIO-201', 2], ['bob', 'BIOL-300', 3], ['bob', 'BIOL-300', 4], ['ann', 'BIOL-300', 4],
['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 1], ['cy', 'BIO-201', 2]],
{'ann': [0], 'bob': [4, 5]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'daily_max'], ['ann', 'BIOL-300', 'own_subject'], ['bob', 'BIOL-300', 'busy'],
['bob', 'BIOL-300', 'daily_max'], ['bob', 'CHEM-110', 'own_subject']]),
('boundary control 4', [[['ann', 'MATH-101', 0], ['bob', 'CHEM-110', 0]], {}, {}, 2, 3], []),
('normal control 5',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 6',
[[['ann', 'CHEM-110', 0], ['bob', 'MATH-101', 5], ['cy', 'BIO-201', 2], ['cy', 'BIO-201', 0],
['ann', 'BIO-201', 2]],
{'bob': []}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 2, 3],
[['ann', 'BIO-201', 'own_subject']]),
('normal control 7',
[[['ann', 'BIO-201', 2], ['cy', 'BIO-201', 3]], {'ann': [4], 'bob': [3, 4]},
{'ann': 'CHEM', 'bob': 'MATH', 'cy': 'CHEM'}, 2, 2],
[]),
('normal control 8',
[[['ann', 'BIO-201', 4], ['ann', 'MATH-101', 1], ['ann', 'CHEM-110', 2], ['ann', 'CHEM-110', 5],
['bob', 'MATH-101', 1], ['cy', 'BIO-201', 3]],
{'ann': [1, 3], 'bob': [2, 4], 'cy': [1]}, {'ann': 'BIO', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'own_subject'], ['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'daily_max'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'MATH-101', 4], ['bob', 'CHEM-110', 3], ['cy', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['bob', 'CHEM-110', 0], ['ann', 'BIOL-300', 4]],
{'bob': [2, 5], 'cy': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['cy', 'BIO-201', 'daily_max'], ['cy', 'BIO-201', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'BIO-201', 1], ['cy', 'BIO-201', 0], ['cy', 'CHEM-110', 0], ['cy', 'MATH-101', 1],
['cy', 'CHEM-110', 5], ['ann', 'CHEM-110', 0], ['cy', 'BIOL-300', 2]],
{'ann': [2, 5], 'bob': [1], 'cy': [2]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 3],
[['cy', 'BIOL-300', 'busy'], ['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double'],
['cy', 'CHEM-110', 'own_subject'], ['cy', 'CHEM-110', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('partial repair guard 3',
[[['ann', 'BIOL-300', 2], ['ann', 'BIO-201', 1], ['cy', 'BIOL-300', 5], ['cy', 'MATH-101', 0]],
{'ann': [3], 'cy': [3]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 2],
[['cy', 'MATH-101', 'own_subject']]),
('boundary control 4',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {}, {}, 2, 3],
[['ann', 'BIO-201', 'daily_max']]),
('normal control 5',
[[['cy', 'MATH-101', 1], ['bob', 'MATH-101', 3], ['ann', 'BIO-201', 5], ['ann', 'BIO-201', 0],
['bob', 'MATH-101', 4], ['bob', 'BIOL-300', 5]],
{'ann': [], 'bob': [0, 4], 'cy': [1, 2]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'BIOL'}, 2, 3],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'own_subject'], ['bob', 'MATH-101', 'busy'],
['cy', 'MATH-101', 'busy']]),
('normal control 6',
[[['bob', 'MATH-101', 4], ['cy', 'MATH-101', 1], ['ann', 'BIOL-300', 2], ['cy', 'MATH-101', 5]],
{'bob': [2, 4], 'cy': [4]}, {'ann': 'BIO', 'bob': 'MATH', 'cy': 'MATH'}, 2, 3],
[['bob', 'MATH-101', 'busy'], ['bob', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject'],
['cy', 'MATH-101', 'own_subject']]),
('normal control 7',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 8',
[[['bob', 'BIOL-300', 5], ['cy', 'MATH-101', 4], ['cy', 'BIO-201', 1], ['bob', 'MATH-101', 3],
['bob', 'CHEM-110', 2]],
{'ann': [1], 'bob': [1, 2], 'cy': [4]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 2, 3],
[['bob', 'CHEM-110', 'busy'], ['cy', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['bob', 'BIO-201', 3], ['ann', 'BIOL-300', 4], ['ann', 'BIOL-300', 4], ['ann', 'BIO-201', 2],
['ann', 'MATH-101', 1], ['ann', 'BIOL-300', 0]],
{'ann': [0], 'bob': [5], 'cy': []}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 1, 3],
[['ann', 'BIOL-300', 'busy'], ['ann', 'BIOL-300', 'daily_max'], ['ann', 'BIOL-300', 'double'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'MATH-101', 'daily_max'],
['bob', 'BIO-201', 'own_subject']]),
('partial repair guard 2',
[[['cy', 'MATH-101', 3], ['bob', 'MATH-101', 0], ['ann', 'MATH-101', 5], ['cy', 'MATH-101', 3]],
{'ann': [0], 'cy': [0]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 3],
[['ann', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('boundary control 3', [[['ann', 'BIO-201', 0]], {}, {'ann': 'BIOL'}, 2, 3], []),
('normal control 4',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2]], {'ann': [5], 'bob': [0, 4]},
{'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'MATH-101', 'daily_max']]),
('normal control 5',
[[['bob', 'CHEM-110', 1], ['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5], ['cy', 'BIO-201', 4],
['bob', 'BIOL-300', 1], ['bob', 'BIO-201', 2]],
{'ann': [], 'bob': [1], 'cy': [1, 3]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'BIOL'}, 2, 2],
[['bob', 'BIOL-300', 'busy'], ['bob', 'BIOL-300', 'double'], ['bob', 'CHEM-110', 'busy'],
['bob', 'CHEM-110', 'own_subject']]),
('normal control 6',
[[['cy', 'MATH-101', 0], ['bob', 'BIOL-300', 1]], {'ann': [1, 5], 'bob': [], 'cy': [0, 2]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIO'}, 1, 3],
[['cy', 'MATH-101', 'busy']]),
('normal control 7',
[[['cy', 'CHEM-110', 3], ['bob', 'MATH-101', 4], ['cy', 'MATH-101', 0], ['ann', 'MATH-101', 0]],
{'ann': [3], 'bob': [4], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2], ['bob', 'BIO-201', 0], ['cy', 'BIO-201', 0],
['bob', 'BIO-201', 0]],
{'ann': [], 'bob': [1, 5], 'cy': [1]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 2],
[['bob', 'BIO-201', 'double'], ['cy', 'BIO-201', 'own_subject']])]]
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: daily max once 1 | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy'], ['cy', 'MATH-101', 'daily_max']] | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']] | Failed |
| regression variant: daily max once 2 | [['ann', 'BIO-201', 'daily_max'], ['bob', 'BIOL-300', 'daily_max']] | [['bob', 'BIOL-300', 'daily_max']] | Failed |
| partial repair guard 3 | [['bob', 'MATH-101', 'daily_max'], ['bob', 'MATH-101', 'double']] | [['bob', 'MATH-101', 'double']] | Failed |
| boundary control 4 | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'MATH-101', 'daily_max']] | [] | Failed |
| normal control 5 | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'MATH-101', 'daily_max'], ['ann', 'MATH-101', 'own_subject'], ['bob', 'MATH-101', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | [['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | Failed |
| normal control 6 | [['ann', 'BIO-201', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['bob', 'BIO-201', 'daily_max'], ['bob', 'BIO-201', 'daily_max'], ['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'daily_max']] | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['cy', 'BIO-201', 'daily_max']] | Failed |
| normal control 7 | [['ann', 'BIO-201', 'daily_max'], ['bob', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | [['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | Failed |
| normal control 8 | [['ann', 'BIO-201', 'daily_max'], ['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'CHEM-110', 'daily_max'], ['ann', 'MATH-101', 'busy']] | [['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'MATH-101', 'busy']] | Failed |
SHA-256 / e0a1cb99c8b7f28e27ab4b4cf26552baa2d3870b815105e77e70bc8759a05eac
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(duties, teach, subj, maxday, spd):
out = []
seen = {}
per_day = {}
for inv, ex, p in duties:
if p in teach.get(inv, []):
out.append([inv, ex, 'busy'])
if ex.split('-')[0] == subj.get(inv):
out.append([inv, ex, 'own_subject'])
if (inv, p) in seen:
out.append([inv, ex, 'double'])
seen[(inv, p)] = ex
d = (inv, p // spd)
per_day[d] = per_day.get(d, 0) + 1
if per_day[d] == maxday + 1:
out.append([inv, ex, 'daily_max'])
return sorted(out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily max once 1',
[[['ann', 'CHEM-110', 2], ['ann', 'MATH-101', 0], ['cy', 'MATH-101', 1], ['ann', 'MATH-101', 1],
['cy', 'MATH-101', 2], ['ann', 'BIO-201', 2], ['ann', 'BIOL-300', 3]],
{'ann': [2], 'bob': [1, 4], 'cy': [0, 1]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'BIO'}, 2, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']]),
('regression variant: daily max once 2',
[[['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4], ['bob', 'BIOL-300', 4], ['bob', 'BIO-201', 5]],
{'bob': [], 'cy': [4, 5]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIOL'}, 1, 3],
[['bob', 'BIOL-300', 'daily_max']]),
('partial repair guard 3',
[[['bob', 'MATH-101', 4], ['bob', 'MATH-101', 4], ['cy', 'BIO-201', 2]], {'ann': [0, 5], 'bob': []},
{'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 2],
[['bob', 'MATH-101', 'double']]),
('boundary control 4', [[['ann', 'MATH-101', 2], ['ann', 'CHEM-110', 3]], {}, {}, 1, 3], []),
('normal control 5',
[[['ann', 'MATH-101', 2], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 5], ['bob', 'BIOL-300', 0]],
{'ann': [], 'bob': [3, 4]}, {'ann': 'MATH', 'bob': 'MATH', 'cy': 'BIO'}, 1, 2],
[['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'],
['bob', 'MATH-101', 'own_subject']]),
('normal control 6',
[[['ann', 'BIO-201', 0], ['cy', 'BIOL-300', 0], ['cy', 'BIOL-300', 3], ['bob', 'BIO-201', 2],
['cy', 'BIO-201', 1], ['bob', 'BIO-201', 4], ['ann', 'CHEM-110', 0]],
{'ann': [2], 'cy': []}, {'ann': 'CHEM', 'bob': 'CHEM', 'cy': 'MATH'}, 1, 2],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'daily_max']]),
('normal control 7',
[[['ann', 'BIO-201', 4], ['cy', 'MATH-101', 4], ['ann', 'CHEM-110', 3], ['bob', 'MATH-101', 4],
['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5]],
{'ann': [0], 'bob': [3]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2],
['ann', 'BIO-201', 4], ['ann', 'BIO-201', 4]],
{'ann': [0, 2], 'bob': [0, 5], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 2],
[['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 1], ['cy', 'BIOL-300', 2], ['cy', 'BIO-201', 1], ['ann', 'BIO-201', 5],
['ann', 'CHEM-110', 5], ['ann', 'BIOL-300', 4], ['cy', 'BIOL-300', 2]],
{'ann': [1], 'bob': [1, 5], 'cy': []}, {'ann': 'CHEM', 'bob': 'MATH', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'],
['cy', 'BIO-201', 'double'], ['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 5], ['ann', 'BIOL-300', 0], ['cy', 'BIO-201', 5],
['ann', 'BIO-201', 3], ['cy', 'CHEM-110', 5]],
{'ann': [2, 3], 'bob': [0, 4], 'cy': [3]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'own_subject'], ['cy', 'BIO-201', 'daily_max'],
['cy', 'BIO-201', 'double'], ['cy', 'CHEM-110', 'double'], ['cy', 'MATH-101', 'own_subject']]),
('partial repair guard 3',
[[['cy', 'MATH-101', 0], ['cy', 'CHEM-110', 2], ['bob', 'BIO-201', 3], ['ann', 'CHEM-110', 3],
['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5]],
{'ann': [3], 'bob': [1], 'cy': [0, 4]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 3],
[['ann', 'CHEM-110', 'busy'], ['bob', 'BIO-201', 'daily_max'], ['cy', 'CHEM-110', 'daily_max'],
['cy', 'MATH-101', 'busy'], ['cy', 'MATH-101', 'own_subject']]),
('boundary control 4', [[['ann', 'BIOL-300', 0]], {}, {'ann': 'BIO'}, 2, 3], []),
('normal control 5',
[[['cy', 'BIO-201', 2], ['ann', 'MATH-101', 1], ['bob', 'BIOL-300', 3], ['ann', 'BIO-201', 4]],
{'ann': [2, 4], 'bob': [0]}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIO'}, 1, 2],
[['ann', 'BIO-201', 'busy'], ['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIO-201', 'own_subject']]),
('normal control 6',
[[['cy', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['ann', 'CHEM-110', 4], ['cy', 'CHEM-110', 2],
['ann', 'CHEM-110', 0]],
{'ann': [2], 'bob': [2, 4], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'MATH'}, 2, 3],
[['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double']]),
('normal control 7',
[[['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {'ann': [2], 'bob': [3, 5], 'cy': [3, 4]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIOL'}, 2, 2],
[['ann', 'BIO-201', 'busy']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['cy', 'MATH-101', 3], ['bob', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['ann', 'MATH-101', 2], ['bob', 'BIO-201', 2]],
{'ann': [0], 'bob': [0, 4]}, {'ann': 'BIOL', 'bob': 'MATH', 'cy': 'MATH'}, 2, 2],
[['ann', 'MATH-101', 'busy'], ['bob', 'BIO-201', 'busy'], ['cy', 'MATH-101', 'own_subject']])],
[('regression: daily max once 1',
[[['cy', 'BIOL-300', 2], ['bob', 'BIO-201', 1], ['cy', 'BIOL-300', 2], ['cy', 'CHEM-110', 2],
['bob', 'BIOL-300', 1]],
{'ann': [1], 'bob': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'BIOL'}, 1, 2],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'double'], ['bob', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'daily_max'], ['cy', 'BIOL-300', 'double'], ['cy', 'BIOL-300', 'own_subject'],
['cy', 'BIOL-300', 'own_subject'], ['cy', 'CHEM-110', 'double']]),
('regression variant: daily max once 2',
[[['bob', 'MATH-101', 4], ['ann', 'BIO-201', 5], ['ann', 'MATH-101', 5], ['ann', 'CHEM-110', 1],
['bob', 'CHEM-110', 0], ['ann', 'BIO-201', 5], ['cy', 'CHEM-110', 1]],
{'ann': [2, 4], 'bob': [3, 4], 'cy': [0, 3]}, {'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'double'], ['ann', 'MATH-101', 'daily_max'], ['ann', 'MATH-101', 'double'],
['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('partial repair guard 3',
[[['ann', 'BIO-201', 2], ['bob', 'BIOL-300', 3], ['bob', 'BIOL-300', 4], ['ann', 'BIOL-300', 4],
['bob', 'CHEM-110', 1], ['ann', 'BIO-201', 1], ['cy', 'BIO-201', 2]],
{'ann': [0], 'bob': [4, 5]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'CHEM'}, 1, 3],
[['ann', 'BIO-201', 'daily_max'], ['ann', 'BIOL-300', 'own_subject'], ['bob', 'BIOL-300', 'busy'],
['bob', 'BIOL-300', 'daily_max'], ['bob', 'CHEM-110', 'own_subject']]),
('boundary control 4', [[['ann', 'MATH-101', 0], ['bob', 'CHEM-110', 0]], {}, {}, 2, 3], []),
('normal control 5',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 6',
[[['ann', 'CHEM-110', 0], ['bob', 'MATH-101', 5], ['cy', 'BIO-201', 2], ['cy', 'BIO-201', 0],
['ann', 'BIO-201', 2]],
{'bob': []}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'MATH'}, 2, 3],
[['ann', 'BIO-201', 'own_subject']]),
('normal control 7',
[[['ann', 'BIO-201', 2], ['cy', 'BIO-201', 3]], {'ann': [4], 'bob': [3, 4]},
{'ann': 'CHEM', 'bob': 'MATH', 'cy': 'CHEM'}, 2, 2],
[]),
('normal control 8',
[[['ann', 'BIO-201', 4], ['ann', 'MATH-101', 1], ['ann', 'CHEM-110', 2], ['ann', 'CHEM-110', 5],
['bob', 'MATH-101', 1], ['cy', 'BIO-201', 3]],
{'ann': [1, 3], 'bob': [2, 4], 'cy': [1]}, {'ann': 'BIO', 'bob': 'BIO', 'cy': 'MATH'}, 1, 3],
[['ann', 'BIO-201', 'own_subject'], ['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'daily_max'],
['ann', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['cy', 'MATH-101', 4], ['bob', 'CHEM-110', 3], ['cy', 'BIO-201', 4], ['cy', 'BIO-201', 5],
['bob', 'CHEM-110', 0], ['ann', 'BIOL-300', 4]],
{'bob': [2, 5], 'cy': []}, {'ann': 'MATH', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['cy', 'BIO-201', 'daily_max'], ['cy', 'BIO-201', 'double']]),
('regression variant: daily max once 2',
[[['cy', 'BIO-201', 1], ['cy', 'BIO-201', 0], ['cy', 'CHEM-110', 0], ['cy', 'MATH-101', 1],
['cy', 'CHEM-110', 5], ['ann', 'CHEM-110', 0], ['cy', 'BIOL-300', 2]],
{'ann': [2, 5], 'bob': [1], 'cy': [2]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'CHEM'}, 2, 3],
[['cy', 'BIOL-300', 'busy'], ['cy', 'CHEM-110', 'daily_max'], ['cy', 'CHEM-110', 'double'],
['cy', 'CHEM-110', 'own_subject'], ['cy', 'CHEM-110', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('partial repair guard 3',
[[['ann', 'BIOL-300', 2], ['ann', 'BIO-201', 1], ['cy', 'BIOL-300', 5], ['cy', 'MATH-101', 0]],
{'ann': [3], 'cy': [3]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'MATH'}, 1, 2],
[['cy', 'MATH-101', 'own_subject']]),
('boundary control 4',
[[['ann', 'MATH-101', 0], ['ann', 'CHEM-110', 1], ['ann', 'BIO-201', 2]], {}, {}, 2, 3],
[['ann', 'BIO-201', 'daily_max']]),
('normal control 5',
[[['cy', 'MATH-101', 1], ['bob', 'MATH-101', 3], ['ann', 'BIO-201', 5], ['ann', 'BIO-201', 0],
['bob', 'MATH-101', 4], ['bob', 'BIOL-300', 5]],
{'ann': [], 'bob': [0, 4], 'cy': [1, 2]}, {'ann': 'CHEM', 'bob': 'BIOL', 'cy': 'BIOL'}, 2, 3],
[['bob', 'BIOL-300', 'daily_max'], ['bob', 'BIOL-300', 'own_subject'], ['bob', 'MATH-101', 'busy'],
['cy', 'MATH-101', 'busy']]),
('normal control 6',
[[['bob', 'MATH-101', 4], ['cy', 'MATH-101', 1], ['ann', 'BIOL-300', 2], ['cy', 'MATH-101', 5]],
{'bob': [2, 4], 'cy': [4]}, {'ann': 'BIO', 'bob': 'MATH', 'cy': 'MATH'}, 2, 3],
[['bob', 'MATH-101', 'busy'], ['bob', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject'],
['cy', 'MATH-101', 'own_subject']]),
('normal control 7',
[[['bob', 'BIO-201', 5], ['cy', 'BIOL-300', 4], ['bob', 'MATH-101', 1], ['ann', 'CHEM-110', 1],
['ann', 'CHEM-110', 1], ['bob', 'BIO-201', 4]],
{'bob': [3], 'cy': []}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 3],
[['ann', 'CHEM-110', 'double']]),
('normal control 8',
[[['bob', 'BIOL-300', 5], ['cy', 'MATH-101', 4], ['cy', 'BIO-201', 1], ['bob', 'MATH-101', 3],
['bob', 'CHEM-110', 2]],
{'ann': [1], 'bob': [1, 2], 'cy': [4]}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 2, 3],
[['bob', 'CHEM-110', 'busy'], ['cy', 'MATH-101', 'busy']])],
[('regression: daily max once 1',
[[['bob', 'BIO-201', 3], ['ann', 'BIOL-300', 4], ['ann', 'BIOL-300', 4], ['ann', 'BIO-201', 2],
['ann', 'MATH-101', 1], ['ann', 'BIOL-300', 0]],
{'ann': [0], 'bob': [5], 'cy': []}, {'ann': 'BIOL', 'bob': 'BIO', 'cy': 'BIOL'}, 1, 3],
[['ann', 'BIOL-300', 'busy'], ['ann', 'BIOL-300', 'daily_max'], ['ann', 'BIOL-300', 'double'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'BIOL-300', 'own_subject'],
['ann', 'BIOL-300', 'own_subject'], ['ann', 'MATH-101', 'daily_max'],
['bob', 'BIO-201', 'own_subject']]),
('partial repair guard 2',
[[['cy', 'MATH-101', 3], ['bob', 'MATH-101', 0], ['ann', 'MATH-101', 5], ['cy', 'MATH-101', 3]],
{'ann': [0], 'cy': [0]}, {'ann': 'MATH', 'bob': 'CHEM', 'cy': 'CHEM'}, 2, 3],
[['ann', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'double']]),
('boundary control 3', [[['ann', 'BIO-201', 0]], {}, {'ann': 'BIOL'}, 2, 3], []),
('normal control 4',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2]], {'ann': [5], 'bob': [0, 4]},
{'ann': 'BIOL', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['ann', 'MATH-101', 'daily_max']]),
('normal control 5',
[[['bob', 'CHEM-110', 1], ['cy', 'MATH-101', 2], ['ann', 'CHEM-110', 5], ['cy', 'BIO-201', 4],
['bob', 'BIOL-300', 1], ['bob', 'BIO-201', 2]],
{'ann': [], 'bob': [1], 'cy': [1, 3]}, {'ann': 'BIOL', 'bob': 'CHEM', 'cy': 'BIOL'}, 2, 2],
[['bob', 'BIOL-300', 'busy'], ['bob', 'BIOL-300', 'double'], ['bob', 'CHEM-110', 'busy'],
['bob', 'CHEM-110', 'own_subject']]),
('normal control 6',
[[['cy', 'MATH-101', 0], ['bob', 'BIOL-300', 1]], {'ann': [1, 5], 'bob': [], 'cy': [0, 2]},
{'ann': 'BIOL', 'bob': 'MATH', 'cy': 'BIO'}, 1, 3],
[['cy', 'MATH-101', 'busy']]),
('normal control 7',
[[['cy', 'CHEM-110', 3], ['bob', 'MATH-101', 4], ['cy', 'MATH-101', 0], ['ann', 'MATH-101', 0]],
{'ann': [3], 'bob': [4], 'cy': [1, 4]}, {'ann': 'BIO', 'bob': 'BIOL', 'cy': 'CHEM'}, 1, 3],
[['bob', 'MATH-101', 'busy'], ['cy', 'CHEM-110', 'own_subject']]),
('normal control 8',
[[['ann', 'MATH-101', 0], ['ann', 'MATH-101', 2], ['bob', 'BIO-201', 0], ['cy', 'BIO-201', 0],
['bob', 'BIO-201', 0]],
{'ann': [], 'bob': [1, 5], 'cy': [1]}, {'ann': 'BIO', 'bob': 'CHEM', 'cy': 'BIO'}, 2, 2],
[['bob', 'BIO-201', 'double'], ['cy', 'BIO-201', 'own_subject']])]]
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: daily max once 1 | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']] | [['ann', 'BIO-201', 'busy'], ['ann', 'BIO-201', 'double'], ['ann', 'BIOL-300', 'own_subject'], ['ann', 'CHEM-110', 'busy'], ['ann', 'MATH-101', 'daily_max'], ['cy', 'MATH-101', 'busy']] | Passed |
| regression variant: daily max once 2 | [['bob', 'BIOL-300', 'daily_max']] | [['bob', 'BIOL-300', 'daily_max']] | Passed |
| partial repair guard 3 | [['bob', 'MATH-101', 'double']] | [['bob', 'MATH-101', 'double']] | Passed |
| boundary control 4 | [] | [] | Passed |
| normal control 5 | [['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | [['ann', 'MATH-101', 'own_subject'], ['bob', 'BIOL-300', 'daily_max'], ['bob', 'MATH-101', 'own_subject']] | Passed |
| normal control 6 | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['cy', 'BIO-201', 'daily_max']] | [['ann', 'CHEM-110', 'daily_max'], ['ann', 'CHEM-110', 'double'], ['ann', 'CHEM-110', 'own_subject'], ['cy', 'BIO-201', 'daily_max']] | Passed |
| normal control 7 | [['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | [['ann', 'CHEM-110', 'daily_max'], ['cy', 'MATH-101', 'own_subject'], ['cy', 'MATH-101', 'own_subject']] | Passed |
| normal control 8 | [['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'MATH-101', 'busy']] | [['ann', 'BIO-201', 'double'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'BIO-201', 'own_subject'], ['ann', 'MATH-101', 'busy']] | Passed |
SHA-256 / 392edd7f09601bd1f4e4cbd27ca8a000196aa693869ecee2f811f23124b847dc
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.832518+00:00.
Case digest / ae73706b7b96e098ba6274bf5fda39b7756ad5e2e934fe329a390eb3ccbdc5d0