FAILURE MAP
← Case archive

FA-94356 / Exam timetabling constraints / Open access

Single exam in a period reported as a clash · case 01

Every scheduled sitting is listed as a clash.

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

ROOT CAUSE

The clash test accepts one paper.

VERIFIED REPAIR

A clash needs at least two distinct papers.

Unsuccessful approach: Requiring three papers hides ordinary two-exam clashes.

Case contract

enrol rows [student, exam] (may repeat), period maps scheduled exams to a period, xlist groups cross-listed exams that are one physical paper (canonical name = smallest id in the group). A clash is a student with two or more distinct canonical papers in one period; unscheduled exams are ignored. Return [student, period, sorted papers] ordered by student then period.

Why this case matters

Clash detection is the primary hard constraint of exam timetabling; duplicate enrolments and cross-listing are the usual sources of false clashes.

1 / The failure

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

N = 1
observations = []
def solve(enrol, period, xlist):
    canon = {}
    for g in xlist:
        for e in g:
            canon[e] = min(g)
    slots = {}
    for st, ex in enrol:
        if ex not in period:
            continue
        slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
    out = []
    for (st, p), papers in sorted(slots.items()):
        if len(papers) >= 1:
            out.append([st, p, sorted(papers)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
     ['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
   [['s3', 0, ['ECON150', 'MATH101H']]]),
  ('boundary control 3',
   [[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
    {'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
   [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
  ('normal control 4',
   [[['s3', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
     ['s5', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
     ['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
     ['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
     ['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
 [('regression: clash threshold 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
  ('regression variant: clash threshold 2',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
     ['s5', 'HIST140']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
   [['s5', 1, ['BIO130', 'HIST140']]]),
  ('normal control 3',
   [[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'MATH101H']],
    {'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
   [['s5', 0, ['MATH101H', 'PHYS110']]]),
  ('normal control 4',
   [[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
     ['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
    {'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
  ('normal control 5',
   [[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
     ['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
     ['s2', 'BIO130'], ['s1', 'MATH101']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
   [['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
    ['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
     ['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s5', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
     ['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s5', 3, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'BIO130']],
    {'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
   []),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
     ['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
     ['s2', 'BIO130'], ['s4', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
  ('boundary control 4',
   [[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
    []],
   [['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
  ('normal control 5',
   [[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
    {'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
     ['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
     ['s1', 'ECON150'], ['s2', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
   [['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101']]]),
  ('normal control 7',
   [[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
    [['MATH101H', 'MATH101']]],
   [['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
     ['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 1, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
     ['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
    {'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 0, ['ECON150', 'MATH101']]]),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('normal control 5',
   [[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
     ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
     ['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
  ('normal control 6',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 7',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 3, ['CHEM120', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
     ['s4', 'PHYS110'], ['s1', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
   [['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
   [['s3', 1, ['HIST140', 'MATH101']]]),
  ('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('normal control 4',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
     ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
     ['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
     ['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
    ['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
    ['s5', 3, ['MATH101', 'PHYS110']]]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
     ['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
     ['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
   [['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
    ['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
  ('normal control 7',
   [[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
     ['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
     ['s5', 'MATH101'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
   [['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
     ['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
     ['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
   [['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1[['s1', 0, ['MATH101']]][]Failed
regression variant: clash threshold 2[['s2', 0, ['ECON150']], ['s2', 2, ['BIO130']], ['s2', 3, ['MATH101']], ['s3', 0, ['ECON150', 'MATH101H']], ['s3', 2, ['BIO130']], ['s4', 0, ['MATH101H']]][['s3', 0, ['ECON150', 'MATH101H']]]Failed
boundary control 3[['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]][['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]Passed
normal control 4[['s3', 1, ['BIO130']]][]Failed
normal control 5[['s1', 1, ['MATH101']], ['s1', 3, ['PHYS110']], ['s4', 1, ['MATH101']], ['s5', 0, ['ECON150']], ['s5', 1, ['MATH101']], ['s5', 2, ['CHEM120']]][]Failed
normal control 6[['s1', 0, ['MATH101']], ['s2', 0, ['MATH101']], ['s2', 1, ['CHEM120', 'ECON150']], ['s3', 0, ['MATH101']], ['s3', 1, ['BIO130', 'HIST140']], ['s3', 2, ['MATH101']], ['s4', 1, ['BIO130']], ['s4', 2, ['MATH101']], ['s5', 1, ['HIST140']], ['s5', 2, ['MATH101']]][['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]Failed
normal control 7[['s1', 2, ['CHEM120', 'MATH101']], ['s1', 3, ['PHYS110']], ['s2', 3, ['HIST140']], ['s3', 3, ['HIST140', 'PHYS110']], ['s4', 3, ['PHYS110']]][['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]Failed
normal control 8[['s1', 1, ['ECON150', 'PHYS110']], ['s1', 3, ['MATH101H']], ['s2', 2, ['CHEM120', 'HIST140']], ['s3', 1, ['PHYS110']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']], ['s4', 2, ['CHEM120']], ['s5', 1, ['ECON150']], ['s5', 2, ['CHEM120']]][['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]Failed

SHA-256 / dd69f0f63ffe67b3728dfeac7bfae8574a6e376d03075d08a030b725450c9de1

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(enrol, period, xlist):
    canon = {}
    for g in xlist:
        for e in g:
            canon[e] = min(g)
    slots = {}
    for st, ex in enrol:
        if ex not in period:
            continue
        slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
    out = []
    for (st, p), papers in sorted(slots.items()):
        if len(papers) > 2:
            out.append([st, p, sorted(papers)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
     ['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
   [['s3', 0, ['ECON150', 'MATH101H']]]),
  ('boundary control 3',
   [[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
    {'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
   [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
  ('normal control 4',
   [[['s3', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
     ['s5', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
     ['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
     ['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
     ['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
 [('regression: clash threshold 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
  ('regression variant: clash threshold 2',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
     ['s5', 'HIST140']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
   [['s5', 1, ['BIO130', 'HIST140']]]),
  ('normal control 3',
   [[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'MATH101H']],
    {'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
   [['s5', 0, ['MATH101H', 'PHYS110']]]),
  ('normal control 4',
   [[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
     ['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
    {'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
  ('normal control 5',
   [[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
     ['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
     ['s2', 'BIO130'], ['s1', 'MATH101']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
   [['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
    ['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
     ['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s5', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
     ['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s5', 3, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'BIO130']],
    {'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
   []),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
     ['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
     ['s2', 'BIO130'], ['s4', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
  ('boundary control 4',
   [[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
    []],
   [['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
  ('normal control 5',
   [[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
    {'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
     ['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
     ['s1', 'ECON150'], ['s2', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
   [['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101']]]),
  ('normal control 7',
   [[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
    [['MATH101H', 'MATH101']]],
   [['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
     ['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 1, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
     ['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
    {'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 0, ['ECON150', 'MATH101']]]),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('normal control 5',
   [[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
     ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
     ['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
  ('normal control 6',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 7',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 3, ['CHEM120', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
     ['s4', 'PHYS110'], ['s1', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
   [['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
   [['s3', 1, ['HIST140', 'MATH101']]]),
  ('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('normal control 4',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
     ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
     ['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
     ['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
    ['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
    ['s5', 3, ['MATH101', 'PHYS110']]]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
     ['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
     ['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
   [['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
    ['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
  ('normal control 7',
   [[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
     ['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
     ['s5', 'MATH101'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
   [['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
     ['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
     ['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
   [['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1[][]Passed
regression variant: clash threshold 2[][['s3', 0, ['ECON150', 'MATH101H']]]Failed
boundary control 3[][['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]Failed
normal control 4[][]Passed
normal control 5[][]Passed
normal control 6[][['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]Failed
normal control 7[][['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]Failed
normal control 8[['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]][['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]Failed

SHA-256 / e69d3743f7ed9595ea3d1eb106936fbf214020335d5138fbfaef6e32339be45c

3 / The verified repair

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

N = 1
observations = []
def solve(enrol, period, xlist):
    canon = {}
    for g in xlist:
        for e in g:
            canon[e] = min(g)
    slots = {}
    for st, ex in enrol:
        if ex not in period:
            continue
        slots.setdefault((st, period[ex]), set()).add(canon.get(ex, ex))
    out = []
    for (st, p), papers in sorted(slots.items()):
        if len(papers) > 1:
            out.append([st, p, sorted(papers)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s3', 'ECON150'], ['s2', 'BIO130'], ['s3', 'BIO130'],
     ['s3', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 3, 'ECON150': 0}, []],
   [['s3', 0, ['ECON150', 'MATH101H']]]),
  ('boundary control 3',
   [[['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130'], ['s2', 'HIST140']],
    {'PHYS110': 1, 'CHEM120': 1, 'BIO130': 0, 'HIST140': 0}, []],
   [['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]),
  ('normal control 4',
   [[['s3', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 0, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s1', 'MATH101'], ['s4', 'MATH101'], ['s5', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'ECON150'],
     ['s5', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101'],
     ['s4', 'MATH101H'], ['s5', 'PHYS110'], ['s4', 'BIO130'], ['s2', 'MATH101'], ['s3', 'MATH101H'],
     ['s2', 'CHEM120'], ['s5', 'MATH101H'], ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'MATH101H'], ['s3', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'MATH101'], ['s2', 'MATH101'],
     ['s1', 'PHYS110'], ['s2', 'HIST140'], ['s3', 'HIST140'], ['s4', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101H': 2, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]])],
 [('regression: clash threshold 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101H']], {'MATH101': 0, 'MATH101H': 0}, [['MATH101H', 'MATH101']]], []),
  ('regression variant: clash threshold 2',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101'], ['s5', 'BIO130'],
     ['s5', 'HIST140']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 1, 'ECON150': 3}, []],
   [['s5', 1, ['BIO130', 'HIST140']]]),
  ('normal control 3',
   [[['s2', 'BIO130'], ['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'MATH101H']],
    {'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2}, []],
   [['s5', 0, ['MATH101H', 'PHYS110']]]),
  ('normal control 4',
   [[['s2', 'ECON150'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s4', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'MATH101'], ['s5', 'ECON150'], ['s3', 'PHYS110'], ['s3', 'BIO130'], ['s4', 'MATH101'],
     ['s4', 'ECON150'], ['s1', 'MATH101'], ['s3', 'MATH101H'], ['s2', 'MATH101H']],
    {'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 1, ['CHEM120', 'MATH101']], ['s5', 1, ['HIST140', 'MATH101']]]),
  ('normal control 5',
   [[['s3', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 3, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 6',
   [[['s5', 'HIST140'], ['s1', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'ECON150'], ['s3', 'CHEM120'],
     ['s5', 'CHEM120'], ['s5', 'ECON150'], ['s4', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'HIST140'],
     ['s2', 'BIO130'], ['s1', 'MATH101']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 1, 'ECON150': 1}, []],
   [['s1', 1, ['HIST140', 'MATH101']], ['s2', 1, ['ECON150', 'HIST140']],
    ['s5', 1, ['CHEM120', 'ECON150', 'HIST140']]]),
  ('normal control 7',
   [[['s1', 'BIO130'], ['s5', 'HIST140'], ['s4', 'CHEM120'], ['s4', 'MATH101H'], ['s2', 'MATH101H'],
     ['s5', 'MATH101'], ['s2', 'MATH101'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s5', 'PHYS110'], ['s1', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'MATH101']], ['s3', 0, ['CHEM120', 'MATH101']], ['s4', 0, ['CHEM120', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s3', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'ECON150'], ['s1', 'MATH101H'],
     ['s5', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s5', 'MATH101H'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 1, 'BIO130': 2, 'HIST140': 3, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s5', 3, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('regression variant: clash threshold 2',
   [[['s1', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'BIO130']],
    {'MATH101': 3, 'MATH101H': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 0, 'ECON150': 3}, []],
   []),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s3', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'BIO130'], ['s4', 'MATH101H'],
     ['s4', 'BIO130'], ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s4', 'CHEM120'], ['s2', 'CHEM120'],
     ['s2', 'BIO130'], ['s4', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s2', 1, ['BIO130', 'CHEM120']], ['s3', 1, ['BIO130', 'CHEM120']], ['s4', 1, ['BIO130', 'CHEM120']]]),
  ('boundary control 4',
   [[['s2', 'ECON150'], ['s1', 'ECON150'], ['s2', 'BIO130'], ['s1', 'BIO130']], {'ECON150': 2, 'BIO130': 2},
    []],
   [['s1', 2, ['BIO130', 'ECON150']], ['s2', 2, ['BIO130', 'ECON150']]]),
  ('normal control 5',
   [[['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'ECON150'], ['s1', 'CHEM120'], ['s3', 'BIO130'], ['s2', 'BIO130']],
    {'MATH101': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 1},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('normal control 6',
   [[['s3', 'HIST140'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'HIST140'],
     ['s4', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'CHEM120'],
     ['s1', 'ECON150'], ['s2', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2, 'ECON150': 0}, []],
   [['s3', 1, ['MATH101H', 'PHYS110']], ['s3', 2, ['HIST140', 'MATH101']],
    ['s5', 2, ['HIST140', 'MATH101']]]),
  ('normal control 7',
   [[['s3', 'BIO130'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 2, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 2},
    [['MATH101H', 'MATH101']]],
   [['s3', 2, ['BIO130', 'MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s2', 'MATH101H'], ['s3', 'MATH101H'], ['s4', 'BIO130'], ['s5', 'HIST140'],
     ['s2', 'CHEM120'], ['s1', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'], ['s5', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 1, ['HIST140', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s3', 'MATH101'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s2', 'CHEM120'], ['s3', 'PHYS110'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 3, 'PHYS110': 1, 'BIO130': 3, 'HIST140': 0, 'ECON150': 2},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   []),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101H'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'],
     ['s4', 'MATH101H'], ['s4', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'ECON150']],
    {'MATH101': 3, 'MATH101H': 2, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 2},
    [['MATH101H', 'MATH101']]],
   [['s1', 2, ['BIO130', 'ECON150']], ['s4', 2, ['BIO130', 'ECON150', 'MATH101']]]),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'BIO130'], ['s3', 'MATH101']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 1, 'ECON150': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s3', 0, ['ECON150', 'MATH101']]]),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0}, []], []),
  ('normal control 5',
   [[['s1', 'PHYS110'], ['s2', 'PHYS110'], ['s4', 'MATH101H'], ['s1', 'MATH101H'], ['s3', 'CHEM120'],
     ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'BIO130'],
     ['s1', 'CHEM120'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 2, 'HIST140': 2, 'ECON150': 3},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 2, ['CHEM120', 'MATH101']], ['s2', 2, ['CHEM120', 'MATH101']], ['s3', 2, ['CHEM120', 'MATH101']]]),
  ('normal control 6',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 7',
   [[['s5', 'ECON150'], ['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s1', 'MATH101H'], ['s1', 'PHYS110'],
     ['s1', 'ECON150'], ['s3', 'PHYS110'], ['s2', 'CHEM120'], ['s2', 'HIST140'], ['s4', 'PHYS110'],
     ['s2', 'CHEM120'], ['s4', 'ECON150'], ['s4', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 1}, []],
   [['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']],
    ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'BIO130'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0},
    [['MATH101', 'MATH101H'], ['PHYS110', 'CHEM120']]],
   [['s1', 3, ['CHEM120', 'MATH101']]])],
 [('regression: clash threshold 1',
   [[['s5', 'CHEM120'], ['s1', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s1', 'BIO130'], ['s2', 'ECON150'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s3', 'BIO130'],
     ['s4', 'PHYS110'], ['s1', 'MATH101']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 2, 'BIO130': 3, 'HIST140': 3, 'ECON150': 2}, []],
   [['s1', 3, ['BIO130', 'MATH101']], ['s2', 2, ['ECON150', 'PHYS110']]]),
  ('regression variant: clash threshold 2',
   [[['s3', 'MATH101'], ['s3', 'HIST140'], ['s5', 'MATH101H'], ['s3', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 3, 'PHYS110': 1, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 2}, []],
   [['s3', 1, ['HIST140', 'MATH101']]]),
  ('boundary control 3', [[['s1', 'MATH101'], ['s1', 'MATH101']], {'MATH101': 0}, []], []),
  ('normal control 4',
   [[['s1', 'BIO130'], ['s4', 'PHYS110'], ['s3', 'ECON150'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'MATH101H'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s3', 'MATH101'], ['s4', 'MATH101H']],
    {'MATH101': 1, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 0, 'ECON150': 3},
    [['MATH101H', 'MATH101']]],
   []),
  ('normal control 5',
   [[['s5', 'PHYS110'], ['s4', 'CHEM120'], ['s3', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'BIO130'],
     ['s1', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'ECON150'], ['s2', 'MATH101H'],
     ['s1', 'BIO130'], ['s1', 'HIST140'], ['s2', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'],
     ['s5', 'ECON150'], ['s4', 'PHYS110'], ['s3', 'MATH101H']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 3, 'CHEM120': 1, 'BIO130': 3, 'ECON150': 1},
    [['MATH101H', 'MATH101']]],
   [['s1', 3, ['BIO130', 'MATH101', 'PHYS110']], ['s2', 3, ['BIO130', 'MATH101']],
    ['s3', 1, ['CHEM120', 'ECON150']], ['s3', 3, ['MATH101', 'PHYS110']],
    ['s5', 3, ['MATH101', 'PHYS110']]]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'ECON150'],
     ['s2', 'HIST140'], ['s3', 'PHYS110'], ['s1', 'PHYS110'], ['s5', 'MATH101'], ['s4', 'PHYS110'],
     ['s3', 'BIO130'], ['s1', 'MATH101'], ['s4', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 3, 'ECON150': 3}, []],
   [['s1', 3, ['HIST140', 'MATH101']], ['s2', 3, ['CHEM120', 'HIST140']], ['s3', 0, ['BIO130', 'PHYS110']],
    ['s5', 3, ['ECON150', 'MATH101', 'MATH101H']]]),
  ('normal control 7',
   [[['s4', 'HIST140'], ['s5', 'PHYS110'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s1', 'CHEM120'],
     ['s4', 'MATH101'], ['s4', 'HIST140'], ['s2', 'MATH101H'], ['s4', 'MATH101H'], ['s2', 'PHYS110'],
     ['s5', 'MATH101'], ['s3', 'CHEM120']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, []],
   [['s3', 0, ['CHEM120', 'HIST140']], ['s5', 2, ['MATH101', 'PHYS110']]]),
  ('normal control 8',
   [[['s1', 'HIST140'], ['s4', 'CHEM120'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s2', 'MATH101H'],
     ['s5', 'HIST140'], ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s4', 'PHYS110'], ['s2', 'HIST140'],
     ['s1', 'MATH101H'], ['s1', 'MATH101'], ['s2', 'CHEM120']],
    {'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 1, 'ECON150': 0}, [['MATH101H', 'MATH101']]],
   [['s2', 3, ['CHEM120', 'PHYS110']], ['s4', 3, ['CHEM120', 'PHYS110']]])]]
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: clash threshold 1[][]Passed
regression variant: clash threshold 2[['s3', 0, ['ECON150', 'MATH101H']]][['s3', 0, ['ECON150', 'MATH101H']]]Passed
boundary control 3[['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]][['s1', 1, ['CHEM120', 'PHYS110']], ['s2', 0, ['BIO130', 'HIST140']]]Passed
normal control 4[][]Passed
normal control 5[][]Passed
normal control 6[['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]][['s2', 1, ['CHEM120', 'ECON150']], ['s3', 1, ['BIO130', 'HIST140']]]Passed
normal control 7[['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]][['s1', 2, ['CHEM120', 'MATH101']], ['s3', 3, ['HIST140', 'PHYS110']]]Passed
normal control 8[['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]][['s1', 1, ['ECON150', 'PHYS110']], ['s2', 2, ['CHEM120', 'HIST140']], ['s4', 1, ['BIO130', 'ECON150', 'PHYS110']]]Passed

SHA-256 / e09013ed7e6696dfad3910b5ce2f4bcdb528d81b50b34ef174d7b333bd85ff7d

Verification & scope

Stipulated toy exam-timetabling rule set for a bounded model; it does not claim conformance with any institution's regulations or a benchmark specification, and it performs no search or optimisation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:52:03.551144+00:00.

Case digest / 8e3c296751ddd91445c3fb43a32798dd52795418fce136ebc8a61b90b33a65bc