FAILURE MAP
← Case archive

FA-94606 / Exam timetabling constraints / Open access

Travel time found only in the stored direction · case 01

Travelling south-to-north needs no time because only north|south is stored.

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

ROOT CAUSE

The travel table is looked up in one direction only.

VERIFIED REPAIR

Look up both orderings of the campus pair.

Unsuccessful approach: Looking up only the reverse direction fails the other way.

Case contract

sits [student, exam, start, end], campus exam -> campus, travel "X|Y" -> minutes stored in either order. For each student's consecutive sittings by start, the needed gap is the travel time between different campuses (0 for the same campus); if the gap from previous end to next start is smaller, report [student, previous exam, next exam, shortfall].

Why this case matters

Multi-campus exam timetables must leave travel time between a student's consecutive sittings.

1 / The failure

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

N = 1
observations = []
def solve(sits, campus, travel):
    by = {}
    for st, ex, s, e in sits:
        by.setdefault(st, []).append((s, e, ex))
    out = []
    for st in sorted(by):
        seq = sorted(by[st])
        for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
            gap = s2 - e1
            c1, c2 = campus[x1], campus[x2]
            need = 0
            if c1 != c2:
                need = travel.get(c1 + '|' + c2, 0)
            if gap < need:
                out.append([st, x1, x2, need - gap])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: symmetric travel lookup 1',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'CHEM120', 869, 989], ['s4', 'HIST140', 600, 660], ['s4', 'BIO130', 750, 840],
     ['s4', 'PHYS110', 1019, 1139]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]),
  ('partial repair guard 3',
   [[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
     ['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s3', 'CHEM120', 900, 990], ['s4', 'MATH101', 630, 720], ['s4', 'BIO130', 540, 660],
     ['s3', 'PHYS110', 780, 840], ['s3', 'BIO130', 645, 735], ['s3', 'ECON150', 540, 630]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]),
  ('normal control 7',
   [[['s3', 'BIO130', 600, 720], ['s1', 'MATH101H', 540, 600], ['s1', 'MATH101', 720, 780],
     ['s1', 'BIO130', 570, 690], ['s3', 'CHEM120', 780, 870]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'BIO130', 75]]),
  ('normal control 8',
   [[['s2', 'PHYS110', 631, 721], ['s2', 'BIO130', 540, 600], ['s2', 'CHEM120', 781, 901],
     ['s2', 'MATH101H', 901, 991]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [])],
 [('regression: symmetric travel lookup 1',
   [[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
     ['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
     ['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'MATH101', 600, 660], ['s4', 'HIST140', 705, 795], ['s1', 'CHEM120', 660, 720],
     ['s3', 'BIO130', 600, 720], ['s3', 'PHYS110', 750, 810], ['s4', 'ECON150', 765, 885],
     ['s3', 'ECON150', 780, 900], ['s1', 'BIO130', 600, 660], ['s1', 'ECON150', 735, 795]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'CHEM120', 'ECON150', 15], ['s3', 'PHYS110', 'ECON150', 75], ['s4', 'HIST140', 'ECON150', 60]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 540, 660], ['s1', 'MATH101H', 719, 839], ['s1', 'HIST140', 689, 749],
     ['s4', 'ECON150', 870, 930], ['s4', 'HIST140', 600, 690], ['s4', 'CHEM120', 735, 855],
     ['s2', 'MATH101H', 660, 750], ['s2', 'MATH101', 720, 810], ['s4', 'BIO130', 930, 1020],
     ['s1', 'MATH101', 540, 660]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'HIST140', 'MATH101H', 60], ['s2', 'BIO130', 'MATH101H', 30], ['s2', 'MATH101H', 'MATH101', 75],
    ['s4', 'ECON150', 'BIO130', 30]]),
  ('boundary control 4', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('boundary control 5',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('normal control 6',
   [[['s2', 'ECON150', 540, 660], ['s5', 'MATH101', 600, 660], ['s3', 'PHYS110', 600, 690],
     ['s2', 'BIO130', 720, 810], ['s3', 'CHEM120', 719, 809], ['s5', 'HIST140', 824, 944],
     ['s5', 'MATH101H', 689, 779]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'MATH101H', 'HIST140', 15]]),
  ('normal control 7',
   [[['s5', 'HIST140', 780, 900], ['s4', 'BIO130', 690, 780], ['s5', 'MATH101H', 540, 600],
     ['s3', 'CHEM120', 645, 705], ['s5', 'PHYS110', 900, 1020], ['s3', 'HIST140', 540, 600],
     ['s4', 'ECON150', 600, 720], ['s5', 'CHEM120', 690, 810]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'ECON150', 'BIO130', 30], ['s5', 'CHEM120', 'HIST140', 30], ['s5', 'HIST140', 'PHYS110', 45]]),
  ('normal control 8',
   [[['s4', 'MATH101H', 540, 600], ['s5', 'HIST140', 750, 840], ['s5', 'ECON150', 600, 720],
     ['s5', 'MATH101H', 990, 1110], ['s4', 'HIST140', 570, 690], ['s5', 'PHYS110', 870, 990],
     ['s3', 'PHYS110', 540, 630], ['s3', 'BIO130', 660, 780], ['s3', 'ECON150', 840, 900]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s4', 'MATH101H', 'HIST140', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
     ['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
     ['s1', 'HIST140', 600, 720]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'ECON150', 689, 749], ['s3', 'MATH101H', 600, 660], ['s3', 'MATH101', 749, 839]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'MATH101H', 'ECON150', 31], ['s3', 'ECON150', 'MATH101', 60]]),
  ('partial repair guard 3',
   [[['s2', 'HIST140', 630, 690], ['s2', 'CHEM120', 600, 660], ['s2', 'BIO130', 719, 809]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'CHEM120', 'HIST140', 30], ['s2', 'HIST140', 'BIO130', 1]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('normal control 6',
   [[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'PHYS110', 'BIO130', 30]]),
  ('normal control 7',
   [[['s2', 'CHEM120', 780, 900], ['s5', 'ECON150', 600, 660], ['s2', 'PHYS110', 540, 660],
     ['s1', 'CHEM120', 1019, 1079], ['s2', 'MATH101H', 930, 1050], ['s1', 'MATH101H', 780, 900],
     ['s5', 'BIO130', 689, 779], ['s2', 'BIO130', 660, 720], ['s1', 'ECON150', 930, 990],
     ['s1', 'HIST140', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'ECON150', 'CHEM120', 16], ['s2', 'PHYS110', 'BIO130', 45], ['s5', 'ECON150', 'BIO130', 16]]),
  ('normal control 8',
   [[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
     ['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
     ['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
     ['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
     ['s2', 'MATH101', 540, 600]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'CHEM120', 781, 901], ['s1', 'BIO130', 689, 809], ['s5', 'HIST140', 600, 660],
     ['s3', 'ECON150', 661, 721], ['s1', 'PHYS110', 600, 660], ['s3', 'HIST140', 540, 630],
     ['s5', 'MATH101', 900, 1020], ['s3', 'BIO130', 691, 751], ['s5', 'MATH101H', 720, 840]],
    {'MATH101': 'north',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 75], ['s3', 'BIO130', 'CHEM120', 15]]),
  ('partial repair guard 3',
   [[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
     ['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
     ['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
     ['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('normal control 6',
   [[['s4', 'ECON150', 540, 660], ['s1', 'PHYS110', 765, 855], ['s4', 'MATH101', 765, 825],
     ['s1', 'MATH101', 600, 660], ['s4', 'HIST140', 630, 720], ['s1', 'CHEM120', 705, 765]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s4', 'ECON150', 'HIST140', 60]]),
  ('normal control 7',
   [[['s1', 'MATH101H', 600, 690], ['s1', 'HIST140', 705, 765]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s5', 'MATH101H', 600, 720], ['s1', 'BIO130', 540, 600], ['s5', 'ECON150', 540, 630],
     ['s1', 'MATH101H', 690, 810], ['s3', 'MATH101', 765, 885], ['s3', 'MATH101H', 975, 1095],
     ['s3', 'HIST140', 1185, 1275], ['s5', 'BIO130', 900, 990], ['s3', 'CHEM120', 600, 720],
     ['s1', 'HIST140', 810, 900], ['s5', 'CHEM120', 735, 855], ['s1', 'MATH101', 990, 1110]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'HIST140', 45], ['s5', 'ECON150', 'MATH101H', 30],
    ['s5', 'MATH101H', 'CHEM120', 45]])],
 [('regression: symmetric travel lookup 1',
   [[['s5', 'MATH101', 750, 870], ['s2', 'ECON150', 690, 780], ['s5', 'CHEM120', 540, 660],
     ['s5', 'ECON150', 630, 750], ['s2', 'MATH101', 540, 660], ['s5', 'PHYS110', 960, 1020]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'ECON150', 30], ['s5', 'CHEM120', 'ECON150', 90], ['s5', 'ECON150', 'MATH101', 60]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s1', 'PHYS110', 944, 1034], ['s5', 'HIST140', 540, 600], ['s5', 'CHEM120', 796, 916],
     ['s1', 'MATH101H', 824, 944], ['s5', 'PHYS110', 631, 691], ['s5', 'MATH101', 736, 826],
     ['s3', 'HIST140', 540, 660], ['s1', 'MATH101', 600, 660], ['s1', 'ECON150', 689, 809],
     ['s3', 'MATH101', 856, 946], ['s3', 'BIO130', 691, 811], ['s3', 'ECON150', 991, 1051]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101', 'ECON150', 1], ['s1', 'ECON150', 'MATH101H', 15], ['s5', 'MATH101', 'CHEM120', 60]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 840, 930], ['s5', 'CHEM120', 600, 660], ['s2', 'CHEM120', 690, 810],
     ['s2', 'ECON150', 540, 630], ['s2', 'BIO130', 630, 690], ['s5', 'BIO130', 691, 781]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'ECON150', 'BIO130', 60]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s4', 'MATH101H', 540, 600], ['s2', 'PHYS110', 690, 750], ['s1', 'HIST140', 870, 990],
     ['s1', 'MATH101', 540, 630], ['s1', 'ECON150', 660, 750], ['s2', 'BIO130', 600, 690],
     ['s1', 'MATH101H', 750, 810], ['s2', 'CHEM120', 779, 869], ['s2', 'MATH101H', 540, 630],
     ['s4', 'CHEM120', 825, 945], ['s4', 'HIST140', 645, 735]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'MATH101H', 'BIO130', 30]]),
  ('normal control 7',
   [[['s5', 'HIST140', 540, 630], ['s4', 'ECON150', 750, 870], ['s4', 'BIO130', 540, 660],
     ['s5', 'PHYS110', 690, 810]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s4', 'HIST140', 540, 660], ['s4', 'ECON150', 660, 750]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [])]]
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: symmetric travel lookup 1[][['s1', 'A', 'B', 1]]Failed
regression variant: symmetric travel lookup 2[['s4', 'CHEM120', 'PHYS110', 30]][['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]Failed
partial repair guard 3[['s1', 'MATH101', 'ECON150', 90]][['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]Failed
boundary control 4[][]Passed
boundary control 5[][]Passed
normal control 6[['s3', 'ECON150', 'BIO130', 45], ['s4', 'BIO130', 'MATH101', 75]][['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]Failed
normal control 7[['s1', 'MATH101H', 'BIO130', 75]][['s1', 'MATH101H', 'BIO130', 75]]Passed
normal control 8[][]Passed

SHA-256 / 881571ec4bf5cfba82977a9ee453f901d38b7971c69e521c1cd710e447f38c08

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(sits, campus, travel):
    by = {}
    for st, ex, s, e in sits:
        by.setdefault(st, []).append((s, e, ex))
    out = []
    for st in sorted(by):
        seq = sorted(by[st])
        for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
            gap = s2 - e1
            c1, c2 = campus[x1], campus[x2]
            need = 0
            if c1 != c2:
                need = travel.get(c2 + '|' + c1, 0)
            if gap < need:
                out.append([st, x1, x2, need - gap])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: symmetric travel lookup 1',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'CHEM120', 869, 989], ['s4', 'HIST140', 600, 660], ['s4', 'BIO130', 750, 840],
     ['s4', 'PHYS110', 1019, 1139]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]),
  ('partial repair guard 3',
   [[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
     ['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s3', 'CHEM120', 900, 990], ['s4', 'MATH101', 630, 720], ['s4', 'BIO130', 540, 660],
     ['s3', 'PHYS110', 780, 840], ['s3', 'BIO130', 645, 735], ['s3', 'ECON150', 540, 630]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]),
  ('normal control 7',
   [[['s3', 'BIO130', 600, 720], ['s1', 'MATH101H', 540, 600], ['s1', 'MATH101', 720, 780],
     ['s1', 'BIO130', 570, 690], ['s3', 'CHEM120', 780, 870]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'BIO130', 75]]),
  ('normal control 8',
   [[['s2', 'PHYS110', 631, 721], ['s2', 'BIO130', 540, 600], ['s2', 'CHEM120', 781, 901],
     ['s2', 'MATH101H', 901, 991]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [])],
 [('regression: symmetric travel lookup 1',
   [[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
     ['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
     ['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'MATH101', 600, 660], ['s4', 'HIST140', 705, 795], ['s1', 'CHEM120', 660, 720],
     ['s3', 'BIO130', 600, 720], ['s3', 'PHYS110', 750, 810], ['s4', 'ECON150', 765, 885],
     ['s3', 'ECON150', 780, 900], ['s1', 'BIO130', 600, 660], ['s1', 'ECON150', 735, 795]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'CHEM120', 'ECON150', 15], ['s3', 'PHYS110', 'ECON150', 75], ['s4', 'HIST140', 'ECON150', 60]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 540, 660], ['s1', 'MATH101H', 719, 839], ['s1', 'HIST140', 689, 749],
     ['s4', 'ECON150', 870, 930], ['s4', 'HIST140', 600, 690], ['s4', 'CHEM120', 735, 855],
     ['s2', 'MATH101H', 660, 750], ['s2', 'MATH101', 720, 810], ['s4', 'BIO130', 930, 1020],
     ['s1', 'MATH101', 540, 660]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'HIST140', 'MATH101H', 60], ['s2', 'BIO130', 'MATH101H', 30], ['s2', 'MATH101H', 'MATH101', 75],
    ['s4', 'ECON150', 'BIO130', 30]]),
  ('boundary control 4', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('boundary control 5',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('normal control 6',
   [[['s2', 'ECON150', 540, 660], ['s5', 'MATH101', 600, 660], ['s3', 'PHYS110', 600, 690],
     ['s2', 'BIO130', 720, 810], ['s3', 'CHEM120', 719, 809], ['s5', 'HIST140', 824, 944],
     ['s5', 'MATH101H', 689, 779]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'MATH101H', 'HIST140', 15]]),
  ('normal control 7',
   [[['s5', 'HIST140', 780, 900], ['s4', 'BIO130', 690, 780], ['s5', 'MATH101H', 540, 600],
     ['s3', 'CHEM120', 645, 705], ['s5', 'PHYS110', 900, 1020], ['s3', 'HIST140', 540, 600],
     ['s4', 'ECON150', 600, 720], ['s5', 'CHEM120', 690, 810]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'ECON150', 'BIO130', 30], ['s5', 'CHEM120', 'HIST140', 30], ['s5', 'HIST140', 'PHYS110', 45]]),
  ('normal control 8',
   [[['s4', 'MATH101H', 540, 600], ['s5', 'HIST140', 750, 840], ['s5', 'ECON150', 600, 720],
     ['s5', 'MATH101H', 990, 1110], ['s4', 'HIST140', 570, 690], ['s5', 'PHYS110', 870, 990],
     ['s3', 'PHYS110', 540, 630], ['s3', 'BIO130', 660, 780], ['s3', 'ECON150', 840, 900]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s4', 'MATH101H', 'HIST140', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
     ['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
     ['s1', 'HIST140', 600, 720]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'ECON150', 689, 749], ['s3', 'MATH101H', 600, 660], ['s3', 'MATH101', 749, 839]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'MATH101H', 'ECON150', 31], ['s3', 'ECON150', 'MATH101', 60]]),
  ('partial repair guard 3',
   [[['s2', 'HIST140', 630, 690], ['s2', 'CHEM120', 600, 660], ['s2', 'BIO130', 719, 809]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'CHEM120', 'HIST140', 30], ['s2', 'HIST140', 'BIO130', 1]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('normal control 6',
   [[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'PHYS110', 'BIO130', 30]]),
  ('normal control 7',
   [[['s2', 'CHEM120', 780, 900], ['s5', 'ECON150', 600, 660], ['s2', 'PHYS110', 540, 660],
     ['s1', 'CHEM120', 1019, 1079], ['s2', 'MATH101H', 930, 1050], ['s1', 'MATH101H', 780, 900],
     ['s5', 'BIO130', 689, 779], ['s2', 'BIO130', 660, 720], ['s1', 'ECON150', 930, 990],
     ['s1', 'HIST140', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'ECON150', 'CHEM120', 16], ['s2', 'PHYS110', 'BIO130', 45], ['s5', 'ECON150', 'BIO130', 16]]),
  ('normal control 8',
   [[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
     ['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
     ['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
     ['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
     ['s2', 'MATH101', 540, 600]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'CHEM120', 781, 901], ['s1', 'BIO130', 689, 809], ['s5', 'HIST140', 600, 660],
     ['s3', 'ECON150', 661, 721], ['s1', 'PHYS110', 600, 660], ['s3', 'HIST140', 540, 630],
     ['s5', 'MATH101', 900, 1020], ['s3', 'BIO130', 691, 751], ['s5', 'MATH101H', 720, 840]],
    {'MATH101': 'north',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 75], ['s3', 'BIO130', 'CHEM120', 15]]),
  ('partial repair guard 3',
   [[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
     ['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
     ['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
     ['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('normal control 6',
   [[['s4', 'ECON150', 540, 660], ['s1', 'PHYS110', 765, 855], ['s4', 'MATH101', 765, 825],
     ['s1', 'MATH101', 600, 660], ['s4', 'HIST140', 630, 720], ['s1', 'CHEM120', 705, 765]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s4', 'ECON150', 'HIST140', 60]]),
  ('normal control 7',
   [[['s1', 'MATH101H', 600, 690], ['s1', 'HIST140', 705, 765]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s5', 'MATH101H', 600, 720], ['s1', 'BIO130', 540, 600], ['s5', 'ECON150', 540, 630],
     ['s1', 'MATH101H', 690, 810], ['s3', 'MATH101', 765, 885], ['s3', 'MATH101H', 975, 1095],
     ['s3', 'HIST140', 1185, 1275], ['s5', 'BIO130', 900, 990], ['s3', 'CHEM120', 600, 720],
     ['s1', 'HIST140', 810, 900], ['s5', 'CHEM120', 735, 855], ['s1', 'MATH101', 990, 1110]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'HIST140', 45], ['s5', 'ECON150', 'MATH101H', 30],
    ['s5', 'MATH101H', 'CHEM120', 45]])],
 [('regression: symmetric travel lookup 1',
   [[['s5', 'MATH101', 750, 870], ['s2', 'ECON150', 690, 780], ['s5', 'CHEM120', 540, 660],
     ['s5', 'ECON150', 630, 750], ['s2', 'MATH101', 540, 660], ['s5', 'PHYS110', 960, 1020]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'ECON150', 30], ['s5', 'CHEM120', 'ECON150', 90], ['s5', 'ECON150', 'MATH101', 60]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s1', 'PHYS110', 944, 1034], ['s5', 'HIST140', 540, 600], ['s5', 'CHEM120', 796, 916],
     ['s1', 'MATH101H', 824, 944], ['s5', 'PHYS110', 631, 691], ['s5', 'MATH101', 736, 826],
     ['s3', 'HIST140', 540, 660], ['s1', 'MATH101', 600, 660], ['s1', 'ECON150', 689, 809],
     ['s3', 'MATH101', 856, 946], ['s3', 'BIO130', 691, 811], ['s3', 'ECON150', 991, 1051]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101', 'ECON150', 1], ['s1', 'ECON150', 'MATH101H', 15], ['s5', 'MATH101', 'CHEM120', 60]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 840, 930], ['s5', 'CHEM120', 600, 660], ['s2', 'CHEM120', 690, 810],
     ['s2', 'ECON150', 540, 630], ['s2', 'BIO130', 630, 690], ['s5', 'BIO130', 691, 781]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'ECON150', 'BIO130', 60]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s4', 'MATH101H', 540, 600], ['s2', 'PHYS110', 690, 750], ['s1', 'HIST140', 870, 990],
     ['s1', 'MATH101', 540, 630], ['s1', 'ECON150', 660, 750], ['s2', 'BIO130', 600, 690],
     ['s1', 'MATH101H', 750, 810], ['s2', 'CHEM120', 779, 869], ['s2', 'MATH101H', 540, 630],
     ['s4', 'CHEM120', 825, 945], ['s4', 'HIST140', 645, 735]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'MATH101H', 'BIO130', 30]]),
  ('normal control 7',
   [[['s5', 'HIST140', 540, 630], ['s4', 'ECON150', 750, 870], ['s4', 'BIO130', 540, 660],
     ['s5', 'PHYS110', 690, 810]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s4', 'HIST140', 540, 660], ['s4', 'ECON150', 660, 750]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [])]]
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: symmetric travel lookup 1[['s1', 'A', 'B', 1]][['s1', 'A', 'B', 1]]Passed
regression variant: symmetric travel lookup 2[['s4', 'BIO130', 'CHEM120', 31]][['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]Failed
partial repair guard 3[['s1', 'MATH101', 'ECON150', 30], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]][['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]Failed
boundary control 4[][]Passed
boundary control 5[][]Passed
normal control 6[['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 30]][['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]Failed
normal control 7[['s1', 'MATH101H', 'BIO130', 30]][['s1', 'MATH101H', 'BIO130', 75]]Failed
normal control 8[][]Passed

SHA-256 / 8eaad1f422711619172fab0bcca8eb3c41484ca269d2d060fcccd99278c11e26

3 / The verified repair

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

N = 1
observations = []
def solve(sits, campus, travel):
    by = {}
    for st, ex, s, e in sits:
        by.setdefault(st, []).append((s, e, ex))
    out = []
    for st in sorted(by):
        seq = sorted(by[st])
        for (s1, e1, x1), (s2, e2, x2) in zip(seq, seq[1:]):
            gap = s2 - e1
            c1, c2 = campus[x1], campus[x2]
            need = 0
            if c1 != c2:
                need = travel.get(c1 + '|' + c2, travel.get(c2 + '|' + c1, 0))
            if gap < need:
                out.append([st, x1, x2, need - gap])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: symmetric travel lookup 1',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'CHEM120', 869, 989], ['s4', 'HIST140', 600, 660], ['s4', 'BIO130', 750, 840],
     ['s4', 'PHYS110', 1019, 1139]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]),
  ('partial repair guard 3',
   [[['s1', 'ECON150', 600, 720], ['s4', 'PHYS110', 600, 720], ['s4', 'BIO130', 765, 825],
     ['s4', 'CHEM120', 854, 974], ['s1', 'MATH101', 540, 630], ['s4', 'MATH101H', 989, 1109]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s3', 'CHEM120', 900, 990], ['s4', 'MATH101', 630, 720], ['s4', 'BIO130', 540, 660],
     ['s3', 'PHYS110', 780, 840], ['s3', 'BIO130', 645, 735], ['s3', 'ECON150', 540, 630]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]),
  ('normal control 7',
   [[['s3', 'BIO130', 600, 720], ['s1', 'MATH101H', 540, 600], ['s1', 'MATH101', 720, 780],
     ['s1', 'BIO130', 570, 690], ['s3', 'CHEM120', 780, 870]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'BIO130', 75]]),
  ('normal control 8',
   [[['s2', 'PHYS110', 631, 721], ['s2', 'BIO130', 540, 600], ['s2', 'CHEM120', 781, 901],
     ['s2', 'MATH101H', 901, 991]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [])],
 [('regression: symmetric travel lookup 1',
   [[['s3', 'ECON150', 839, 929], ['s1', 'MATH101H', 540, 660], ['s3', 'CHEM120', 960, 1050],
     ['s1', 'ECON150', 765, 885], ['s4', 'BIO130', 600, 660], ['s1', 'HIST140', 630, 750],
     ['s3', 'MATH101', 750, 810], ['s4', 'ECON150', 660, 720], ['s3', 'BIO130', 600, 660]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101H', 'HIST140', 60], ['s1', 'HIST140', 'ECON150', 15]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s4', 'MATH101', 600, 660], ['s4', 'HIST140', 705, 795], ['s1', 'CHEM120', 660, 720],
     ['s3', 'BIO130', 600, 720], ['s3', 'PHYS110', 750, 810], ['s4', 'ECON150', 765, 885],
     ['s3', 'ECON150', 780, 900], ['s1', 'BIO130', 600, 660], ['s1', 'ECON150', 735, 795]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'CHEM120', 'ECON150', 15], ['s3', 'PHYS110', 'ECON150', 75], ['s4', 'HIST140', 'ECON150', 60]]),
  ('partial repair guard 3',
   [[['s2', 'BIO130', 540, 660], ['s1', 'MATH101H', 719, 839], ['s1', 'HIST140', 689, 749],
     ['s4', 'ECON150', 870, 930], ['s4', 'HIST140', 600, 690], ['s4', 'CHEM120', 735, 855],
     ['s2', 'MATH101H', 660, 750], ['s2', 'MATH101', 720, 810], ['s4', 'BIO130', 930, 1020],
     ['s1', 'MATH101', 540, 660]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'city',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'HIST140', 'MATH101H', 60], ['s2', 'BIO130', 'MATH101H', 30], ['s2', 'MATH101H', 'MATH101', 75],
    ['s4', 'ECON150', 'BIO130', 30]]),
  ('boundary control 4', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('boundary control 5',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('normal control 6',
   [[['s2', 'ECON150', 540, 660], ['s5', 'MATH101', 600, 660], ['s3', 'PHYS110', 600, 690],
     ['s2', 'BIO130', 720, 810], ['s3', 'CHEM120', 719, 809], ['s5', 'HIST140', 824, 944],
     ['s5', 'MATH101H', 689, 779]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'MATH101H', 'HIST140', 15]]),
  ('normal control 7',
   [[['s5', 'HIST140', 780, 900], ['s4', 'BIO130', 690, 780], ['s5', 'MATH101H', 540, 600],
     ['s3', 'CHEM120', 645, 705], ['s5', 'PHYS110', 900, 1020], ['s3', 'HIST140', 540, 600],
     ['s4', 'ECON150', 600, 720], ['s5', 'CHEM120', 690, 810]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s4', 'ECON150', 'BIO130', 30], ['s5', 'CHEM120', 'HIST140', 30], ['s5', 'HIST140', 'PHYS110', 45]]),
  ('normal control 8',
   [[['s4', 'MATH101H', 540, 600], ['s5', 'HIST140', 750, 840], ['s5', 'ECON150', 600, 720],
     ['s5', 'MATH101H', 990, 1110], ['s4', 'HIST140', 570, 690], ['s5', 'PHYS110', 870, 990],
     ['s3', 'PHYS110', 540, 630], ['s3', 'BIO130', 660, 780], ['s3', 'ECON150', 840, 900]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s4', 'MATH101H', 'HIST140', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s2', 'MATH101', 915, 1035], ['s2', 'PHYS110', 735, 855], ['s2', 'ECON150', 600, 720],
     ['s1', 'ECON150', 870, 930], ['s2', 'CHEM120', 1005, 1095], ['s1', 'MATH101', 780, 900],
     ['s1', 'HIST140', 600, 720]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101', 'ECON150', 75], ['s2', 'MATH101', 'CHEM120', 90]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'ECON150', 689, 749], ['s3', 'MATH101H', 600, 660], ['s3', 'MATH101', 749, 839]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'MATH101H', 'ECON150', 31], ['s3', 'ECON150', 'MATH101', 60]]),
  ('partial repair guard 3',
   [[['s2', 'HIST140', 630, 690], ['s2', 'CHEM120', 600, 660], ['s2', 'BIO130', 719, 809]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'CHEM120', 'HIST140', 30], ['s2', 'HIST140', 'BIO130', 1]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('boundary control 5', [[['s1', 'A', 540, 600], ['s1', 'B', 590, 700]], {'A': 'north', 'B': 'north'}, {}],
   [['s1', 'A', 'B', 10]]),
  ('normal control 6',
   [[['s5', 'BIO130', 930, 1050], ['s5', 'PHYS110', 810, 900], ['s5', 'CHEM120', 600, 720]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   [['s5', 'PHYS110', 'BIO130', 30]]),
  ('normal control 7',
   [[['s2', 'CHEM120', 780, 900], ['s5', 'ECON150', 600, 660], ['s2', 'PHYS110', 540, 660],
     ['s1', 'CHEM120', 1019, 1079], ['s2', 'MATH101H', 930, 1050], ['s1', 'MATH101H', 780, 900],
     ['s5', 'BIO130', 689, 779], ['s2', 'BIO130', 660, 720], ['s1', 'ECON150', 930, 990],
     ['s1', 'HIST140', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'city',
     'PHYS110': 'north',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 30}],
   [['s1', 'ECON150', 'CHEM120', 16], ['s2', 'PHYS110', 'BIO130', 45], ['s5', 'ECON150', 'BIO130', 16]]),
  ('normal control 8',
   [[['s5', 'ECON150', 600, 720], ['s3', 'ECON150', 735, 855], ['s5', 'CHEM120', 690, 750],
     ['s2', 'CHEM120', 600, 720], ['s5', 'BIO130', 750, 810], ['s5', 'PHYS110', 825, 885],
     ['s2', 'BIO130', 690, 750], ['s3', 'CHEM120', 600, 690]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'CHEM120', 'BIO130', 30], ['s5', 'ECON150', 'CHEM120', 30]])],
 [('regression: symmetric travel lookup 1',
   [[['s4', 'MATH101', 630, 720], ['s2', 'PHYS110', 615, 675], ['s2', 'MATH101H', 645, 765],
     ['s4', 'MATH101H', 540, 600], ['s4', 'BIO130', 751, 841], ['s2', 'CHEM120', 825, 945],
     ['s2', 'MATH101', 540, 600]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'PHYS110', 15], ['s2', 'PHYS110', 'MATH101H', 30]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s3', 'CHEM120', 781, 901], ['s1', 'BIO130', 689, 809], ['s5', 'HIST140', 600, 660],
     ['s3', 'ECON150', 661, 721], ['s1', 'PHYS110', 600, 660], ['s3', 'HIST140', 540, 630],
     ['s5', 'MATH101', 900, 1020], ['s3', 'BIO130', 691, 751], ['s5', 'MATH101H', 720, 840]],
    {'MATH101': 'north',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s3', 'ECON150', 'BIO130', 75], ['s3', 'BIO130', 'CHEM120', 15]]),
  ('partial repair guard 3',
   [[['s1', 'PHYS110', 931, 1051], ['s5', 'PHYS110', 630, 720], ['s1', 'CHEM120', 841, 961],
     ['s5', 'BIO130', 540, 600], ['s2', 'MATH101', 840, 900], ['s1', 'MATH101', 600, 660],
     ['s1', 'MATH101H', 691, 811], ['s5', 'HIST140', 690, 780], ['s2', 'HIST140', 720, 780],
     ['s5', 'CHEM120', 811, 931], ['s2', 'ECON150', 600, 690]],
    {'MATH101': 'city',
     'MATH101H': 'city',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'south',
     'HIST140': 'south',
     'ECON150': 'south'},
    {'north|south': 30, 'city|north': 60}],
   [['s1', 'MATH101H', 'CHEM120', 30], ['s1', 'CHEM120', 'PHYS110', 90], ['s5', 'PHYS110', 'HIST140', 30]]),
  ('boundary control 4',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 629, 700]], {'A': 'south', 'B': 'north'}, {'north|south': 30}],
   [['s1', 'A', 'B', 1]]),
  ('normal control 6',
   [[['s4', 'ECON150', 540, 660], ['s1', 'PHYS110', 765, 855], ['s4', 'MATH101', 765, 825],
     ['s1', 'MATH101', 600, 660], ['s4', 'HIST140', 630, 720], ['s1', 'CHEM120', 705, 765]],
    {'MATH101': 'north',
     'MATH101H': 'city',
     'PHYS110': 'south',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s4', 'ECON150', 'HIST140', 60]]),
  ('normal control 7',
   [[['s1', 'MATH101H', 600, 690], ['s1', 'HIST140', 705, 765]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s5', 'MATH101H', 600, 720], ['s1', 'BIO130', 540, 600], ['s5', 'ECON150', 540, 630],
     ['s1', 'MATH101H', 690, 810], ['s3', 'MATH101', 765, 885], ['s3', 'MATH101H', 975, 1095],
     ['s3', 'HIST140', 1185, 1275], ['s5', 'BIO130', 900, 990], ['s3', 'CHEM120', 600, 720],
     ['s1', 'HIST140', 810, 900], ['s5', 'CHEM120', 735, 855], ['s1', 'MATH101', 990, 1110]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'north',
     'CHEM120': 'city',
     'BIO130': 'city',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [['s1', 'MATH101H', 'HIST140', 45], ['s5', 'ECON150', 'MATH101H', 30],
    ['s5', 'MATH101H', 'CHEM120', 45]])],
 [('regression: symmetric travel lookup 1',
   [[['s5', 'MATH101', 750, 870], ['s2', 'ECON150', 690, 780], ['s5', 'CHEM120', 540, 660],
     ['s5', 'ECON150', 630, 750], ['s2', 'MATH101', 540, 660], ['s5', 'PHYS110', 960, 1020]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'city',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'MATH101', 'ECON150', 30], ['s5', 'CHEM120', 'ECON150', 90], ['s5', 'ECON150', 'MATH101', 60]]),
  ('regression variant: symmetric travel lookup 2',
   [[['s1', 'PHYS110', 944, 1034], ['s5', 'HIST140', 540, 600], ['s5', 'CHEM120', 796, 916],
     ['s1', 'MATH101H', 824, 944], ['s5', 'PHYS110', 631, 691], ['s5', 'MATH101', 736, 826],
     ['s3', 'HIST140', 540, 660], ['s1', 'MATH101', 600, 660], ['s1', 'ECON150', 689, 809],
     ['s3', 'MATH101', 856, 946], ['s3', 'BIO130', 691, 811], ['s3', 'ECON150', 991, 1051]],
    {'MATH101': 'south',
     'MATH101H': 'south',
     'PHYS110': 'south',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'south',
     'ECON150': 'north'},
    {'north|south': 30, 'city|north': 30}],
   [['s1', 'MATH101', 'ECON150', 1], ['s1', 'ECON150', 'MATH101H', 15], ['s5', 'MATH101', 'CHEM120', 60]]),
  ('partial repair guard 3',
   [[['s2', 'MATH101H', 840, 930], ['s5', 'CHEM120', 600, 660], ['s2', 'CHEM120', 690, 810],
     ['s2', 'ECON150', 540, 630], ['s2', 'BIO130', 630, 690], ['s5', 'BIO130', 691, 781]],
    {'MATH101': 'south',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'north',
     'BIO130': 'north',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 30, 'city|north': 60}],
   [['s2', 'ECON150', 'BIO130', 60]]),
  ('boundary control 4',
   [[['s1', 'B', 700, 760], ['s1', 'A', 540, 600]], {'A': 'north', 'B': 'city'}, {'city|north': 60}], []),
  ('boundary control 5',
   [[['s1', 'A', 540, 600], ['s1', 'B', 630, 700]], {'A': 'north', 'B': 'south'}, {'north|south': 30}], []),
  ('normal control 6',
   [[['s4', 'MATH101H', 540, 600], ['s2', 'PHYS110', 690, 750], ['s1', 'HIST140', 870, 990],
     ['s1', 'MATH101', 540, 630], ['s1', 'ECON150', 660, 750], ['s2', 'BIO130', 600, 690],
     ['s1', 'MATH101H', 750, 810], ['s2', 'CHEM120', 779, 869], ['s2', 'MATH101H', 540, 630],
     ['s4', 'CHEM120', 825, 945], ['s4', 'HIST140', 645, 735]],
    {'MATH101': 'city',
     'MATH101H': 'south',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'city',
     'ECON150': 'city'},
    {'north|south': 45, 'city|north': 30}],
   [['s2', 'MATH101H', 'BIO130', 30]]),
  ('normal control 7',
   [[['s5', 'HIST140', 540, 630], ['s4', 'ECON150', 750, 870], ['s4', 'BIO130', 540, 660],
     ['s5', 'PHYS110', 690, 810]],
    {'MATH101': 'north',
     'MATH101H': 'north',
     'PHYS110': 'city',
     'CHEM120': 'south',
     'BIO130': 'south',
     'HIST140': 'north',
     'ECON150': 'south'},
    {'north|south': 45, 'city|north': 60}],
   []),
  ('normal control 8',
   [[['s4', 'HIST140', 540, 660], ['s4', 'ECON150', 660, 750]],
    {'MATH101': 'city',
     'MATH101H': 'north',
     'PHYS110': 'south',
     'CHEM120': 'south',
     'BIO130': 'city',
     'HIST140': 'north',
     'ECON150': 'north'},
    {'north|south': 45, 'city|north': 60}],
   [])]]
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: symmetric travel lookup 1[['s1', 'A', 'B', 1]][['s1', 'A', 'B', 1]]Passed
regression variant: symmetric travel lookup 2[['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]][['s4', 'BIO130', 'CHEM120', 31], ['s4', 'CHEM120', 'PHYS110', 30]]Passed
partial repair guard 3[['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]][['s1', 'MATH101', 'ECON150', 90], ['s4', 'BIO130', 'CHEM120', 16], ['s4', 'CHEM120', 'MATH101H', 45]]Passed
boundary control 4[][]Passed
boundary control 5[][]Passed
normal control 6[['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]][['s3', 'ECON150', 'BIO130', 45], ['s3', 'BIO130', 'PHYS110', 15], ['s4', 'BIO130', 'MATH101', 75]]Passed
normal control 7[['s1', 'MATH101H', 'BIO130', 75]][['s1', 'MATH101H', 'BIO130', 75]]Passed
normal control 8[][]Passed

SHA-256 / 1b41cfc97cb7d7b2ff79e84041554f0f1cf4086a901afdfe3764552094f2384a

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

Case digest / 1cc565c576500d55ebb833dd958d88e3bfd230d14aefce38374f43d7cd08392f