FAILURE MAP
← Case archive

FA-94426 / Exam timetabling constraints / Open access

Repeated enrolment rows multiply proximity pairs · case 01

A duplicated enrolment doubles the cost of every pair involving that exam.

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

ROOT CAUSE

Pairs are formed from raw enrolment rows instead of distinct exams.

VERIFIED REPAIR

Form pairs over each student's distinct exams.

Unsuccessful approach: Deduplicating periods merges different exams in the same period.

Case contract

enrol [student, exam] rows (may repeat) and exam periods. For each student, each pair of distinct exams d = 1..5 periods apart costs 2^(5-d). Return [total, number of students, total/students as a reduced fraction string].

Why this case matters

The Carter proximity cost is the standard exam-timetabling quality measure; each piece has a known implementation pitfall.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(enrol, period):
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    total = 0
    for st, exs in by.items():
        ps = sorted(period[e] for e in [x for s2, x in enrol if s2 == st])
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                d = ps[j] - ps[i]
                if 1 <= d <= 5:
                    total += 2 ** (5 - d)
    n = len(by)
    return [total, n, str(Fraction(total, n)) if n else '0']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: distinct exams 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),
  ('regression variant: distinct exams 2',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('partial repair guard 3',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],
     ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],
   [49, 5, '49/5']),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],
     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],
   [66, 4, '33/2'])],
 [('regression: distinct exams 1',
   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],
     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],
   [20, 4, '5']),
  ('regression variant: distinct exams 2',
   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],
   [30, 3, '10']),
  ('partial repair guard 3',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],
   [32, 2, '16']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],
     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],
    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],
   [10, 4, '5/2']),
  ('normal control 7',
   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],
     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],
   [94, 5, '94/5']),
  ('normal control 8',
   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],
     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],
   [11, 4, '11/4'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],
     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],
     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],
   [105, 4, '105/4']),
  ('regression variant: distinct exams 2',
   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],
     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],
     ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],
   [19, 4, '19/4']),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],
     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],
     ['s3', 'MATH101']],
    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [91, 3, '91/3']),
  ('normal control 7',
   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],
   [33, 1, '33']),
  ('normal control 8',
   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],
     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],
   [107, 4, '107/4'])],
 [('regression: distinct exams 1',
   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],
   [40, 2, '20']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],
     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],
   [153, 5, '153/5']),
  ('partial repair guard 3',
   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],
     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],
     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],
   [55, 5, '11']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],
     ['s5', 'MATH101'], ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],
   [56, 2, '28']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 8',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],
     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],
    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],
   [36, 4, '9'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],
     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],
   [24, 3, '8']),
  ('partial repair guard 3',
   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],
   [70, 3, '70/3']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],
     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],
   [49, 4, '49/4']),
  ('normal control 7',
   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],
     ['s1', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],
   [89, 4, '89/4']),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],
     ['s4', 'HIST140'], ['s1', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [41, 4, '41/4'])]]
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: distinct exams 1[16, 1, '16'][8, 1, '8']Failed
regression variant: distinct exams 2[88, 1, '88'][48, 1, '48']Failed
partial repair guard 3[81, 4, '81/4'][65, 4, '65/4']Failed
boundary control 4[0, 1, '0'][0, 1, '0']Passed
boundary control 5[0, 1, '0'][0, 1, '0']Passed
normal control 6[96, 4, '24'][96, 4, '24']Passed
normal control 7[49, 5, '49/5'][49, 5, '49/5']Passed
normal control 8[66, 4, '33/2'][66, 4, '33/2']Passed

SHA-256 / bf485ebc13f6a86540836bae3d92b84898c67404761f0981ee98d5e0be7bdfe0

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(enrol, period):
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    total = 0
    for st, exs in by.items():
        ps = sorted(set(period[e] for e in exs))
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                d = ps[j] - ps[i]
                if 1 <= d <= 5:
                    total += 2 ** (5 - d)
    n = len(by)
    return [total, n, str(Fraction(total, n)) if n else '0']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: distinct exams 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),
  ('regression variant: distinct exams 2',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('partial repair guard 3',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],
     ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],
   [49, 5, '49/5']),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],
     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],
   [66, 4, '33/2'])],
 [('regression: distinct exams 1',
   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],
     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],
   [20, 4, '5']),
  ('regression variant: distinct exams 2',
   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],
   [30, 3, '10']),
  ('partial repair guard 3',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],
   [32, 2, '16']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],
     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],
    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],
   [10, 4, '5/2']),
  ('normal control 7',
   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],
     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],
   [94, 5, '94/5']),
  ('normal control 8',
   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],
     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],
   [11, 4, '11/4'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],
     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],
     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],
   [105, 4, '105/4']),
  ('regression variant: distinct exams 2',
   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],
     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],
     ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],
   [19, 4, '19/4']),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],
     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],
     ['s3', 'MATH101']],
    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [91, 3, '91/3']),
  ('normal control 7',
   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],
   [33, 1, '33']),
  ('normal control 8',
   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],
     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],
   [107, 4, '107/4'])],
 [('regression: distinct exams 1',
   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],
   [40, 2, '20']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],
     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],
   [153, 5, '153/5']),
  ('partial repair guard 3',
   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],
     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],
     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],
   [55, 5, '11']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],
     ['s5', 'MATH101'], ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],
   [56, 2, '28']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 8',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],
     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],
    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],
   [36, 4, '9'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],
     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],
   [24, 3, '8']),
  ('partial repair guard 3',
   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],
   [70, 3, '70/3']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],
     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],
   [49, 4, '49/4']),
  ('normal control 7',
   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],
     ['s1', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],
   [89, 4, '89/4']),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],
     ['s4', 'HIST140'], ['s1', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [41, 4, '41/4'])]]
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: distinct exams 1[8, 1, '8'][8, 1, '8']Passed
regression variant: distinct exams 2[28, 1, '28'][48, 1, '48']Failed
partial repair guard 3[55, 4, '55/4'][65, 4, '65/4']Failed
boundary control 4[0, 1, '0'][0, 1, '0']Passed
boundary control 5[0, 1, '0'][0, 1, '0']Passed
normal control 6[64, 4, '16'][96, 4, '24']Failed
normal control 7[48, 5, '48/5'][49, 5, '49/5']Failed
normal control 8[33, 4, '33/4'][66, 4, '33/2']Failed

SHA-256 / 7c5fd54d664b08fb1ee3b3e4d4b3077b339ef088ed4f575f6ff703661e3252e9

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(enrol, period):
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    total = 0
    for st, exs in by.items():
        ps = sorted(period[e] for e in exs)
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                d = ps[j] - ps[i]
                if 1 <= d <= 5:
                    total += 2 ** (5 - d)
    n = len(by)
    return [total, n, str(Fraction(total, n)) if n else '0']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: distinct exams 1',
   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),
  ('regression variant: distinct exams 2',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('partial repair guard 3',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],
     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],
     ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],
   [49, 5, '49/5']),
  ('normal control 8',
   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],
     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],
   [66, 4, '33/2'])],
 [('regression: distinct exams 1',
   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],
     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],
   [20, 4, '5']),
  ('regression variant: distinct exams 2',
   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],
   [30, 3, '10']),
  ('partial repair guard 3',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],
   [32, 2, '16']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],
     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],
    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],
   [10, 4, '5/2']),
  ('normal control 7',
   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],
     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],
     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],
   [94, 5, '94/5']),
  ('normal control 8',
   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],
     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],
     ['s2', 'ECON150']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],
   [11, 4, '11/4'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],
     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],
     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],
   [105, 4, '105/4']),
  ('regression variant: distinct exams 2',
   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],
     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],
     ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],
   [19, 4, '19/4']),
  ('partial repair guard 3',
   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],
   [48, 1, '48']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],
     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],
     ['s3', 'MATH101']],
    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [91, 3, '91/3']),
  ('normal control 7',
   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],
   [33, 1, '33']),
  ('normal control 8',
   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],
     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],
    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],
   [107, 4, '107/4'])],
 [('regression: distinct exams 1',
   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],
   [40, 2, '20']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],
     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],
   [153, 5, '153/5']),
  ('partial repair guard 3',
   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],
     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],
     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],
   [55, 5, '11']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],
   [16, 1, '16']),
  ('boundary control 5',
   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],
    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],
   [32, 2, '16']),
  ('normal control 6',
   [[['s1', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],
     ['s5', 'MATH101'], ['s1', 'CHEM120']],
    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],
   [56, 2, '28']),
  ('normal control 7',
   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],
     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],
     ['s4', 'BIO130']],
    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],
   [96, 4, '24']),
  ('normal control 8',
   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],
     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],
    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],
   [36, 4, '9'])],
 [('regression: distinct exams 1',
   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],
     ['s2', 'CHEM120'], ['s3', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],
   [65, 4, '65/4']),
  ('regression variant: distinct exams 2',
   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],
     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],
   [24, 3, '8']),
  ('partial repair guard 3',
   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],
   [70, 3, '70/3']),
  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),
  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),
  ('normal control 6',
   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],
     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],
    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],
   [49, 4, '49/4']),
  ('normal control 7',
   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],
     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],
     ['s1', 'PHYS110'], ['s3', 'HIST140']],
    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],
   [89, 4, '89/4']),
  ('normal control 8',
   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],
     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],
     ['s4', 'HIST140'], ['s1', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],
   [41, 4, '41/4'])]]
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: distinct exams 1[8, 1, '8'][8, 1, '8']Passed
regression variant: distinct exams 2[48, 1, '48'][48, 1, '48']Passed
partial repair guard 3[65, 4, '65/4'][65, 4, '65/4']Passed
boundary control 4[0, 1, '0'][0, 1, '0']Passed
boundary control 5[0, 1, '0'][0, 1, '0']Passed
normal control 6[96, 4, '24'][96, 4, '24']Passed
normal control 7[49, 5, '49/5'][49, 5, '49/5']Passed
normal control 8[66, 4, '33/2'][66, 4, '33/2']Passed

SHA-256 / b80f89cf8a487e249fe2266c908d7511c36b3849145cfcd2afff74bf03db0b94

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

Case digest / 35cce866a34f751bb52653367e7edba4d1d13fee2d603c769f3f88b25a52ee70