{"abstract":"The reported per-student cost shrinks as students take more exams.","category":"Exam timetabling constraints","checks":8,"contract":"enrol [student, exam] rows (may repeat) and exam periods. For each student, each pair of distinct exams d = 1..5 periods apart costs 2^(5-d). Return [total, number of students, total/students as a reduced fraction string].","evaluation_group":"w2-exam-timetabling-constraints-carter-proximity-cost","failed_approach":"Dividing by the number of exams is also not per student.","family":"w2-exam-timetabling-constraints-carter-proximity-cost-normaliser","id":"FA-94431","implementations":{"attempt":{"sha256":"477ff9bc860246b1d1e1c5a19832d6cb72b2a69d0a2cc9fdf008741ded3dfe42","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(enrol, period):\n    by = {}\n    for st, ex in enrol:\n        by.setdefault(st, set()).add(ex)\n    total = 0\n    for st, exs in by.items():\n        ps = sorted(period[e] for e in exs)\n        for i in range(len(ps)):\n            for j in range(i + 1, len(ps)):\n                d = ps[j] - ps[i]\n                if 1 <= d <= 5:\n                    total += 2 ** (5 - d)\n    n = len(period)\n    return [total, n, str(Fraction(total, n)) if n else '0']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('regression variant: normaliser 2',\n   [[['s2', 'CHEM120'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s5', 'CHEM120'], ['s1', 'MATH101H'],\n     ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s4', 'MATH101'], ['s5', 'HIST140'],\n     ['s4', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 4}],\n   [62, 4, '31/2']),\n  ('partial repair guard 3',\n   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s3', 'BIO130'], ['s2', 'MATH101H'],\n     ['s2', 'MATH101'], ['s2', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 0, 'ECON150': 0}],\n   [79, 4, '79/4']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s5', 'ECON150'], ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 2, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 1, 'ECON150': 3}],\n   [28, 2, '14']),\n  ('normal control 7',\n   [[['s4', 'ECON150'], ['s3', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'CHEM120'], ['s1', 'MATH101'],\n     ['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'PHYS110']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 7, 'ECON150': 5}],\n   [37, 3, '37/3']),\n  ('normal control 8',\n   [[['s2', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s1', 'MATH101H'],\n     ['s5', 'MATH101H'], ['s5', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s3', 'CHEM120']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 7, 'HIST140': 7, 'ECON150': 2}],\n   [63, 5, '63/5'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 5}],\n   [1, 1, '1']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'BIO130'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s4', 'MATH101H']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [72, 1, '72']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s1', 'ECON150'], ['s1', 'CHEM120'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 7}],\n   [10, 1, '10']),\n  ('normal control 7',\n   [[['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s2', 'BIO130'], ['s5', 'ECON150'], ['s4', 'MATH101'],\n     ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'CHEM120'],\n     ['s2', 'HIST140'], ['s5', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 6, 'ECON150': 1}],\n   [119, 3, '119/3']),\n  ('normal control 8',\n   [[['s4', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'MATH101']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 5, 'ECON150': 2}],\n   [8, 2, '4'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],\n   [32, 2, '16']),\n  ('partial repair guard 3',\n   [[['s1', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'PHYS110'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 7, 'HIST140': 3, 'ECON150': 3}],\n   [39, 1, '39']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('normal control 5',\n   [[['s2', 'BIO130'], ['s5', 'BIO130'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'CHEM120'],\n     ['s3', 'MATH101'], ['s4', 'MATH101'], ['s1', 'MATH101H'], ['s1', 'BIO130'], ['s5', 'MATH101'],\n     ['s4', 'CHEM120'], ['s5', 'MATH101H'], ['s4', 'BIO130'], ['s3', 'BIO130'], ['s3', 'MATH101H'],\n     ['s5', 'PHYS110'], ['s2', 'MATH101']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}],\n   [143, 5, '143/5']),\n  ('normal control 6',\n   [[['s5', 'MATH101'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s5', 'ECON150'], ['s5', 'CHEM120']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 6, 'HIST140': 7, 'ECON150': 5}],\n   [24, 3, '8']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'],\n     ['s2', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 2, 'ECON150': 3}],\n   [1, 3, '1/3']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101'], ['s5', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 4, 'HIST140': 4, 'ECON150': 5}],\n   [0, 1, '0'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}],\n   [17, 1, '17']),\n  ('partial repair guard 3',\n   [[['s2', 'HIST140'], ['s2', 'BIO130'], ['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'BIO130']],\n    {'MATH101': 3, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [76, 3, '76/3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('normal control 7',\n   [[['s3', 'BIO130'], ['s5', 'BIO130'], ['s1', 'ECON150'], ['s3', 'MATH101'], ['s1', 'MATH101'],\n     ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s1', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'BIO130'],\n     ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 6, 'PHYS110': 3, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 6, 'ECON150': 2}],\n   [80, 3, '80/3']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'ECON150'], ['s2', 'BIO130'], ['s4', 'BIO130'], ['s2', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s2', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 6, 'HIST140': 6, 'ECON150': 2}],\n   [68, 2, '34'])],\n [('regression: normaliser 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],\n     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],\n     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],\n   [94, 5, '94/5']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s3', 'BIO130']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 6, 'CHEM120': 7, 'BIO130': 7, 'HIST140': 3, 'ECON150': 0}],\n   [3, 1, '3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],\n     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],\n   [20, 4, '5']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'ECON150']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 4, 'ECON150': 3}],\n   [16, 1, '16']),\n  ('normal control 8',\n   [[['s2', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s2', 'HIST140']],\n    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 1, 'ECON150': 6}],\n   [18, 1, '18'])]]\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":"22e465b43aa1091b52a2047d21f5f12ca6ba0eb0af37fb6ff8586c9a5705f4ad","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(enrol, period):\n    by = {}\n    for st, ex in enrol:\n        by.setdefault(st, set()).add(ex)\n    total = 0\n    for st, exs in by.items():\n        ps = sorted(period[e] for e in exs)\n        for i in range(len(ps)):\n            for j in range(i + 1, len(ps)):\n                d = ps[j] - ps[i]\n                if 1 <= d <= 5:\n                    total += 2 ** (5 - d)\n    n = len(enrol)\n    return [total, n, str(Fraction(total, n)) if n else '0']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('regression variant: normaliser 2',\n   [[['s2', 'CHEM120'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s5', 'CHEM120'], ['s1', 'MATH101H'],\n     ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s4', 'MATH101'], ['s5', 'HIST140'],\n     ['s4', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 4}],\n   [62, 4, '31/2']),\n  ('partial repair guard 3',\n   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s3', 'BIO130'], ['s2', 'MATH101H'],\n     ['s2', 'MATH101'], ['s2', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 0, 'ECON150': 0}],\n   [79, 4, '79/4']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s5', 'ECON150'], ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 2, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 1, 'ECON150': 3}],\n   [28, 2, '14']),\n  ('normal control 7',\n   [[['s4', 'ECON150'], ['s3', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'CHEM120'], ['s1', 'MATH101'],\n     ['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'PHYS110']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 7, 'ECON150': 5}],\n   [37, 3, '37/3']),\n  ('normal control 8',\n   [[['s2', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s1', 'MATH101H'],\n     ['s5', 'MATH101H'], ['s5', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s3', 'CHEM120']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 7, 'HIST140': 7, 'ECON150': 2}],\n   [63, 5, '63/5'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 5}],\n   [1, 1, '1']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'BIO130'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s4', 'MATH101H']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [72, 1, '72']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s1', 'ECON150'], ['s1', 'CHEM120'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 7}],\n   [10, 1, '10']),\n  ('normal control 7',\n   [[['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s2', 'BIO130'], ['s5', 'ECON150'], ['s4', 'MATH101'],\n     ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'CHEM120'],\n     ['s2', 'HIST140'], ['s5', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 6, 'ECON150': 1}],\n   [119, 3, '119/3']),\n  ('normal control 8',\n   [[['s4', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'MATH101']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 5, 'ECON150': 2}],\n   [8, 2, '4'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],\n   [32, 2, '16']),\n  ('partial repair guard 3',\n   [[['s1', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'PHYS110'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 7, 'HIST140': 3, 'ECON150': 3}],\n   [39, 1, '39']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('normal control 5',\n   [[['s2', 'BIO130'], ['s5', 'BIO130'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'CHEM120'],\n     ['s3', 'MATH101'], ['s4', 'MATH101'], ['s1', 'MATH101H'], ['s1', 'BIO130'], ['s5', 'MATH101'],\n     ['s4', 'CHEM120'], ['s5', 'MATH101H'], ['s4', 'BIO130'], ['s3', 'BIO130'], ['s3', 'MATH101H'],\n     ['s5', 'PHYS110'], ['s2', 'MATH101']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}],\n   [143, 5, '143/5']),\n  ('normal control 6',\n   [[['s5', 'MATH101'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s5', 'ECON150'], ['s5', 'CHEM120']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 6, 'HIST140': 7, 'ECON150': 5}],\n   [24, 3, '8']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'],\n     ['s2', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 2, 'ECON150': 3}],\n   [1, 3, '1/3']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101'], ['s5', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 4, 'HIST140': 4, 'ECON150': 5}],\n   [0, 1, '0'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}],\n   [17, 1, '17']),\n  ('partial repair guard 3',\n   [[['s2', 'HIST140'], ['s2', 'BIO130'], ['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'BIO130']],\n    {'MATH101': 3, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [76, 3, '76/3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('normal control 7',\n   [[['s3', 'BIO130'], ['s5', 'BIO130'], ['s1', 'ECON150'], ['s3', 'MATH101'], ['s1', 'MATH101'],\n     ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s1', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'BIO130'],\n     ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 6, 'PHYS110': 3, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 6, 'ECON150': 2}],\n   [80, 3, '80/3']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'ECON150'], ['s2', 'BIO130'], ['s4', 'BIO130'], ['s2', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s2', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 6, 'HIST140': 6, 'ECON150': 2}],\n   [68, 2, '34'])],\n [('regression: normaliser 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],\n     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],\n     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],\n   [94, 5, '94/5']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s3', 'BIO130']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 6, 'CHEM120': 7, 'BIO130': 7, 'HIST140': 3, 'ECON150': 0}],\n   [3, 1, '3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],\n     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],\n   [20, 4, '5']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'ECON150']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 4, 'ECON150': 3}],\n   [16, 1, '16']),\n  ('normal control 8',\n   [[['s2', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s2', 'HIST140']],\n    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 1, 'ECON150': 6}],\n   [18, 1, '18'])]]\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":"ca933683e948e1c24ce90256fd5a4561f6d3426939f02c4e341047c432310bf6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(enrol, period):\n    by = {}\n    for st, ex in enrol:\n        by.setdefault(st, set()).add(ex)\n    total = 0\n    for st, exs in by.items():\n        ps = sorted(period[e] for e in exs)\n        for i in range(len(ps)):\n            for j in range(i + 1, len(ps)):\n                d = ps[j] - ps[i]\n                if 1 <= d <= 5:\n                    total += 2 ** (5 - d)\n    n = len(by)\n    return [total, n, str(Fraction(total, n)) if n else '0']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('regression variant: normaliser 2',\n   [[['s2', 'CHEM120'], ['s5', 'BIO130'], ['s2', 'MATH101'], ['s5', 'CHEM120'], ['s1', 'MATH101H'],\n     ['s1', 'HIST140'], ['s1', 'ECON150'], ['s1', 'PHYS110'], ['s4', 'MATH101'], ['s5', 'HIST140'],\n     ['s4', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 4}],\n   [62, 4, '31/2']),\n  ('partial repair guard 3',\n   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s2', 'CHEM120'], ['s5', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s3', 'BIO130'], ['s2', 'MATH101H'],\n     ['s2', 'MATH101'], ['s2', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 0, 'ECON150': 0}],\n   [79, 4, '79/4']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s5', 'ECON150'], ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'MATH101H']],\n    {'MATH101': 6, 'MATH101H': 2, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 6, 'HIST140': 1, 'ECON150': 3}],\n   [28, 2, '14']),\n  ('normal control 7',\n   [[['s4', 'ECON150'], ['s3', 'PHYS110'], ['s1', 'ECON150'], ['s4', 'CHEM120'], ['s1', 'MATH101'],\n     ['s1', 'BIO130'], ['s4', 'HIST140'], ['s4', 'PHYS110']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 7, 'ECON150': 5}],\n   [37, 3, '37/3']),\n  ('normal control 8',\n   [[['s2', 'PHYS110'], ['s5', 'CHEM120'], ['s3', 'PHYS110'], ['s3', 'MATH101H'], ['s1', 'MATH101H'],\n     ['s5', 'MATH101H'], ['s5', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s3', 'CHEM120']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 7, 'HIST140': 7, 'ECON150': 2}],\n   [63, 5, '63/5'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 5}],\n   [1, 1, '1']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'BIO130'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s4', 'MATH101H']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 1, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [72, 1, '72']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s1', 'ECON150'], ['s1', 'CHEM120'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 0, 'HIST140': 1, 'ECON150': 7}],\n   [10, 1, '10']),\n  ('normal control 7',\n   [[['s4', 'CHEM120'], ['s5', 'CHEM120'], ['s2', 'BIO130'], ['s5', 'ECON150'], ['s4', 'MATH101'],\n     ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s5', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'CHEM120'],\n     ['s2', 'HIST140'], ['s5', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 6, 'ECON150': 1}],\n   [119, 3, '119/3']),\n  ('normal control 8',\n   [[['s4', 'CHEM120'], ['s1', 'HIST140'], ['s1', 'MATH101']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 7, 'HIST140': 5, 'ECON150': 2}],\n   [8, 2, '4'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s1', 'PHYS110'], ['s4', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 2, 'ECON150': 4}],\n   [32, 2, '16']),\n  ('partial repair guard 3',\n   [[['s1', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'PHYS110'], ['s1', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 7, 'HIST140': 3, 'ECON150': 3}],\n   [39, 1, '39']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('normal control 5',\n   [[['s2', 'BIO130'], ['s5', 'BIO130'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s2', 'CHEM120'],\n     ['s3', 'MATH101'], ['s4', 'MATH101'], ['s1', 'MATH101H'], ['s1', 'BIO130'], ['s5', 'MATH101'],\n     ['s4', 'CHEM120'], ['s5', 'MATH101H'], ['s4', 'BIO130'], ['s3', 'BIO130'], ['s3', 'MATH101H'],\n     ['s5', 'PHYS110'], ['s2', 'MATH101']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}],\n   [143, 5, '143/5']),\n  ('normal control 6',\n   [[['s5', 'MATH101'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],\n     ['s5', 'ECON150'], ['s5', 'CHEM120']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 6, 'HIST140': 7, 'ECON150': 5}],\n   [24, 3, '8']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s1', 'HIST140'], ['s1', 'MATH101'], ['s5', 'MATH101H'], ['s2', 'MATH101'],\n     ['s2', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 1, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 2, 'ECON150': 3}],\n   [1, 3, '1/3']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101'], ['s5', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 4, 'HIST140': 4, 'ECON150': 5}],\n   [0, 1, '0'])],\n [('regression: normaliser 1', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}],\n   [0, 1, '0']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'PHYS110'], ['s4', 'HIST140']],\n    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 5, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}],\n   [17, 1, '17']),\n  ('partial repair guard 3',\n   [[['s2', 'HIST140'], ['s2', 'BIO130'], ['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s2', 'PHYS110'], ['s3', 'BIO130']],\n    {'MATH101': 3, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [76, 3, '76/3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 1}],\n   [16, 1, '16']),\n  ('boundary control 5',\n   [[['s1', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'BIO130']],\n    {'MATH101': 0, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 1}],\n   [32, 2, '16']),\n  ('normal control 6',\n   [[['s3', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 5, 'CHEM120': 4, 'BIO130': 0, 'HIST140': 1, 'ECON150': 5}],\n   [40, 2, '20']),\n  ('normal control 7',\n   [[['s3', 'BIO130'], ['s5', 'BIO130'], ['s1', 'ECON150'], ['s3', 'MATH101'], ['s1', 'MATH101'],\n     ['s5', 'HIST140'], ['s3', 'CHEM120'], ['s1', 'CHEM120'], ['s5', 'PHYS110'], ['s1', 'BIO130'],\n     ['s3', 'MATH101H'], ['s3', 'MATH101'], ['s5', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 6, 'PHYS110': 3, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 6, 'ECON150': 2}],\n   [80, 3, '80/3']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'ECON150'], ['s2', 'BIO130'], ['s4', 'BIO130'], ['s2', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s2', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 6, 'HIST140': 6, 'ECON150': 2}],\n   [68, 2, '34'])],\n [('regression: normaliser 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: normaliser 2',\n   [[['s4', 'MATH101H'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s1', 'ECON150'],\n     ['s1', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'ECON150'], ['s5', 'PHYS110'], ['s1', 'HIST140'],\n     ['s3', 'PHYS110'], ['s5', 'MATH101'], ['s2', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 6, 'ECON150': 7}],\n   [94, 5, '94/5']),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s3', 'MATH101'], ['s3', 'BIO130']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 6, 'CHEM120': 7, 'BIO130': 7, 'HIST140': 3, 'ECON150': 0}],\n   [3, 1, '3']),\n  ('boundary control 4', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 3, 'PHYS110': 3}], [0, 1, '0']),\n  ('boundary control 5', [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 6}], [0, 1, '0']),\n  ('normal control 6',\n   [[['s1', 'MATH101H'], ['s2', 'BIO130'], ['s1', 'ECON150'], ['s1', 'ECON150'], ['s2', 'ECON150'],\n     ['s3', 'MATH101'], ['s4', 'MATH101H'], ['s2', 'MATH101H'], ['s4', 'ECON150'], ['s2', 'PHYS110']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 3, 'ECON150': 4}],\n   [20, 4, '5']),\n  ('normal control 7',\n   [[['s5', 'PHYS110'], ['s5', 'MATH101H'], ['s5', 'PHYS110'], ['s5', 'ECON150']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 4, 'ECON150': 3}],\n   [16, 1, '16']),\n  ('normal control 8',\n   [[['s2', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s2', 'HIST140']],\n    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 1, 'ECON150': 6}],\n   [18, 1, '18'])]]\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-carter-proximity-cost-normaliser","generated_at":"2026-09-29T14:52:04.311305+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"The Carter proximity cost is the standard exam-timetabling quality measure; each piece has a known implementation pitfall.","repair":"Divide by the number of distinct students.","root_cause":"The denominator counts enrolment rows rather than distinct students.","sha256":"7e08bfffff809ab1e19bf76a117de6997ba0fcd635cd38d1b12fca8adb49f5c8","title":"Proximity cost normalised by enrolment rows · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.262,"exit_code":1,"observations":[{"actual":[16,2,"8"],"check":"regression: normaliser 1","expected":[16,1,"16"],"passed":false},{"actual":[62,7,"62/7"],"check":"regression variant: normaliser 2","expected":[62,4,"31/2"],"passed":false},{"actual":[79,7,"79/7"],"check":"partial repair guard 3","expected":[79,4,"79/4"],"passed":false},{"actual":[0,2,"0"],"check":"boundary control 4","expected":[0,1,"0"],"passed":false},{"actual":[0,2,"0"],"check":"boundary control 5","expected":[0,1,"0"],"passed":false},{"actual":[28,7,"4"],"check":"normal control 6","expected":[28,2,"14"],"passed":false},{"actual":[37,7,"37/7"],"check":"normal control 7","expected":[37,3,"37/3"],"passed":false},{"actual":[63,7,"9"],"check":"normal control 8","expected":[63,5,"63/5"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: normaliser 1\", \"actual\": [16, 2, \"8\"], \"expected\": [16, 1, \"16\"], \"passed\": false}, {\"check\": \"regression variant: normaliser 2\", \"actual\": [62, 7, \"62/7\"], \"expected\": [62, 4, \"31/2\"], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [79, 7, \"79/7\"], \"expected\": [79, 4, \"79/4\"], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [0, 2, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": false}, {\"check\": \"boundary control 5\", \"actual\": [0, 2, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [28, 7, \"4\"], \"expected\": [28, 2, \"14\"], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [37, 7, \"37/7\"], \"expected\": [37, 3, \"37/3\"], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [63, 7, \"9\"], \"expected\": [63, 5, \"63/5\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.964,"exit_code":1,"observations":[{"actual":[16,2,"8"],"check":"regression: normaliser 1","expected":[16,1,"16"],"passed":false},{"actual":[62,11,"62/11"],"check":"regression variant: normaliser 2","expected":[62,4,"31/2"],"passed":false},{"actual":[79,12,"79/12"],"check":"partial repair guard 3","expected":[79,4,"79/4"],"passed":false},{"actual":[0,2,"0"],"check":"boundary control 4","expected":[0,1,"0"],"passed":false},{"actual":[0,2,"0"],"check":"boundary control 5","expected":[0,1,"0"],"passed":false},{"actual":[28,5,"28/5"],"check":"normal control 6","expected":[28,2,"14"],"passed":false},{"actual":[37,8,"37/8"],"check":"normal control 7","expected":[37,3,"37/3"],"passed":false},{"actual":[63,11,"63/11"],"check":"normal control 8","expected":[63,5,"63/5"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: normaliser 1\", \"actual\": [16, 2, \"8\"], \"expected\": [16, 1, \"16\"], \"passed\": false}, {\"check\": \"regression variant: normaliser 2\", \"actual\": [62, 11, \"62/11\"], \"expected\": [62, 4, \"31/2\"], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [79, 12, \"79/12\"], \"expected\": [79, 4, \"79/4\"], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [0, 2, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": false}, {\"check\": \"boundary control 5\", \"actual\": [0, 2, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [28, 5, \"28/5\"], \"expected\": [28, 2, \"14\"], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [37, 8, \"37/8\"], \"expected\": [37, 3, \"37/3\"], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [63, 11, \"63/11\"], \"expected\": [63, 5, \"63/5\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.437,"exit_code":0,"observations":[{"actual":[16,1,"16"],"check":"regression: normaliser 1","expected":[16,1,"16"],"passed":true},{"actual":[62,4,"31/2"],"check":"regression variant: normaliser 2","expected":[62,4,"31/2"],"passed":true},{"actual":[79,4,"79/4"],"check":"partial repair guard 3","expected":[79,4,"79/4"],"passed":true},{"actual":[0,1,"0"],"check":"boundary control 4","expected":[0,1,"0"],"passed":true},{"actual":[0,1,"0"],"check":"boundary control 5","expected":[0,1,"0"],"passed":true},{"actual":[28,2,"14"],"check":"normal control 6","expected":[28,2,"14"],"passed":true},{"actual":[37,3,"37/3"],"check":"normal control 7","expected":[37,3,"37/3"],"passed":true},{"actual":[63,5,"63/5"],"check":"normal control 8","expected":[63,5,"63/5"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: normaliser 1\", \"actual\": [16, 1, \"16\"], \"expected\": [16, 1, \"16\"], \"passed\": true}, {\"check\": \"regression variant: normaliser 2\", \"actual\": [62, 4, \"31/2\"], \"expected\": [62, 4, \"31/2\"], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [79, 4, \"79/4\"], \"expected\": [79, 4, \"79/4\"], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [0, 1, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [0, 1, \"0\"], \"expected\": [0, 1, \"0\"], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [28, 2, \"14\"], \"expected\": [28, 2, \"14\"], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [37, 3, \"37/3\"], \"expected\": [37, 3, \"37/3\"], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [63, 5, \"63/5\"], \"expected\": [63, 5, \"63/5\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}