FAILURE MAP
← Case archive

FA-94666 / Exam timetabling constraints / Open access

Shorter clashing exam sat first · case 01

The long exam starts late in the day and overruns.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The sitting order sorts by ascending duration.

VERIFIED REPAIR

Sit the longer exam first, ties by id.

Unsuccessful approach: Ordering only by id ignores duration.

Case contract

Each clash [student, exam a, exam b] shares a start time. The longer exam is sat first (ties by id), then a 15-minute supervised break, then the second exam. Return [student, first, second, second start, whether the second exam ends by day_end (inclusive)].

Why this case matters

Clash resolution by supervised sequential sitting is a standard timetabling fallback.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(clashes, dur, start, day_end):
    out = []
    for st, a, b in clashes:
        first, second = sorted([a, b], key=lambda e: (dur[e], e))
        s2 = start + dur[first] + 15
        out.append([st, first, second, s2, s2 + dur[second] <= day_end])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 120, 'B': 180}, 600, 1080],
   [['s1', 'B', 'A', 795, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 180,
     'HIST140': 120,
     'ECON150': 120},
    780, 1080],
   [['s5', 'MATH101H', 'HIST140', 975, False]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 180},
    840, 1080],
   [['s2', 'MATH101', 'BIO130', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('normal control 5',
   [[['s4', 'PHYS110', 'MATH101'], ['s4', 'CHEM120', 'MATH101H']],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    540, 1080],
   [['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]),
  ('normal control 6',
   [[['s5', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90},
    840, 1020],
   [['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]),
  ('normal control 7',
   [[['s4', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 60,
     'HIST140': 180,
     'ECON150': 180},
    780, 1020],
   [['s4', 'HIST140', 'PHYS110', 975, False]]),
  ('normal control 8',
   [[['s2', 'MATH101H', 'PHYS110']],
    {'MATH101': 90, 'MATH101H': 60, 'PHYS110': 90, 'CHEM120': 90, 'BIO130': 60, 'HIST140': 60, 'ECON150': 60},
    600, 1080],
   [['s2', 'PHYS110', 'MATH101H', 705, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'CHEM120'], ['s3', 'CHEM120', 'ECON150'], ['s5', 'MATH101H', 'BIO130']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    540, 1080],
   [['s5', 'CHEM120', 'MATH101', 675, True], ['s3', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'BIO130', 'MATH101H', 645, True]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150', 'HIST140'], ['s4', 'PHYS110', 'BIO130'], ['s2', 'MATH101H', 'HIST140']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    780, 1020],
   [['s3', 'HIST140', 'ECON150', 915, True], ['s4', 'PHYS110', 'BIO130', 975, False],
    ['s2', 'HIST140', 'MATH101H', 915, False]]),
  ('boundary control 4', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 5',
   [[['s2', 'PHYS110', 'HIST140'], ['s5', 'BIO130', 'ECON150'], ['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 90},
    600, 1020],
   [['s2', 'PHYS110', 'HIST140', 795, True], ['s5', 'ECON150', 'BIO130', 705, True],
    ['s5', 'HIST140', 'MATH101', 675, True]]),
  ('normal control 6',
   [[['s4', 'BIO130', 'ECON150'], ['s1', 'BIO130', 'HIST140'], ['s5', 'PHYS110', 'MATH101']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60},
    780, 1020],
   [['s4', 'BIO130', 'ECON150', 885, True], ['s1', 'BIO130', 'HIST140', 885, True],
    ['s5', 'PHYS110', 'MATH101', 915, True]]),
  ('normal control 7',
   [[['s2', 'MATH101H', 'ECON150'], ['s5', 'MATH101H', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 90},
    600, 1020],
   [['s2', 'MATH101H', 'ECON150', 735, True], ['s5', 'CHEM120', 'MATH101H', 795, True]]),
  ('normal control 8',
   [[['s4', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'PHYS110', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    540, 1080],
   [['s4', 'CHEM120', 'HIST140', 615, True], ['s3', 'MATH101H', 'ECON150', 645, True],
    ['s2', 'PHYS110', 'CHEM120', 675, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855],
   [['s1', 'A', 'B', 795, True]]),
  ('regression variant: longer first 2',
   [[['s3', 'CHEM120', 'MATH101H'], ['s1', 'HIST140', 'PHYS110'], ['s3', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 180,
     'ECON150': 180},
    540, 1020],
   [['s3', 'CHEM120', 'MATH101H', 675, True], ['s1', 'HIST140', 'PHYS110', 735, True],
    ['s3', 'HIST140', 'MATH101H', 735, True]]),
  ('partial repair guard 3',
   [[['s3', 'HIST140', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    600, 1080],
   [['s3', 'HIST140', 'CHEM120', 795, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('boundary control 5', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 6',
   [[['s3', 'HIST140', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 180},
    540, 1020],
   [['s3', 'BIO130', 'HIST140', 675, True]]),
  ('normal control 7',
   [[['s5', 'CHEM120', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120},
    780, 1020],
   [['s5', 'MATH101H', 'CHEM120', 975, False]]),
  ('normal control 8',
   [[['s1', 'BIO130', 'HIST140'], ['s3', 'MATH101', 'MATH101H'], ['s2', 'CHEM120', 'HIST140']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    840, 1020],
   [['s1', 'BIO130', 'HIST140', 915, True], ['s3', 'MATH101', 'MATH101H', 1035, False],
    ['s2', 'CHEM120', 'HIST140', 915, True]])],
 [('regression: longer first 1', [[['s2', 'B', 'A']], {'A': 90, 'B': 120}, 540, 780],
   [['s2', 'B', 'A', 675, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'PHYS110', 'HIST140'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'CHEM120', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 120},
    840, 1080],
   [['s5', 'PHYS110', 'HIST140', 1035, False], ['s3', 'ECON150', 'MATH101H', 975, True],
    ['s2', 'MATH101', 'CHEM120', 1035, False]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 'MATH101']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    840, 1080],
   [['s2', 'MATH101H', 'MATH101', 975, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('normal control 6',
   [[['s2', 'BIO130', 'PHYS110'], ['s4', 'ECON150', 'CHEM120'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60},
    540, 1020],
   [['s2', 'PHYS110', 'BIO130', 645, True], ['s4', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'MATH101H', 'PHYS110', 735, True]]),
  ('normal control 7',
   [[['s3', 'CHEM120', 'ECON150']],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 120},
    840, 1020],
   [['s3', 'CHEM120', 'ECON150', 975, False]]),
  ('normal control 8',
   [[['s1', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60},
    600, 1080],
   [['s1', 'HIST140', 'PHYS110', 735, True]])],
 [('regression: longer first 1', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 60},
    600, 1020],
   [['s5', 'HIST140', 'MATH101', 705, True]]),
  ('partial repair guard 3',
   [[['s2', 'ECON150', 'MATH101H'], ['s1', 'MATH101', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 90},
    840, 1020],
   [['s2', 'MATH101H', 'ECON150', 975, False], ['s1', 'MATH101', 'MATH101H', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 780, 1035],
   [['s1', 'A', 'B', 915, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('normal control 6',
   [[['s1', 'CHEM120', 'ECON150'], ['s1', 'PHYS110', 'CHEM120'], ['s1', 'MATH101', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    840, 1020],
   [['s1', 'ECON150', 'CHEM120', 1035, False], ['s1', 'CHEM120', 'PHYS110', 975, False],
    ['s1', 'MATH101', 'CHEM120', 1035, False]]),
  ('normal control 7',
   [[['s5', 'MATH101', 'ECON150'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 60, 'MATH101H': 60, 'PHYS110': 60, 'CHEM120': 60, 'BIO130': 60, 'HIST140': 90, 'ECON150': 60},
    840, 1080],
   [['s5', 'ECON150', 'MATH101', 915, True], ['s5', 'MATH101H', 'PHYS110', 915, True]]),
  ('normal control 8',
   [[['s4', 'PHYS110', 'MATH101H'], ['s1', 'CHEM120', 'PHYS110'], ['s2', 'ECON150', 'BIO130']],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60},
    540, 1020],
   [['s4', 'PHYS110', 'MATH101H', 675, True], ['s1', 'PHYS110', 'CHEM120', 675, True],
    ['s2', 'BIO130', 'ECON150', 675, True]])]]
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 fixtureActualExpectedOutcome
regression: longer first 1[['s1', 'A', 'B', 735, True]][['s1', 'B', 'A', 795, True]]Failed
regression variant: longer first 2[['s5', 'HIST140', 'MATH101H', 915, False]][['s5', 'MATH101H', 'HIST140', 975, False]]Failed
partial repair guard 3[['s2', 'BIO130', 'MATH101', 945, False]][['s2', 'MATH101', 'BIO130', 1035, False]]Failed
boundary control 4[['s1', 'B', 'A', 915, False]][['s1', 'A', 'B', 1035, False]]Failed
normal control 5[['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'CHEM120', 'MATH101H', 615, True]][['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]Failed
normal control 6[['s5', 'HIST140', 'CHEM120', 945, False], ['s3', 'MATH101H', 'BIO130', 945, False]][['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]Failed
normal control 7[['s4', 'PHYS110', 'HIST140', 885, False]][['s4', 'HIST140', 'PHYS110', 975, False]]Failed
normal control 8[['s2', 'MATH101H', 'PHYS110', 675, True]][['s2', 'PHYS110', 'MATH101H', 705, True]]Failed

SHA-256 / 85ce38a7dada9c79abcfac9fdde2dc4f481560132b995a82f8c1c6a6f3ad38e9

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(clashes, dur, start, day_end):
    out = []
    for st, a, b in clashes:
        first, second = sorted([a, b], key=lambda e: e)
        s2 = start + dur[first] + 15
        out.append([st, first, second, s2, s2 + dur[second] <= day_end])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 120, 'B': 180}, 600, 1080],
   [['s1', 'B', 'A', 795, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 180,
     'HIST140': 120,
     'ECON150': 120},
    780, 1080],
   [['s5', 'MATH101H', 'HIST140', 975, False]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 180},
    840, 1080],
   [['s2', 'MATH101', 'BIO130', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('normal control 5',
   [[['s4', 'PHYS110', 'MATH101'], ['s4', 'CHEM120', 'MATH101H']],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    540, 1080],
   [['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]),
  ('normal control 6',
   [[['s5', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90},
    840, 1020],
   [['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]),
  ('normal control 7',
   [[['s4', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 60,
     'HIST140': 180,
     'ECON150': 180},
    780, 1020],
   [['s4', 'HIST140', 'PHYS110', 975, False]]),
  ('normal control 8',
   [[['s2', 'MATH101H', 'PHYS110']],
    {'MATH101': 90, 'MATH101H': 60, 'PHYS110': 90, 'CHEM120': 90, 'BIO130': 60, 'HIST140': 60, 'ECON150': 60},
    600, 1080],
   [['s2', 'PHYS110', 'MATH101H', 705, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'CHEM120'], ['s3', 'CHEM120', 'ECON150'], ['s5', 'MATH101H', 'BIO130']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    540, 1080],
   [['s5', 'CHEM120', 'MATH101', 675, True], ['s3', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'BIO130', 'MATH101H', 645, True]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150', 'HIST140'], ['s4', 'PHYS110', 'BIO130'], ['s2', 'MATH101H', 'HIST140']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    780, 1020],
   [['s3', 'HIST140', 'ECON150', 915, True], ['s4', 'PHYS110', 'BIO130', 975, False],
    ['s2', 'HIST140', 'MATH101H', 915, False]]),
  ('boundary control 4', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 5',
   [[['s2', 'PHYS110', 'HIST140'], ['s5', 'BIO130', 'ECON150'], ['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 90},
    600, 1020],
   [['s2', 'PHYS110', 'HIST140', 795, True], ['s5', 'ECON150', 'BIO130', 705, True],
    ['s5', 'HIST140', 'MATH101', 675, True]]),
  ('normal control 6',
   [[['s4', 'BIO130', 'ECON150'], ['s1', 'BIO130', 'HIST140'], ['s5', 'PHYS110', 'MATH101']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60},
    780, 1020],
   [['s4', 'BIO130', 'ECON150', 885, True], ['s1', 'BIO130', 'HIST140', 885, True],
    ['s5', 'PHYS110', 'MATH101', 915, True]]),
  ('normal control 7',
   [[['s2', 'MATH101H', 'ECON150'], ['s5', 'MATH101H', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 90},
    600, 1020],
   [['s2', 'MATH101H', 'ECON150', 735, True], ['s5', 'CHEM120', 'MATH101H', 795, True]]),
  ('normal control 8',
   [[['s4', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'PHYS110', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    540, 1080],
   [['s4', 'CHEM120', 'HIST140', 615, True], ['s3', 'MATH101H', 'ECON150', 645, True],
    ['s2', 'PHYS110', 'CHEM120', 675, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855],
   [['s1', 'A', 'B', 795, True]]),
  ('regression variant: longer first 2',
   [[['s3', 'CHEM120', 'MATH101H'], ['s1', 'HIST140', 'PHYS110'], ['s3', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 180,
     'ECON150': 180},
    540, 1020],
   [['s3', 'CHEM120', 'MATH101H', 675, True], ['s1', 'HIST140', 'PHYS110', 735, True],
    ['s3', 'HIST140', 'MATH101H', 735, True]]),
  ('partial repair guard 3',
   [[['s3', 'HIST140', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    600, 1080],
   [['s3', 'HIST140', 'CHEM120', 795, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('boundary control 5', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 6',
   [[['s3', 'HIST140', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 180},
    540, 1020],
   [['s3', 'BIO130', 'HIST140', 675, True]]),
  ('normal control 7',
   [[['s5', 'CHEM120', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120},
    780, 1020],
   [['s5', 'MATH101H', 'CHEM120', 975, False]]),
  ('normal control 8',
   [[['s1', 'BIO130', 'HIST140'], ['s3', 'MATH101', 'MATH101H'], ['s2', 'CHEM120', 'HIST140']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    840, 1020],
   [['s1', 'BIO130', 'HIST140', 915, True], ['s3', 'MATH101', 'MATH101H', 1035, False],
    ['s2', 'CHEM120', 'HIST140', 915, True]])],
 [('regression: longer first 1', [[['s2', 'B', 'A']], {'A': 90, 'B': 120}, 540, 780],
   [['s2', 'B', 'A', 675, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'PHYS110', 'HIST140'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'CHEM120', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 120},
    840, 1080],
   [['s5', 'PHYS110', 'HIST140', 1035, False], ['s3', 'ECON150', 'MATH101H', 975, True],
    ['s2', 'MATH101', 'CHEM120', 1035, False]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 'MATH101']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    840, 1080],
   [['s2', 'MATH101H', 'MATH101', 975, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('normal control 6',
   [[['s2', 'BIO130', 'PHYS110'], ['s4', 'ECON150', 'CHEM120'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60},
    540, 1020],
   [['s2', 'PHYS110', 'BIO130', 645, True], ['s4', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'MATH101H', 'PHYS110', 735, True]]),
  ('normal control 7',
   [[['s3', 'CHEM120', 'ECON150']],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 120},
    840, 1020],
   [['s3', 'CHEM120', 'ECON150', 975, False]]),
  ('normal control 8',
   [[['s1', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60},
    600, 1080],
   [['s1', 'HIST140', 'PHYS110', 735, True]])],
 [('regression: longer first 1', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 60},
    600, 1020],
   [['s5', 'HIST140', 'MATH101', 705, True]]),
  ('partial repair guard 3',
   [[['s2', 'ECON150', 'MATH101H'], ['s1', 'MATH101', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 90},
    840, 1020],
   [['s2', 'MATH101H', 'ECON150', 975, False], ['s1', 'MATH101', 'MATH101H', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 780, 1035],
   [['s1', 'A', 'B', 915, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('normal control 6',
   [[['s1', 'CHEM120', 'ECON150'], ['s1', 'PHYS110', 'CHEM120'], ['s1', 'MATH101', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    840, 1020],
   [['s1', 'ECON150', 'CHEM120', 1035, False], ['s1', 'CHEM120', 'PHYS110', 975, False],
    ['s1', 'MATH101', 'CHEM120', 1035, False]]),
  ('normal control 7',
   [[['s5', 'MATH101', 'ECON150'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 60, 'MATH101H': 60, 'PHYS110': 60, 'CHEM120': 60, 'BIO130': 60, 'HIST140': 90, 'ECON150': 60},
    840, 1080],
   [['s5', 'ECON150', 'MATH101', 915, True], ['s5', 'MATH101H', 'PHYS110', 915, True]]),
  ('normal control 8',
   [[['s4', 'PHYS110', 'MATH101H'], ['s1', 'CHEM120', 'PHYS110'], ['s2', 'ECON150', 'BIO130']],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60},
    540, 1020],
   [['s4', 'PHYS110', 'MATH101H', 675, True], ['s1', 'PHYS110', 'CHEM120', 675, True],
    ['s2', 'BIO130', 'ECON150', 675, True]])]]
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 fixtureActualExpectedOutcome
regression: longer first 1[['s1', 'A', 'B', 735, True]][['s1', 'B', 'A', 795, True]]Failed
regression variant: longer first 2[['s5', 'HIST140', 'MATH101H', 915, False]][['s5', 'MATH101H', 'HIST140', 975, False]]Failed
partial repair guard 3[['s2', 'BIO130', 'MATH101', 945, False]][['s2', 'MATH101', 'BIO130', 1035, False]]Failed
boundary control 4[['s1', 'A', 'B', 1035, False]][['s1', 'A', 'B', 1035, False]]Passed
normal control 5[['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'CHEM120', 'MATH101H', 615, True]][['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]Failed
normal control 6[['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]][['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]Passed
normal control 7[['s4', 'HIST140', 'PHYS110', 975, False]][['s4', 'HIST140', 'PHYS110', 975, False]]Passed
normal control 8[['s2', 'MATH101H', 'PHYS110', 675, True]][['s2', 'PHYS110', 'MATH101H', 705, True]]Failed

SHA-256 / c5d401e99daeab6f0c053896da19b8d2bf557866c92c1e1842f24f6c916ef6ee

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(clashes, dur, start, day_end):
    out = []
    for st, a, b in clashes:
        first, second = sorted([a, b], key=lambda e: (-dur[e], e))
        s2 = start + dur[first] + 15
        out.append([st, first, second, s2, s2 + dur[second] <= day_end])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 120, 'B': 180}, 600, 1080],
   [['s1', 'B', 'A', 795, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 180,
     'HIST140': 120,
     'ECON150': 120},
    780, 1080],
   [['s5', 'MATH101H', 'HIST140', 975, False]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 180},
    840, 1080],
   [['s2', 'MATH101', 'BIO130', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('normal control 5',
   [[['s4', 'PHYS110', 'MATH101'], ['s4', 'CHEM120', 'MATH101H']],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    540, 1080],
   [['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]),
  ('normal control 6',
   [[['s5', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90},
    840, 1020],
   [['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]),
  ('normal control 7',
   [[['s4', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 60,
     'HIST140': 180,
     'ECON150': 180},
    780, 1020],
   [['s4', 'HIST140', 'PHYS110', 975, False]]),
  ('normal control 8',
   [[['s2', 'MATH101H', 'PHYS110']],
    {'MATH101': 90, 'MATH101H': 60, 'PHYS110': 90, 'CHEM120': 90, 'BIO130': 60, 'HIST140': 60, 'ECON150': 60},
    600, 1080],
   [['s2', 'PHYS110', 'MATH101H', 705, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 840, 1080],
   [['s1', 'A', 'B', 1035, False]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'CHEM120'], ['s3', 'CHEM120', 'ECON150'], ['s5', 'MATH101H', 'BIO130']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    540, 1080],
   [['s5', 'CHEM120', 'MATH101', 675, True], ['s3', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'BIO130', 'MATH101H', 645, True]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150', 'HIST140'], ['s4', 'PHYS110', 'BIO130'], ['s2', 'MATH101H', 'HIST140']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90},
    780, 1020],
   [['s3', 'HIST140', 'ECON150', 915, True], ['s4', 'PHYS110', 'BIO130', 975, False],
    ['s2', 'HIST140', 'MATH101H', 915, False]]),
  ('boundary control 4', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 5',
   [[['s2', 'PHYS110', 'HIST140'], ['s5', 'BIO130', 'ECON150'], ['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 90},
    600, 1020],
   [['s2', 'PHYS110', 'HIST140', 795, True], ['s5', 'ECON150', 'BIO130', 705, True],
    ['s5', 'HIST140', 'MATH101', 675, True]]),
  ('normal control 6',
   [[['s4', 'BIO130', 'ECON150'], ['s1', 'BIO130', 'HIST140'], ['s5', 'PHYS110', 'MATH101']],
    {'MATH101': 90,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60},
    780, 1020],
   [['s4', 'BIO130', 'ECON150', 885, True], ['s1', 'BIO130', 'HIST140', 885, True],
    ['s5', 'PHYS110', 'MATH101', 915, True]]),
  ('normal control 7',
   [[['s2', 'MATH101H', 'ECON150'], ['s5', 'MATH101H', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 90},
    600, 1020],
   [['s2', 'MATH101H', 'ECON150', 735, True], ['s5', 'CHEM120', 'MATH101H', 795, True]]),
  ('normal control 8',
   [[['s4', 'HIST140', 'CHEM120'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'PHYS110', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    540, 1080],
   [['s4', 'CHEM120', 'HIST140', 615, True], ['s3', 'MATH101H', 'ECON150', 645, True],
    ['s2', 'PHYS110', 'CHEM120', 675, True]])],
 [('regression: longer first 1', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855],
   [['s1', 'A', 'B', 795, True]]),
  ('regression variant: longer first 2',
   [[['s3', 'CHEM120', 'MATH101H'], ['s1', 'HIST140', 'PHYS110'], ['s3', 'HIST140', 'MATH101H']],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 180,
     'ECON150': 180},
    540, 1020],
   [['s3', 'CHEM120', 'MATH101H', 675, True], ['s1', 'HIST140', 'PHYS110', 735, True],
    ['s3', 'HIST140', 'MATH101H', 735, True]]),
  ('partial repair guard 3',
   [[['s3', 'HIST140', 'CHEM120']],
    {'MATH101': 120,
     'MATH101H': 180,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    600, 1080],
   [['s3', 'HIST140', 'CHEM120', 795, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('boundary control 5', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('normal control 6',
   [[['s3', 'HIST140', 'BIO130']],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 180},
    540, 1020],
   [['s3', 'BIO130', 'HIST140', 675, True]]),
  ('normal control 7',
   [[['s5', 'CHEM120', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120},
    780, 1020],
   [['s5', 'MATH101H', 'CHEM120', 975, False]]),
  ('normal control 8',
   [[['s1', 'BIO130', 'HIST140'], ['s3', 'MATH101', 'MATH101H'], ['s2', 'CHEM120', 'HIST140']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60},
    840, 1020],
   [['s1', 'BIO130', 'HIST140', 915, True], ['s3', 'MATH101', 'MATH101H', 1035, False],
    ['s2', 'CHEM120', 'HIST140', 915, True]])],
 [('regression: longer first 1', [[['s2', 'B', 'A']], {'A': 90, 'B': 120}, 540, 780],
   [['s2', 'B', 'A', 675, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'PHYS110', 'HIST140'], ['s3', 'MATH101H', 'ECON150'], ['s2', 'CHEM120', 'MATH101']],
    {'MATH101': 180,
     'MATH101H': 90,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 120},
    840, 1080],
   [['s5', 'PHYS110', 'HIST140', 1035, False], ['s3', 'ECON150', 'MATH101H', 975, True],
    ['s2', 'MATH101', 'CHEM120', 1035, False]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 'MATH101']],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 90},
    840, 1080],
   [['s2', 'MATH101H', 'MATH101', 975, True]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 600, 855], [['s1', 'A', 'B', 735, True]]),
  ('normal control 6',
   [[['s2', 'BIO130', 'PHYS110'], ['s4', 'ECON150', 'CHEM120'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 180,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60},
    540, 1020],
   [['s2', 'PHYS110', 'BIO130', 645, True], ['s4', 'CHEM120', 'ECON150', 675, True],
    ['s5', 'MATH101H', 'PHYS110', 735, True]]),
  ('normal control 7',
   [[['s3', 'CHEM120', 'ECON150']],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 120},
    840, 1020],
   [['s3', 'CHEM120', 'ECON150', 975, False]]),
  ('normal control 8',
   [[['s1', 'HIST140', 'PHYS110']],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60},
    600, 1080],
   [['s1', 'HIST140', 'PHYS110', 735, True]])],
 [('regression: longer first 1', [[['s3', 'A', 'B'], ['s1', 'A', 'B']], {'A': 60, 'B': 90}, 780, 1020],
   [['s3', 'B', 'A', 885, True], ['s1', 'B', 'A', 885, True]]),
  ('regression variant: longer first 2',
   [[['s5', 'MATH101', 'HIST140']],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 180,
     'CHEM120': 120,
     'BIO130': 180,
     'HIST140': 90,
     'ECON150': 60},
    600, 1020],
   [['s5', 'HIST140', 'MATH101', 705, True]]),
  ('partial repair guard 3',
   [[['s2', 'ECON150', 'MATH101H'], ['s1', 'MATH101', 'MATH101H']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 180,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 90},
    840, 1020],
   [['s2', 'MATH101H', 'ECON150', 975, False], ['s1', 'MATH101', 'MATH101H', 1035, False]]),
  ('boundary control 4', [[['s1', 'A', 'B']], {'A': 120, 'B': 120}, 780, 1035],
   [['s1', 'A', 'B', 915, True]]),
  ('boundary control 5', [[['s1', 'A', 'B']], {'A': 180, 'B': 60}, 600, 855], [['s1', 'A', 'B', 795, True]]),
  ('normal control 6',
   [[['s1', 'CHEM120', 'ECON150'], ['s1', 'PHYS110', 'CHEM120'], ['s1', 'MATH101', 'CHEM120']],
    {'MATH101': 180,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 180,
     'ECON150': 180},
    840, 1020],
   [['s1', 'ECON150', 'CHEM120', 1035, False], ['s1', 'CHEM120', 'PHYS110', 975, False],
    ['s1', 'MATH101', 'CHEM120', 1035, False]]),
  ('normal control 7',
   [[['s5', 'MATH101', 'ECON150'], ['s5', 'PHYS110', 'MATH101H']],
    {'MATH101': 60, 'MATH101H': 60, 'PHYS110': 60, 'CHEM120': 60, 'BIO130': 60, 'HIST140': 90, 'ECON150': 60},
    840, 1080],
   [['s5', 'ECON150', 'MATH101', 915, True], ['s5', 'MATH101H', 'PHYS110', 915, True]]),
  ('normal control 8',
   [[['s4', 'PHYS110', 'MATH101H'], ['s1', 'CHEM120', 'PHYS110'], ['s2', 'ECON150', 'BIO130']],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60},
    540, 1020],
   [['s4', 'PHYS110', 'MATH101H', 675, True], ['s1', 'PHYS110', 'CHEM120', 675, True],
    ['s2', 'BIO130', 'ECON150', 675, True]])]]
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 fixtureActualExpectedOutcome
regression: longer first 1[['s1', 'B', 'A', 795, True]][['s1', 'B', 'A', 795, True]]Passed
regression variant: longer first 2[['s5', 'MATH101H', 'HIST140', 975, False]][['s5', 'MATH101H', 'HIST140', 975, False]]Passed
partial repair guard 3[['s2', 'MATH101', 'BIO130', 1035, False]][['s2', 'MATH101', 'BIO130', 1035, False]]Passed
boundary control 4[['s1', 'A', 'B', 1035, False]][['s1', 'A', 'B', 1035, False]]Passed
normal control 5[['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]][['s4', 'MATH101', 'PHYS110', 615, True], ['s4', 'MATH101H', 'CHEM120', 645, True]]Passed
normal control 6[['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]][['s5', 'CHEM120', 'HIST140', 1035, False], ['s3', 'BIO130', 'MATH101H', 975, False]]Passed
normal control 7[['s4', 'HIST140', 'PHYS110', 975, False]][['s4', 'HIST140', 'PHYS110', 975, False]]Passed
normal control 8[['s2', 'PHYS110', 'MATH101H', 705, True]][['s2', 'PHYS110', 'MATH101H', 705, True]]Passed

SHA-256 / 93506c0a9c4401332a5493ab3a242e7cbf26175a0dfc9ddaaa287afc4f446cc9

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:06.518439+00:00.

Case digest / 7b6ce562992661ce6c7942600657baf2c3932aae66f88ff2e9b85b00944a6f5a