FA-94831 / Exam timetabling constraints / Open access
Two-hour exams given relief cover · case 01
Exactly two-hour exams draw relief invigilators unnecessarily.
ROOT CAUSE
The duration test is inclusive at 120 minutes.
VERIFIED REPAIR
Only exams longer than 120 minutes qualify.
Unsuccessful approach: Lowering the threshold to 90 minutes adds more unneeded cover.
Case contract
rooms [room, venue, period, exam duration, candidates]. Rooms with candidates running exams longer than 120 minutes need relief cover; each venue-period needs ceil(qualifying rooms / per_relief) relief invigilators. Return [venue, period, qualifying rooms, relief invigilators] sorted by venue, period.
Why this case matters
Long exams need relief invigilators so room staff can take breaks; cover is pooled per venue and period.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rooms, per_relief):
groups = {}
for room, venue, p, dur, n in rooms:
if dur >= 120 and n > 0:
groups[(venue, p)] = groups.get((venue, p), 0) + 1
return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
['R6', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
[['annex', 0, 1, 1], ['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 60, 30]],
3],
[['annex', 0, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
2],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
[['annex', 1, 1, 1]]),
('normal control 8',
[[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
3],
[['main', 0, 2, 1], ['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
['R3', 'annex', 1, 180, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 150, 30]],
2],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
('normal control 6',
[[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
2],
[['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 8',
[[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
3],
[['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
2],
[['main', 0, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
3],
[['main', 0, 1, 1], ['main', 1, 2, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
2],
[['main', 1, 2, 1]]),
('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
('normal control 5',
[[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
3],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
['R6', 'annex', 1, 180, 0]],
2],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
[('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
['R3', 'main', 0, 150, 0]],
3],
[['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
3],
[]),
('boundary control 4',
[[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
['R4', 'main', 0, 180, 5]],
3],
[['main', 0, 4, 2]]),
('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
[]),
('normal control 8',
[[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
2],
[['annex', 0, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
['R3', 'main', 0, 150, 0]],
2],
[]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
3],
[['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
['R6', 'annex', 1, 121, 0]],
3],
[['annex', 1, 1, 1]]),
('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
('normal control 5',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('normal control 6',
[[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
['R3', 'main', 0, 121, 30]],
3],
[['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
['R6', 'annex', 0, 90, 30]],
3],
[]),
('normal control 8',
[[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
['R3', 'main', 0, 150, 12]],
3],
[['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
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: long exam threshold 1 | [['main', 0, 1, 1]] | [] | Failed |
| regression variant: long exam threshold 2 | [['annex', 0, 1, 1], ['annex', 1, 3, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]] | Failed |
| partial repair guard 3 | [['main', 0, 1, 1]] | [] | Failed |
| boundary control 4 | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | Passed |
| normal control 5 | [['annex', 0, 1, 1], ['annex', 1, 1, 1]] | [['annex', 0, 1, 1]] | Failed |
| normal control 6 | [['annex', 1, 2, 1], ['main', 0, 2, 1]] | [['annex', 1, 1, 1], ['main', 0, 1, 1]] | Failed |
| normal control 7 | [['annex', 1, 1, 1], ['main', 1, 1, 1]] | [['annex', 1, 1, 1]] | Failed |
| normal control 8 | [['main', 0, 2, 1], ['main', 1, 1, 1]] | [['main', 0, 2, 1], ['main', 1, 1, 1]] | Passed |
SHA-256 / 686af29b4ca17fdd11194609c7897358e694b1a54d38bb4740f1b27d3f08890a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rooms, per_relief):
groups = {}
for room, venue, p, dur, n in rooms:
if dur > 90 and n > 0:
groups[(venue, p)] = groups.get((venue, p), 0) + 1
return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
['R6', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
[['annex', 0, 1, 1], ['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 60, 30]],
3],
[['annex', 0, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
2],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
[['annex', 1, 1, 1]]),
('normal control 8',
[[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
3],
[['main', 0, 2, 1], ['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
['R3', 'annex', 1, 180, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 150, 30]],
2],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
('normal control 6',
[[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
2],
[['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 8',
[[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
3],
[['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
2],
[['main', 0, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
3],
[['main', 0, 1, 1], ['main', 1, 2, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
2],
[['main', 1, 2, 1]]),
('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
('normal control 5',
[[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
3],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
['R6', 'annex', 1, 180, 0]],
2],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
[('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
['R3', 'main', 0, 150, 0]],
3],
[['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
3],
[]),
('boundary control 4',
[[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
['R4', 'main', 0, 180, 5]],
3],
[['main', 0, 4, 2]]),
('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
[]),
('normal control 8',
[[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
2],
[['annex', 0, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
['R3', 'main', 0, 150, 0]],
2],
[]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
3],
[['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
['R6', 'annex', 1, 121, 0]],
3],
[['annex', 1, 1, 1]]),
('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
('normal control 5',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('normal control 6',
[[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
['R3', 'main', 0, 121, 30]],
3],
[['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
['R6', 'annex', 0, 90, 30]],
3],
[]),
('normal control 8',
[[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
['R3', 'main', 0, 150, 12]],
3],
[['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
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: long exam threshold 1 | [['main', 0, 1, 1]] | [] | Failed |
| regression variant: long exam threshold 2 | [['annex', 0, 1, 1], ['annex', 1, 3, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]] | Failed |
| partial repair guard 3 | [['main', 0, 1, 1]] | [] | Failed |
| boundary control 4 | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | Passed |
| normal control 5 | [['annex', 0, 1, 1], ['annex', 1, 1, 1]] | [['annex', 0, 1, 1]] | Failed |
| normal control 6 | [['annex', 1, 2, 1], ['main', 0, 2, 1]] | [['annex', 1, 1, 1], ['main', 0, 1, 1]] | Failed |
| normal control 7 | [['annex', 1, 1, 1], ['main', 1, 1, 1]] | [['annex', 1, 1, 1]] | Failed |
| normal control 8 | [['main', 0, 2, 1], ['main', 1, 1, 1]] | [['main', 0, 2, 1], ['main', 1, 1, 1]] | Passed |
SHA-256 / 666cc1f579d0afc4a7aa9f551b680ea13ad2657a0c13a296f7fb8d80257c8799
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rooms, per_relief):
groups = {}
for room, venue, p, dur, n in rooms:
if dur > 120 and n > 0:
groups[(venue, p)] = groups.get((venue, p), 0) + 1
return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
['R6', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
[['annex', 0, 1, 1], ['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 60, 30]],
3],
[['annex', 0, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
2],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
[['annex', 1, 1, 1]]),
('normal control 8',
[[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
3],
[['main', 0, 2, 1], ['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
['R3', 'annex', 1, 180, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
['R3', 'annex', 1, 150, 30]],
2],
[['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
('normal control 5',
[[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
('normal control 6',
[[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
2],
[['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 7',
[[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
3],
[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 8',
[[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
3],
[['main', 1, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
2],
[['main', 0, 1, 1]]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
3],
[['main', 0, 1, 1], ['main', 1, 2, 1]]),
('partial repair guard 3',
[[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
2],
[['main', 1, 2, 1]]),
('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
('normal control 5',
[[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
3],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 6',
[[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
[['annex', 1, 1, 1], ['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
['R6', 'annex', 1, 180, 0]],
2],
[['annex', 0, 1, 1], ['main', 1, 1, 1]]),
('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
[('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
['R3', 'main', 0, 150, 0]],
3],
[['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
3],
[]),
('boundary control 4',
[[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
['R4', 'main', 0, 180, 5]],
3],
[['main', 0, 4, 2]]),
('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
[]),
('normal control 8',
[[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
2],
[['annex', 0, 1, 1]])],
[('regression: long exam threshold 1',
[[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
['R3', 'main', 0, 150, 0]],
2],
[]),
('regression variant: long exam threshold 2',
[[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
3],
[['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
('partial repair guard 3',
[[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
['R6', 'annex', 1, 121, 0]],
3],
[['annex', 1, 1, 1]]),
('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
('normal control 5',
[[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
3],
[]),
('normal control 6',
[[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
['R3', 'main', 0, 121, 30]],
3],
[['main', 0, 1, 1]]),
('normal control 7',
[[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
['R6', 'annex', 0, 90, 30]],
3],
[]),
('normal control 8',
[[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
['R3', 'main', 0, 150, 12]],
3],
[['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
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: long exam threshold 1 | [] | [] | Passed |
| regression variant: long exam threshold 2 | [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]] | Passed |
| partial repair guard 3 | [] | [] | Passed |
| boundary control 4 | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | [['annex', 0, 1, 1], ['main', 0, 1, 1]] | Passed |
| normal control 5 | [['annex', 0, 1, 1]] | [['annex', 0, 1, 1]] | Passed |
| normal control 6 | [['annex', 1, 1, 1], ['main', 0, 1, 1]] | [['annex', 1, 1, 1], ['main', 0, 1, 1]] | Passed |
| normal control 7 | [['annex', 1, 1, 1]] | [['annex', 1, 1, 1]] | Passed |
| normal control 8 | [['main', 0, 2, 1], ['main', 1, 1, 1]] | [['main', 0, 2, 1], ['main', 1, 1, 1]] | Passed |
SHA-256 / c8bccf7b6ecbabead72516c1a6b15228be19495c1d8210742e5ab61732cddb7b
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:08.022214+00:00.
Case digest / 621482ec9b99ed6cef60516da582153b48928b4badfe42518fa6138044ad9cc0