{"abstract":"Different rooms with different durations are penalised as if they shared a room.","category":"Exam timetabling constraints","checks":8,"contract":"Assignments [exam, room, period] and exam durations. For each room and period, the penalty is the number of distinct durations minus one. Return [total penalty, [room, period, distinct durations] for penalised room-periods in order].","evaluation_group":"w2-exam-timetabling-constraints-mixed-duration-penalty","failed_approach":"Keying by room only mixes all periods of the room.","family":"w2-exam-timetabling-constraints-mixed-duration-penalty-room-period-key","id":"FA-94571","implementations":{"attempt":{"sha256":"ad54afe29c696ff345fa51cbbd62d8e7fe415ad1a467f9beb629f7c9eb4b71e1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, dur):\n    groups = {}\n    for e, r, p in assign:\n        groups.setdefault((r, 0), set()).add(dur[e])\n    bad = []\n    total = 0\n    for (r, p), ds in sorted(groups.items()):\n        if len(ds) > 1:\n            bad.append([r, p, len(ds)])\n            total += len(ds) - 1\n    return [total, bad]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: room period key 1',\n   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('partial repair guard 3',\n   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],\n    {'MATH101': 120,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 90,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [0, []]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R1', 1, 2]]]),\n  ('normal control 8',\n   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],\n     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]])],\n [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],\n     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [2, [['R1', 0, 2], ['R2', 0, 2]]]),\n  ('partial repair guard 3',\n   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 5',\n   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['BIO130', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],\n     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R2', 2, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [3, [['R1', 1, 2], ['R2', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 120}],\n   [1, [['R2', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],\n     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [2, [['R1', 1, 2], ['R2', 2, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 7',\n   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],\n     ['CHEM120', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],\n     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],\n     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],\n     ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],\n     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 2, 2]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"7963556e6e8fa746dd87b324391766391f0958ed0672087d420d21740ba9c3f3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, dur):\n    groups = {}\n    for e, r, p in assign:\n        groups.setdefault(('all', p), set()).add(dur[e])\n    bad = []\n    total = 0\n    for (r, p), ds in sorted(groups.items()):\n        if len(ds) > 1:\n            bad.append([r, p, len(ds)])\n            total += len(ds) - 1\n    return [total, bad]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: room period key 1',\n   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('partial repair guard 3',\n   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],\n    {'MATH101': 120,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 90,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [0, []]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R1', 1, 2]]]),\n  ('normal control 8',\n   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],\n     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]])],\n [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],\n     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [2, [['R1', 0, 2], ['R2', 0, 2]]]),\n  ('partial repair guard 3',\n   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 5',\n   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['BIO130', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],\n     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R2', 2, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [3, [['R1', 1, 2], ['R2', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 120}],\n   [1, [['R2', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],\n     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [2, [['R1', 1, 2], ['R2', 2, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 7',\n   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],\n     ['CHEM120', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],\n     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],\n     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],\n     ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],\n     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 2, 2]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"9a1c63399b1d9a179606daa59f040d5adf7636cad5436a9a73571883baae2cac","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, dur):\n    groups = {}\n    for e, r, p in assign:\n        groups.setdefault((r, p), set()).add(dur[e])\n    bad = []\n    total = 0\n    for (r, p), ds in sorted(groups.items()):\n        if len(ds) > 1:\n            bad.append([r, p, len(ds)])\n            total += len(ds) - 1\n    return [total, bad]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: room period key 1',\n   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('partial repair guard 3',\n   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],\n    {'MATH101': 120,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 60,\n     'BIO130': 90,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [0, []]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R1', 1, 2]]]),\n  ('normal control 8',\n   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],\n     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]])],\n [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],\n     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [2, [['R1', 0, 2], ['R2', 0, 2]]]),\n  ('partial repair guard 3',\n   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [0, []]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 5',\n   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['BIO130', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],\n     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [1, [['R2', 2, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 60,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [3, [['R1', 1, 2], ['R2', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 60,\n     'ECON150': 120}],\n   [1, [['R2', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],\n     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [2, [['R1', 1, 2], ['R2', 2, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),\n  ('normal control 6',\n   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 7',\n   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],\n     ['CHEM120', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 60,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [1, [['R2', 0, 2]]]),\n  ('normal control 8',\n   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('regression variant: room period key 2',\n   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 120,\n     'CHEM120': 60,\n     'BIO130': 60,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],\n   [2, [['R1', 0, 3]]]),\n  ('normal control 6',\n   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],\n     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 120,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R2', 1, 2]]]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 90,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 60,\n     'HIST140': 60,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],\n     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],\n    {'MATH101': 90,\n     'MATH101H': 90,\n     'PHYS110': 90,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 60}],\n   [0, []])],\n [('regression: room period key 1',\n   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],\n     ['HIST140', 'R1', 0]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 120,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [2, [['R1', 0, 3]]]),\n  ('regression variant: room period key 2',\n   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 90,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 120}],\n   [1, [['R1', 1, 2]]]),\n  ('partial repair guard 3',\n   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],\n     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],\n    {'MATH101': 90,\n     'MATH101H': 120,\n     'PHYS110': 60,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 120,\n     'ECON150': 90}],\n   [1, [['R1', 1, 2]]]),\n  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),\n  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),\n  ('normal control 6',\n   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],\n     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 90,\n     'HIST140': 120,\n     'ECON150': 120}],\n   [3, [['R1', 0, 2], ['R2', 2, 3]]]),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],\n     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],\n    {'MATH101': 60,\n     'MATH101H': 120,\n     'PHYS110': 120,\n     'CHEM120': 120,\n     'BIO130': 90,\n     'HIST140': 90,\n     'ECON150': 60}],\n   [0, []]),\n  ('normal control 8',\n   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],\n     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],\n    {'MATH101': 60,\n     'MATH101H': 60,\n     'PHYS110': 120,\n     'CHEM120': 90,\n     'BIO130': 120,\n     'HIST140': 90,\n     'ECON150': 90}],\n   [1, [['R1', 2, 2]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-exam-timetabling-constraints-mixed-duration-penalty-room-period-key","generated_at":"2026-09-29T14:52:05.638810+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Mixed durations in one room disrupt invigilation; the penalty is defined over distinct durations.","repair":"Group by room and period.","root_cause":"Groups are keyed by period only.","sha256":"4d0325148fdeb5e617d1e1e40eb7ee01c183d25af275fcdbc49095ca4119189e","title":"Mixed durations evaluated across all rooms of a period · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.011,"exit_code":1,"observations":[{"actual":[2,[["R1",0,3]]],"check":"regression: room period key 1","expected":[2,[["R1",0,3]]],"passed":true},{"actual":[0,[]],"check":"regression variant: room period key 2","expected":[0,[]],"passed":true},{"actual":[1,[["R2",0,2]]],"check":"partial repair guard 3","expected":[0,[]],"passed":false},{"actual":[1,[["R1",0,2]]],"check":"boundary control 4","expected":[0,[]],"passed":false},{"actual":[0,[]],"check":"boundary control 5","expected":[0,[]],"passed":true},{"actual":[1,[["R2",0,2]]],"check":"normal control 6","expected":[0,[]],"passed":false},{"actual":[1,[["R1",0,2]]],"check":"normal control 7","expected":[1,[["R1",1,2]]],"passed":false},{"actual":[2,[["R2",0,3]]],"check":"normal control 8","expected":[1,[["R2",0,2]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: room period key 1\", \"actual\": [2, [[\"R1\", 0, 3]]], \"expected\": [2, [[\"R1\", 0, 3]]], \"passed\": true}, {\"check\": \"regression variant: room period key 2\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [1, [[\"R2\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [1, [[\"R1\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"boundary control 5\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [1, [[\"R2\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [1, [[\"R1\", 0, 2]]], \"expected\": [1, [[\"R1\", 1, 2]]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [2, [[\"R2\", 0, 3]]], \"expected\": [1, [[\"R2\", 0, 2]]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.447,"exit_code":1,"observations":[{"actual":[2,[["all",0,3]]],"check":"regression: room period key 1","expected":[2,[["R1",0,3]]],"passed":false},{"actual":[1,[["all",0,2]]],"check":"regression variant: room period key 2","expected":[0,[]],"passed":false},{"actual":[1,[["all",0,2]]],"check":"partial repair guard 3","expected":[0,[]],"passed":false},{"actual":[0,[]],"check":"boundary control 4","expected":[0,[]],"passed":true},{"actual":[0,[]],"check":"boundary control 5","expected":[0,[]],"passed":true},{"actual":[1,[["all",0,2]]],"check":"normal control 6","expected":[0,[]],"passed":false},{"actual":[1,[["all",1,2]]],"check":"normal control 7","expected":[1,[["R1",1,2]]],"passed":false},{"actual":[1,[["all",0,2]]],"check":"normal control 8","expected":[1,[["R2",0,2]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: room period key 1\", \"actual\": [2, [[\"all\", 0, 3]]], \"expected\": [2, [[\"R1\", 0, 3]]], \"passed\": false}, {\"check\": \"regression variant: room period key 2\", \"actual\": [1, [[\"all\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [1, [[\"all\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [1, [[\"all\", 0, 2]]], \"expected\": [0, []], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [1, [[\"all\", 1, 2]]], \"expected\": [1, [[\"R1\", 1, 2]]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [1, [[\"all\", 0, 2]]], \"expected\": [1, [[\"R2\", 0, 2]]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.793,"exit_code":0,"observations":[{"actual":[2,[["R1",0,3]]],"check":"regression: room period key 1","expected":[2,[["R1",0,3]]],"passed":true},{"actual":[0,[]],"check":"regression variant: room period key 2","expected":[0,[]],"passed":true},{"actual":[0,[]],"check":"partial repair guard 3","expected":[0,[]],"passed":true},{"actual":[0,[]],"check":"boundary control 4","expected":[0,[]],"passed":true},{"actual":[0,[]],"check":"boundary control 5","expected":[0,[]],"passed":true},{"actual":[0,[]],"check":"normal control 6","expected":[0,[]],"passed":true},{"actual":[1,[["R1",1,2]]],"check":"normal control 7","expected":[1,[["R1",1,2]]],"passed":true},{"actual":[1,[["R2",0,2]]],"check":"normal control 8","expected":[1,[["R2",0,2]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: room period key 1\", \"actual\": [2, [[\"R1\", 0, 3]]], \"expected\": [2, [[\"R1\", 0, 3]]], \"passed\": true}, {\"check\": \"regression variant: room period key 2\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [0, []], \"expected\": [0, []], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [1, [[\"R1\", 1, 2]]], \"expected\": [1, [[\"R1\", 1, 2]]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [1, [[\"R2\", 0, 2]]], \"expected\": [1, [[\"R2\", 0, 2]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}