FAILURE MAP
← Case archive

FA-94501 / Exam timetabling constraints / Open access

Exam exactly 24 hours later counted in the same window · case 01

Exams at the same time on consecutive days count toward one day's load.

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

ROOT CAUSE

The window eviction test keeps a start exactly 1440 minutes earlier.

VERIFIED REPAIR

Evict starts at least 1440 minutes before the current start.

Unsuccessful approach: Adding an index guard does not change the inclusive boundary.

Case contract

sits [student, exam, start minute] (rows may repeat an exam). A student violates the limit if more than limit distinct exams start inside some half-open 24-hour window [t, t + 1440). Return [student, maximum count] for violators, by student.

Why this case matters

Maximum-exams-per-day rules are stated as rolling windows; calendar bucketing and inclusive windows both misreport.

1 / The failure

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

N = 1
observations = []
def solve(sits, limit):
    by = {}
    for st, ex, t in sits:
        by.setdefault(st, {})[ex] = t
    out = []
    for st in sorted(by):
        ts = sorted(by[st].values())
        best = 0
        j = 0
        for i in range(len(ts)):
            while ts[i] - ts[j] > 1440:
                j += 1
            best = max(best, i - j + 1)
        if best > limit:
            out.append([st, best])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: window half open 1',
   [[['s1', 'ECON150', 3419], ['s1', 'BIO130', 540], ['s3', 'ECON150', 3601], ['s3', 'MATH101H', 4861],
     ['s1', 'MATH101', 4259], ['s4', 'ECON150', 600], ['s1', 'HIST140', 7139], ['s3', 'CHEM120', 540],
     ['s3', 'HIST140', 3421], ['s3', 'PHYS110', 1981], ['s1', 'CHEM120', 1980], ['s4', 'BIO130', 2040],
     ['s1', 'HIST140', 7139]],
    1],
   [['s1', 2], ['s3', 2]]),
  ('regression variant: window half open 2',
   [[['s4', 'BIO130', 4920], ['s4', 'CHEM120', 2040], ['s4', 'MATH101H', 600], ['s4', 'HIST140', 6359],
     ['s4', 'PHYS110', 2040]],
    2],
   []),
  ('partial repair guard 3',
   [[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
     ['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
     ['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
     ['s4', 'CHEM120', 3060]],
    1],
   [['s2', 2], ['s4', 2], ['s5', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1], [['s1', 2]]),
  ('normal control 5',
   [[['s5', 'ECON150', 2700], ['s5', 'PHYS110', 7019], ['s5', 'MATH101H', 5580], ['s5', 'BIO130', 540],
     ['s5', 'CHEM120', 1980], ['s5', 'ECON150', 2700]],
    1],
   [['s5', 2]]),
  ('normal control 6',
   [[['s3', 'PHYS110', 600], ['s3', 'MATH101H', 2280], ['s3', 'HIST140', 1440], ['s3', 'MATH101', 5160]], 2],
   []),
  ('normal control 7',
   [[['s4', 'PHYS110', 4920], ['s5', 'PHYS110', 2759], ['s4', 'MATH101', 600], ['s4', 'BIO130', 2041],
     ['s4', 'ECON150', 3480], ['s5', 'ECON150', 600], ['s5', 'MATH101H', 1320]],
    1],
   [['s4', 2], ['s5', 2]]),
  ('normal control 8',
   [[['s3', 'MATH101H', 2159], ['s3', 'ECON150', 2879], ['s3', 'CHEM120', 540], ['s3', 'CHEM120', 540],
     ['s3', 'PHYS110', 720]],
    2],
   [])],
 [('regression: window half open 1',
   [[['s5', 'MATH101', 3481], ['s5', 'PHYS110', 600], ['s5', 'MATH101', 3481], ['s1', 'ECON150', 540],
     ['s5', 'BIO130', 2040], ['s1', 'BIO130', 1380], ['s5', 'MATH101H', 1860], ['s5', 'CHEM120', 600]],
    3],
   []),
  ('regression variant: window half open 2',
   [[['s1', 'HIST140', 7140], ['s4', 'PHYS110', 1981], ['s4', 'ECON150', 3421], ['s1', 'CHEM120', 1380],
     ['s4', 'HIST140', 540], ['s4', 'CHEM120', 3241], ['s1', 'PHYS110', 4260], ['s1', 'ECON150', 540]],
    2],
   []),
  ('partial repair guard 3',
   [[['s1', 'MATH101H', 3421], ['s1', 'ECON150', 1260], ['s1', 'BIO130', 1980], ['s1', 'CHEM120', 540],
     ['s1', 'ECON150', 1260]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
  ('normal control 5',
   [[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
     ['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
    2],
   []),
  ('normal control 6',
   [[['s2', 'MATH101H', 1980], ['s2', 'ECON150', 3240], ['s2', 'PHYS110', 3960], ['s2', 'MATH101', 4140],
     ['s2', 'BIO130', 540]],
    3],
   []),
  ('normal control 7',
   [[['s5', 'ECON150', 1380], ['s5', 'BIO130', 540], ['s2', 'MATH101', 5159], ['s5', 'PHYS110', 1680],
     ['s3', 'HIST140', 2761], ['s2', 'MATH101H', 1979], ['s3', 'ECON150', 3061], ['s2', 'HIST140', 540],
     ['s2', 'ECON150', 4859], ['s5', 'HIST140', 3120], ['s3', 'CHEM120', 1320], ['s2', 'PHYS110', 6598],
     ['s2', 'HIST140', 540], ['s3', 'BIO130', 600]],
    1],
   [['s2', 2], ['s3', 2], ['s5', 3]]),
  ('normal control 8',
   [[['s5', 'CHEM120', 1020], ['s5', 'HIST140', 540], ['s5', 'MATH101', 840], ['s5', 'MATH101', 840]], 3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'PHYS110', 1980], ['s3', 'CHEM120', 540], ['s2', 'BIO130', 540], ['s3', 'MATH101', 720],
     ['s2', 'BIO130', 540], ['s2', 'MATH101H', 1800], ['s3', 'ECON150', 1980], ['s2', 'MATH101', 3240]],
    2],
   [['s3', 3]]),
  ('regression variant: window half open 2',
   [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 2040], ['s1', 'MATH101', 1860],
     ['s1', 'HIST140', 4920]],
    1],
   [['s1', 2]]),
  ('partial repair guard 3',
   [[['s4', 'ECON150', 900], ['s4', 'HIST140', 2521], ['s3', 'BIO130', 2760], ['s4', 'MATH101', 600],
     ['s4', 'MATH101H', 2341], ['s3', 'MATH101', 600], ['s3', 'HIST140', 2040], ['s4', 'ECON150', 900],
     ['s3', 'ECON150', 2040], ['s3', 'CHEM120', 1320], ['s4', 'PHYS110', 3961]],
    2],
   [['s3', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
  ('normal control 5',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   []),
  ('normal control 6',
   [[['s4', 'ECON150', 2400], ['s3', 'ECON150', 540], ['s4', 'CHEM120', 2400], ['s3', 'BIO130', 2160],
     ['s1', 'MATH101H', 540], ['s3', 'HIST140', 1980], ['s1', 'BIO130', 4260], ['s1', 'PHYS110', 3420],
     ['s4', 'MATH101', 540], ['s4', 'HIST140', 1560], ['s1', 'MATH101', 5100], ['s4', 'BIO130', 1260]],
    3],
   [['s4', 4]]),
  ('normal control 7',
   [[['s4', 'PHYS110', 840], ['s3', 'PHYS110', 1800], ['s4', 'ECON150', 540], ['s4', 'ECON150', 540],
     ['s3', 'ECON150', 4680], ['s3', 'BIO130', 5520], ['s3', 'CHEM120', 540]],
    2],
   []),
  ('normal control 8',
   [[['s5', 'CHEM120', 780], ['s4', 'BIO130', 540], ['s4', 'ECON150', 1380], ['s1', 'MATH101', 600],
     ['s1', 'BIO130', 1440], ['s5', 'BIO130', 2219], ['s5', 'MATH101H', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s4', 'ECON150', 2040], ['s4', 'CHEM120', 1320], ['s4', 'MATH101', 600]], 2], []),
  ('regression variant: window half open 2',
   [[['s3', 'HIST140', 1860], ['s5', 'MATH101H', 3241], ['s1', 'CHEM120', 4921], ['s3', 'BIO130', 4741],
     ['s5', 'CHEM120', 540], ['s1', 'BIO130', 2041], ['s3', 'PHYS110', 3300], ['s5', 'MATH101', 1981],
     ['s3', 'CHEM120', 600], ['s5', 'BIO130', 3421], ['s5', 'PHYS110', 3421], ['s3', 'MATH101', 1860],
     ['s1', 'MATH101H', 600]],
    2],
   [['s3', 3], ['s5', 3]]),
  ('partial repair guard 3',
   [[['s3', 'MATH101H', 2820], ['s2', 'MATH101H', 3420], ['s3', 'BIO130', 2820], ['s2', 'PHYS110', 4140],
     ['s3', 'PHYS110', 540], ['s3', 'BIO130', 2820], ['s2', 'ECON150', 540], ['s3', 'ECON150', 1380]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
  ('normal control 5', [[['s4', 'PHYS110', 600], ['s4', 'BIO130', 1320]], 1], [['s4', 2]]),
  ('normal control 6', [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 3480]], 2], []),
  ('normal control 7',
   [[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
     ['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
     ['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
     ['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
    3],
   [['s4', 5]]),
  ('normal control 8',
   [[['s2', 'MATH101', 540], ['s5', 'ECON150', 780], ['s5', 'HIST140', 2219], ['s2', 'MATH101H', 4860],
     ['s1', 'ECON150', 540], ['s1', 'BIO130', 1980], ['s5', 'CHEM120', 2939], ['s2', 'MATH101H', 4860],
     ['s1', 'CHEM120', 4860], ['s5', 'MATH101H', 4380], ['s1', 'MATH101H', 3420], ['s2', 'PHYS110', 3420],
     ['s2', 'CHEM120', 5700], ['s5', 'PHYS110', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'BIO130', 540], ['s5', 'PHYS110', 1320], ['s4', 'BIO130', 1980], ['s3', 'PHYS110', 1380],
     ['s5', 'BIO130', 600], ['s4', 'ECON150', 540]],
    1],
   [['s3', 2], ['s5', 2]]),
  ('regression variant: window half open 2',
   [[['s1', 'BIO130', 600], ['s1', 'MATH101', 1500], ['s3', 'MATH101', 6361], ['s3', 'CHEM120', 2040],
     ['s1', 'CHEM120', 1320], ['s1', 'BIO130', 600], ['s3', 'PHYS110', 3481], ['s3', 'BIO130', 600]],
    1],
   [['s1', 3]]),
  ('partial repair guard 3',
   [[['s5', 'MATH101', 600], ['s2', 'CHEM120', 1980], ['s1', 'MATH101H', 1980], ['s5', 'PHYS110', 600],
     ['s2', 'ECON150', 1980], ['s1', 'BIO130', 540], ['s1', 'MATH101', 2700], ['s2', 'PHYS110', 540]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
  ('normal control 5',
   [[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
     ['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
     ['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
     ['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
    3],
   []),
  ('normal control 6',
   [[['s3', 'BIO130', 2040], ['s5', 'HIST140', 3480], ['s5', 'MATH101', 5279], ['s5', 'MATH101H', 600],
     ['s3', 'ECON150', 600], ['s5', 'BIO130', 4919], ['s3', 'HIST140', 1320], ['s5', 'PHYS110', 5099]],
    2],
   [['s5', 3]]),
  ('normal control 7',
   [[['s1', 'CHEM120', 540], ['s4', 'PHYS110', 2100], ['s3', 'MATH101', 600], ['s3', 'CHEM120', 1320],
     ['s1', 'ECON150', 1979], ['s1', 'MATH101', 4980], ['s1', 'MATH101H', 4680], ['s1', 'PHYS110', 3239],
     ['s4', 'CHEM120', 1260], ['s4', 'HIST140', 540]],
    2],
   []),
  ('normal control 8',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   [])]]
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: window half open 1[['s1', 2], ['s3', 3], ['s4', 2]][['s1', 2], ['s3', 2]]Failed
regression variant: window half open 2[['s4', 3]][]Failed
partial repair guard 3[['s2', 2], ['s4', 2], ['s5', 4]][['s2', 2], ['s4', 2], ['s5', 3]]Failed
boundary control 4[['s1', 2]][['s1', 2]]Passed
normal control 5[['s5', 2]][['s5', 2]]Passed
normal control 6[][]Passed
normal control 7[['s4', 2], ['s5', 2]][['s4', 2], ['s5', 2]]Passed
normal control 8[][]Passed

SHA-256 / dd402a38e28fec6df8da51c88521a9811950b736a5301dba688649ec521ecc64

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(sits, limit):
    by = {}
    for st, ex, t in sits:
        by.setdefault(st, {})[ex] = t
    out = []
    for st in sorted(by):
        ts = sorted(by[st].values())
        best = 0
        j = 0
        for i in range(len(ts)):
            while j < i and ts[i] - ts[j] > 1440:
                j += 1
            best = max(best, i - j + 1)
        if best > limit:
            out.append([st, best])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: window half open 1',
   [[['s1', 'ECON150', 3419], ['s1', 'BIO130', 540], ['s3', 'ECON150', 3601], ['s3', 'MATH101H', 4861],
     ['s1', 'MATH101', 4259], ['s4', 'ECON150', 600], ['s1', 'HIST140', 7139], ['s3', 'CHEM120', 540],
     ['s3', 'HIST140', 3421], ['s3', 'PHYS110', 1981], ['s1', 'CHEM120', 1980], ['s4', 'BIO130', 2040],
     ['s1', 'HIST140', 7139]],
    1],
   [['s1', 2], ['s3', 2]]),
  ('regression variant: window half open 2',
   [[['s4', 'BIO130', 4920], ['s4', 'CHEM120', 2040], ['s4', 'MATH101H', 600], ['s4', 'HIST140', 6359],
     ['s4', 'PHYS110', 2040]],
    2],
   []),
  ('partial repair guard 3',
   [[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
     ['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
     ['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
     ['s4', 'CHEM120', 3060]],
    1],
   [['s2', 2], ['s4', 2], ['s5', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1], [['s1', 2]]),
  ('normal control 5',
   [[['s5', 'ECON150', 2700], ['s5', 'PHYS110', 7019], ['s5', 'MATH101H', 5580], ['s5', 'BIO130', 540],
     ['s5', 'CHEM120', 1980], ['s5', 'ECON150', 2700]],
    1],
   [['s5', 2]]),
  ('normal control 6',
   [[['s3', 'PHYS110', 600], ['s3', 'MATH101H', 2280], ['s3', 'HIST140', 1440], ['s3', 'MATH101', 5160]], 2],
   []),
  ('normal control 7',
   [[['s4', 'PHYS110', 4920], ['s5', 'PHYS110', 2759], ['s4', 'MATH101', 600], ['s4', 'BIO130', 2041],
     ['s4', 'ECON150', 3480], ['s5', 'ECON150', 600], ['s5', 'MATH101H', 1320]],
    1],
   [['s4', 2], ['s5', 2]]),
  ('normal control 8',
   [[['s3', 'MATH101H', 2159], ['s3', 'ECON150', 2879], ['s3', 'CHEM120', 540], ['s3', 'CHEM120', 540],
     ['s3', 'PHYS110', 720]],
    2],
   [])],
 [('regression: window half open 1',
   [[['s5', 'MATH101', 3481], ['s5', 'PHYS110', 600], ['s5', 'MATH101', 3481], ['s1', 'ECON150', 540],
     ['s5', 'BIO130', 2040], ['s1', 'BIO130', 1380], ['s5', 'MATH101H', 1860], ['s5', 'CHEM120', 600]],
    3],
   []),
  ('regression variant: window half open 2',
   [[['s1', 'HIST140', 7140], ['s4', 'PHYS110', 1981], ['s4', 'ECON150', 3421], ['s1', 'CHEM120', 1380],
     ['s4', 'HIST140', 540], ['s4', 'CHEM120', 3241], ['s1', 'PHYS110', 4260], ['s1', 'ECON150', 540]],
    2],
   []),
  ('partial repair guard 3',
   [[['s1', 'MATH101H', 3421], ['s1', 'ECON150', 1260], ['s1', 'BIO130', 1980], ['s1', 'CHEM120', 540],
     ['s1', 'ECON150', 1260]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
  ('normal control 5',
   [[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
     ['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
    2],
   []),
  ('normal control 6',
   [[['s2', 'MATH101H', 1980], ['s2', 'ECON150', 3240], ['s2', 'PHYS110', 3960], ['s2', 'MATH101', 4140],
     ['s2', 'BIO130', 540]],
    3],
   []),
  ('normal control 7',
   [[['s5', 'ECON150', 1380], ['s5', 'BIO130', 540], ['s2', 'MATH101', 5159], ['s5', 'PHYS110', 1680],
     ['s3', 'HIST140', 2761], ['s2', 'MATH101H', 1979], ['s3', 'ECON150', 3061], ['s2', 'HIST140', 540],
     ['s2', 'ECON150', 4859], ['s5', 'HIST140', 3120], ['s3', 'CHEM120', 1320], ['s2', 'PHYS110', 6598],
     ['s2', 'HIST140', 540], ['s3', 'BIO130', 600]],
    1],
   [['s2', 2], ['s3', 2], ['s5', 3]]),
  ('normal control 8',
   [[['s5', 'CHEM120', 1020], ['s5', 'HIST140', 540], ['s5', 'MATH101', 840], ['s5', 'MATH101', 840]], 3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'PHYS110', 1980], ['s3', 'CHEM120', 540], ['s2', 'BIO130', 540], ['s3', 'MATH101', 720],
     ['s2', 'BIO130', 540], ['s2', 'MATH101H', 1800], ['s3', 'ECON150', 1980], ['s2', 'MATH101', 3240]],
    2],
   [['s3', 3]]),
  ('regression variant: window half open 2',
   [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 2040], ['s1', 'MATH101', 1860],
     ['s1', 'HIST140', 4920]],
    1],
   [['s1', 2]]),
  ('partial repair guard 3',
   [[['s4', 'ECON150', 900], ['s4', 'HIST140', 2521], ['s3', 'BIO130', 2760], ['s4', 'MATH101', 600],
     ['s4', 'MATH101H', 2341], ['s3', 'MATH101', 600], ['s3', 'HIST140', 2040], ['s4', 'ECON150', 900],
     ['s3', 'ECON150', 2040], ['s3', 'CHEM120', 1320], ['s4', 'PHYS110', 3961]],
    2],
   [['s3', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
  ('normal control 5',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   []),
  ('normal control 6',
   [[['s4', 'ECON150', 2400], ['s3', 'ECON150', 540], ['s4', 'CHEM120', 2400], ['s3', 'BIO130', 2160],
     ['s1', 'MATH101H', 540], ['s3', 'HIST140', 1980], ['s1', 'BIO130', 4260], ['s1', 'PHYS110', 3420],
     ['s4', 'MATH101', 540], ['s4', 'HIST140', 1560], ['s1', 'MATH101', 5100], ['s4', 'BIO130', 1260]],
    3],
   [['s4', 4]]),
  ('normal control 7',
   [[['s4', 'PHYS110', 840], ['s3', 'PHYS110', 1800], ['s4', 'ECON150', 540], ['s4', 'ECON150', 540],
     ['s3', 'ECON150', 4680], ['s3', 'BIO130', 5520], ['s3', 'CHEM120', 540]],
    2],
   []),
  ('normal control 8',
   [[['s5', 'CHEM120', 780], ['s4', 'BIO130', 540], ['s4', 'ECON150', 1380], ['s1', 'MATH101', 600],
     ['s1', 'BIO130', 1440], ['s5', 'BIO130', 2219], ['s5', 'MATH101H', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s4', 'ECON150', 2040], ['s4', 'CHEM120', 1320], ['s4', 'MATH101', 600]], 2], []),
  ('regression variant: window half open 2',
   [[['s3', 'HIST140', 1860], ['s5', 'MATH101H', 3241], ['s1', 'CHEM120', 4921], ['s3', 'BIO130', 4741],
     ['s5', 'CHEM120', 540], ['s1', 'BIO130', 2041], ['s3', 'PHYS110', 3300], ['s5', 'MATH101', 1981],
     ['s3', 'CHEM120', 600], ['s5', 'BIO130', 3421], ['s5', 'PHYS110', 3421], ['s3', 'MATH101', 1860],
     ['s1', 'MATH101H', 600]],
    2],
   [['s3', 3], ['s5', 3]]),
  ('partial repair guard 3',
   [[['s3', 'MATH101H', 2820], ['s2', 'MATH101H', 3420], ['s3', 'BIO130', 2820], ['s2', 'PHYS110', 4140],
     ['s3', 'PHYS110', 540], ['s3', 'BIO130', 2820], ['s2', 'ECON150', 540], ['s3', 'ECON150', 1380]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
  ('normal control 5', [[['s4', 'PHYS110', 600], ['s4', 'BIO130', 1320]], 1], [['s4', 2]]),
  ('normal control 6', [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 3480]], 2], []),
  ('normal control 7',
   [[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
     ['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
     ['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
     ['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
    3],
   [['s4', 5]]),
  ('normal control 8',
   [[['s2', 'MATH101', 540], ['s5', 'ECON150', 780], ['s5', 'HIST140', 2219], ['s2', 'MATH101H', 4860],
     ['s1', 'ECON150', 540], ['s1', 'BIO130', 1980], ['s5', 'CHEM120', 2939], ['s2', 'MATH101H', 4860],
     ['s1', 'CHEM120', 4860], ['s5', 'MATH101H', 4380], ['s1', 'MATH101H', 3420], ['s2', 'PHYS110', 3420],
     ['s2', 'CHEM120', 5700], ['s5', 'PHYS110', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'BIO130', 540], ['s5', 'PHYS110', 1320], ['s4', 'BIO130', 1980], ['s3', 'PHYS110', 1380],
     ['s5', 'BIO130', 600], ['s4', 'ECON150', 540]],
    1],
   [['s3', 2], ['s5', 2]]),
  ('regression variant: window half open 2',
   [[['s1', 'BIO130', 600], ['s1', 'MATH101', 1500], ['s3', 'MATH101', 6361], ['s3', 'CHEM120', 2040],
     ['s1', 'CHEM120', 1320], ['s1', 'BIO130', 600], ['s3', 'PHYS110', 3481], ['s3', 'BIO130', 600]],
    1],
   [['s1', 3]]),
  ('partial repair guard 3',
   [[['s5', 'MATH101', 600], ['s2', 'CHEM120', 1980], ['s1', 'MATH101H', 1980], ['s5', 'PHYS110', 600],
     ['s2', 'ECON150', 1980], ['s1', 'BIO130', 540], ['s1', 'MATH101', 2700], ['s2', 'PHYS110', 540]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
  ('normal control 5',
   [[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
     ['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
     ['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
     ['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
    3],
   []),
  ('normal control 6',
   [[['s3', 'BIO130', 2040], ['s5', 'HIST140', 3480], ['s5', 'MATH101', 5279], ['s5', 'MATH101H', 600],
     ['s3', 'ECON150', 600], ['s5', 'BIO130', 4919], ['s3', 'HIST140', 1320], ['s5', 'PHYS110', 5099]],
    2],
   [['s5', 3]]),
  ('normal control 7',
   [[['s1', 'CHEM120', 540], ['s4', 'PHYS110', 2100], ['s3', 'MATH101', 600], ['s3', 'CHEM120', 1320],
     ['s1', 'ECON150', 1979], ['s1', 'MATH101', 4980], ['s1', 'MATH101H', 4680], ['s1', 'PHYS110', 3239],
     ['s4', 'CHEM120', 1260], ['s4', 'HIST140', 540]],
    2],
   []),
  ('normal control 8',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   [])]]
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: window half open 1[['s1', 2], ['s3', 3], ['s4', 2]][['s1', 2], ['s3', 2]]Failed
regression variant: window half open 2[['s4', 3]][]Failed
partial repair guard 3[['s2', 2], ['s4', 2], ['s5', 4]][['s2', 2], ['s4', 2], ['s5', 3]]Failed
boundary control 4[['s1', 2]][['s1', 2]]Passed
normal control 5[['s5', 2]][['s5', 2]]Passed
normal control 6[][]Passed
normal control 7[['s4', 2], ['s5', 2]][['s4', 2], ['s5', 2]]Passed
normal control 8[][]Passed

SHA-256 / b875cd88ec2206b483ccf8c294603b4e7e380d7f45e9db1eff882b06c30ed5b9

3 / The verified repair

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

N = 1
observations = []
def solve(sits, limit):
    by = {}
    for st, ex, t in sits:
        by.setdefault(st, {})[ex] = t
    out = []
    for st in sorted(by):
        ts = sorted(by[st].values())
        best = 0
        j = 0
        for i in range(len(ts)):
            while ts[i] - ts[j] >= 1440:
                j += 1
            best = max(best, i - j + 1)
        if best > limit:
            out.append([st, best])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: window half open 1',
   [[['s1', 'ECON150', 3419], ['s1', 'BIO130', 540], ['s3', 'ECON150', 3601], ['s3', 'MATH101H', 4861],
     ['s1', 'MATH101', 4259], ['s4', 'ECON150', 600], ['s1', 'HIST140', 7139], ['s3', 'CHEM120', 540],
     ['s3', 'HIST140', 3421], ['s3', 'PHYS110', 1981], ['s1', 'CHEM120', 1980], ['s4', 'BIO130', 2040],
     ['s1', 'HIST140', 7139]],
    1],
   [['s1', 2], ['s3', 2]]),
  ('regression variant: window half open 2',
   [[['s4', 'BIO130', 4920], ['s4', 'CHEM120', 2040], ['s4', 'MATH101H', 600], ['s4', 'HIST140', 6359],
     ['s4', 'PHYS110', 2040]],
    2],
   []),
  ('partial repair guard 3',
   [[['s4', 'PHYS110', 1800], ['s2', 'HIST140', 1860], ['s5', 'MATH101', 3240], ['s2', 'ECON150', 600],
     ['s5', 'HIST140', 3240], ['s2', 'CHEM120', 2160], ['s5', 'MATH101H', 1800], ['s5', 'CHEM120', 1800],
     ['s4', 'BIO130', 540], ['s2', 'BIO130', 3420], ['s5', 'BIO130', 540], ['s4', 'CHEM120', 3060],
     ['s4', 'CHEM120', 3060]],
    1],
   [['s2', 2], ['s4', 2], ['s5', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'A', 600], ['s1', 'B', 900]], 1], [['s1', 2]]),
  ('normal control 5',
   [[['s5', 'ECON150', 2700], ['s5', 'PHYS110', 7019], ['s5', 'MATH101H', 5580], ['s5', 'BIO130', 540],
     ['s5', 'CHEM120', 1980], ['s5', 'ECON150', 2700]],
    1],
   [['s5', 2]]),
  ('normal control 6',
   [[['s3', 'PHYS110', 600], ['s3', 'MATH101H', 2280], ['s3', 'HIST140', 1440], ['s3', 'MATH101', 5160]], 2],
   []),
  ('normal control 7',
   [[['s4', 'PHYS110', 4920], ['s5', 'PHYS110', 2759], ['s4', 'MATH101', 600], ['s4', 'BIO130', 2041],
     ['s4', 'ECON150', 3480], ['s5', 'ECON150', 600], ['s5', 'MATH101H', 1320]],
    1],
   [['s4', 2], ['s5', 2]]),
  ('normal control 8',
   [[['s3', 'MATH101H', 2159], ['s3', 'ECON150', 2879], ['s3', 'CHEM120', 540], ['s3', 'CHEM120', 540],
     ['s3', 'PHYS110', 720]],
    2],
   [])],
 [('regression: window half open 1',
   [[['s5', 'MATH101', 3481], ['s5', 'PHYS110', 600], ['s5', 'MATH101', 3481], ['s1', 'ECON150', 540],
     ['s5', 'BIO130', 2040], ['s1', 'BIO130', 1380], ['s5', 'MATH101H', 1860], ['s5', 'CHEM120', 600]],
    3],
   []),
  ('regression variant: window half open 2',
   [[['s1', 'HIST140', 7140], ['s4', 'PHYS110', 1981], ['s4', 'ECON150', 3421], ['s1', 'CHEM120', 1380],
     ['s4', 'HIST140', 540], ['s4', 'CHEM120', 3241], ['s1', 'PHYS110', 4260], ['s1', 'ECON150', 540]],
    2],
   []),
  ('partial repair guard 3',
   [[['s1', 'MATH101H', 3421], ['s1', 'ECON150', 1260], ['s1', 'BIO130', 1980], ['s1', 'CHEM120', 540],
     ['s1', 'ECON150', 1260]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1979], ['s1', 'C', 1990]], 2], []),
  ('normal control 5',
   [[['s2', 'MATH101', 4259], ['s2', 'ECON150', 540], ['s5', 'BIO130', 2760], ['s2', 'CHEM120', 1979],
     ['s2', 'BIO130', 5700], ['s5', 'CHEM120', 600], ['s5', 'MATH101H', 1320], ['s2', 'MATH101H', 2819]],
    2],
   []),
  ('normal control 6',
   [[['s2', 'MATH101H', 1980], ['s2', 'ECON150', 3240], ['s2', 'PHYS110', 3960], ['s2', 'MATH101', 4140],
     ['s2', 'BIO130', 540]],
    3],
   []),
  ('normal control 7',
   [[['s5', 'ECON150', 1380], ['s5', 'BIO130', 540], ['s2', 'MATH101', 5159], ['s5', 'PHYS110', 1680],
     ['s3', 'HIST140', 2761], ['s2', 'MATH101H', 1979], ['s3', 'ECON150', 3061], ['s2', 'HIST140', 540],
     ['s2', 'ECON150', 4859], ['s5', 'HIST140', 3120], ['s3', 'CHEM120', 1320], ['s2', 'PHYS110', 6598],
     ['s2', 'HIST140', 540], ['s3', 'BIO130', 600]],
    1],
   [['s2', 2], ['s3', 2], ['s5', 3]]),
  ('normal control 8',
   [[['s5', 'CHEM120', 1020], ['s5', 'HIST140', 540], ['s5', 'MATH101', 840], ['s5', 'MATH101', 840]], 3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'PHYS110', 1980], ['s3', 'CHEM120', 540], ['s2', 'BIO130', 540], ['s3', 'MATH101', 720],
     ['s2', 'BIO130', 540], ['s2', 'MATH101H', 1800], ['s3', 'ECON150', 1980], ['s2', 'MATH101', 3240]],
    2],
   [['s3', 3]]),
  ('regression variant: window half open 2',
   [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 2040], ['s1', 'MATH101', 1860],
     ['s1', 'HIST140', 4920]],
    1],
   [['s1', 2]]),
  ('partial repair guard 3',
   [[['s4', 'ECON150', 900], ['s4', 'HIST140', 2521], ['s3', 'BIO130', 2760], ['s4', 'MATH101', 600],
     ['s4', 'MATH101H', 2341], ['s3', 'MATH101', 600], ['s3', 'HIST140', 2040], ['s4', 'ECON150', 900],
     ['s3', 'ECON150', 2040], ['s3', 'CHEM120', 1320], ['s4', 'PHYS110', 3961]],
    2],
   [['s3', 3]]),
  ('boundary control 4', [[['s1', 'A', 600], ['s1', 'B', 600], ['s1', 'C', 900]], 2], [['s1', 3]]),
  ('normal control 5',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   []),
  ('normal control 6',
   [[['s4', 'ECON150', 2400], ['s3', 'ECON150', 540], ['s4', 'CHEM120', 2400], ['s3', 'BIO130', 2160],
     ['s1', 'MATH101H', 540], ['s3', 'HIST140', 1980], ['s1', 'BIO130', 4260], ['s1', 'PHYS110', 3420],
     ['s4', 'MATH101', 540], ['s4', 'HIST140', 1560], ['s1', 'MATH101', 5100], ['s4', 'BIO130', 1260]],
    3],
   [['s4', 4]]),
  ('normal control 7',
   [[['s4', 'PHYS110', 840], ['s3', 'PHYS110', 1800], ['s4', 'ECON150', 540], ['s4', 'ECON150', 540],
     ['s3', 'ECON150', 4680], ['s3', 'BIO130', 5520], ['s3', 'CHEM120', 540]],
    2],
   []),
  ('normal control 8',
   [[['s5', 'CHEM120', 780], ['s4', 'BIO130', 540], ['s4', 'ECON150', 1380], ['s1', 'MATH101', 600],
     ['s1', 'BIO130', 1440], ['s5', 'BIO130', 2219], ['s5', 'MATH101H', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s4', 'ECON150', 2040], ['s4', 'CHEM120', 1320], ['s4', 'MATH101', 600]], 2], []),
  ('regression variant: window half open 2',
   [[['s3', 'HIST140', 1860], ['s5', 'MATH101H', 3241], ['s1', 'CHEM120', 4921], ['s3', 'BIO130', 4741],
     ['s5', 'CHEM120', 540], ['s1', 'BIO130', 2041], ['s3', 'PHYS110', 3300], ['s5', 'MATH101', 1981],
     ['s3', 'CHEM120', 600], ['s5', 'BIO130', 3421], ['s5', 'PHYS110', 3421], ['s3', 'MATH101', 1860],
     ['s1', 'MATH101H', 600]],
    2],
   [['s3', 3], ['s5', 3]]),
  ('partial repair guard 3',
   [[['s3', 'MATH101H', 2820], ['s2', 'MATH101H', 3420], ['s3', 'BIO130', 2820], ['s2', 'PHYS110', 4140],
     ['s3', 'PHYS110', 540], ['s3', 'BIO130', 2820], ['s2', 'ECON150', 540], ['s3', 'ECON150', 1380]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 1300], ['s1', 'B', 1500], ['s1', 'C', 1600]], 2], [['s1', 3]]),
  ('normal control 5', [[['s4', 'PHYS110', 600], ['s4', 'BIO130', 1320]], 1], [['s4', 2]]),
  ('normal control 6', [[['s1', 'ECON150', 600], ['s1', 'ECON150', 600], ['s1', 'MATH101H', 3480]], 2], []),
  ('normal control 7',
   [[['s1', 'MATH101', 600], ['s4', 'ECON150', 540], ['s1', 'HIST140', 2760], ['s1', 'BIO130', 1320],
     ['s4', 'HIST140', 540], ['s1', 'CHEM120', 4200], ['s4', 'MATH101H', 1560], ['s4', 'PHYS110', 840],
     ['s4', 'CHEM120', 840], ['s3', 'HIST140', 540], ['s3', 'MATH101H', 3240], ['s3', 'PHYS110', 1980],
     ['s3', 'BIO130', 1800], ['s1', 'ECON150', 3480]],
    3],
   [['s4', 5]]),
  ('normal control 8',
   [[['s2', 'MATH101', 540], ['s5', 'ECON150', 780], ['s5', 'HIST140', 2219], ['s2', 'MATH101H', 4860],
     ['s1', 'ECON150', 540], ['s1', 'BIO130', 1980], ['s5', 'CHEM120', 2939], ['s2', 'MATH101H', 4860],
     ['s1', 'CHEM120', 4860], ['s5', 'MATH101H', 4380], ['s1', 'MATH101H', 3420], ['s2', 'PHYS110', 3420],
     ['s2', 'CHEM120', 5700], ['s5', 'PHYS110', 600]],
    3],
   [])],
 [('regression: window half open 1',
   [[['s3', 'BIO130', 540], ['s5', 'PHYS110', 1320], ['s4', 'BIO130', 1980], ['s3', 'PHYS110', 1380],
     ['s5', 'BIO130', 600], ['s4', 'ECON150', 540]],
    1],
   [['s3', 2], ['s5', 2]]),
  ('regression variant: window half open 2',
   [[['s1', 'BIO130', 600], ['s1', 'MATH101', 1500], ['s3', 'MATH101', 6361], ['s3', 'CHEM120', 2040],
     ['s1', 'CHEM120', 1320], ['s1', 'BIO130', 600], ['s3', 'PHYS110', 3481], ['s3', 'BIO130', 600]],
    1],
   [['s1', 3]]),
  ('partial repair guard 3',
   [[['s5', 'MATH101', 600], ['s2', 'CHEM120', 1980], ['s1', 'MATH101H', 1980], ['s5', 'PHYS110', 600],
     ['s2', 'ECON150', 1980], ['s1', 'BIO130', 540], ['s1', 'MATH101', 2700], ['s2', 'PHYS110', 540]],
    2],
   []),
  ('boundary control 4', [[['s1', 'A', 540], ['s1', 'B', 1980], ['s1', 'C', 2000]], 2], []),
  ('normal control 5',
   [[['s5', 'PHYS110', 6181], ['s5', 'MATH101', 600], ['s2', 'MATH101H', 540], ['s2', 'ECON150', 4680],
     ['s4', 'MATH101', 5099], ['s5', 'ECON150', 2041], ['s2', 'MATH101', 3420], ['s4', 'ECON150', 3660],
     ['s4', 'MATH101H', 6540], ['s5', 'BIO130', 4921], ['s4', 'PHYS110', 3480], ['s5', 'CHEM120', 2041],
     ['s4', 'CHEM120', 600], ['s2', 'HIST140', 6420], ['s2', 'CHEM120', 6120]],
    3],
   []),
  ('normal control 6',
   [[['s3', 'BIO130', 2040], ['s5', 'HIST140', 3480], ['s5', 'MATH101', 5279], ['s5', 'MATH101H', 600],
     ['s3', 'ECON150', 600], ['s5', 'BIO130', 4919], ['s3', 'HIST140', 1320], ['s5', 'PHYS110', 5099]],
    2],
   [['s5', 3]]),
  ('normal control 7',
   [[['s1', 'CHEM120', 540], ['s4', 'PHYS110', 2100], ['s3', 'MATH101', 600], ['s3', 'CHEM120', 1320],
     ['s1', 'ECON150', 1979], ['s1', 'MATH101', 4980], ['s1', 'MATH101H', 4680], ['s1', 'PHYS110', 3239],
     ['s4', 'CHEM120', 1260], ['s4', 'HIST140', 540]],
    2],
   []),
  ('normal control 8',
   [[['s3', 'HIST140', 2039], ['s3', 'BIO130', 600], ['s3', 'HIST140', 2039], ['s3', 'MATH101', 3299]], 2],
   [])]]
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: window half open 1[['s1', 2], ['s3', 2]][['s1', 2], ['s3', 2]]Passed
regression variant: window half open 2[][]Passed
partial repair guard 3[['s2', 2], ['s4', 2], ['s5', 3]][['s2', 2], ['s4', 2], ['s5', 3]]Passed
boundary control 4[['s1', 2]][['s1', 2]]Passed
normal control 5[['s5', 2]][['s5', 2]]Passed
normal control 6[][]Passed
normal control 7[['s4', 2], ['s5', 2]][['s4', 2], ['s5', 2]]Passed
normal control 8[][]Passed

SHA-256 / 53b4145ad9cf961dfa35a4fc91f03d945987fe7eb1ff9ed125373ec2b0374dfa

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

Case digest / ee61157fb9e19f6dfcf248bffde54490fdc8deb62368436fae196b6fd8ce6afc