{"abstract":"A duplicated enrolment doubles the cost of every pair involving that exam.","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":"Deduplicating periods merges different exams in the same period.","family":"w2-exam-timetabling-constraints-carter-proximity-cost-distinct-exams","id":"FA-94426","implementations":{"attempt":{"sha256":"7c5fd54d664b08fb1ee3b3e4d4b3077b339ef088ed4f575f6ff703661e3252e9","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(set(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: distinct exams 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\n  ('partial repair guard 3',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/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   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],\n     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],\n     ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],\n   [49, 5, '49/5']),\n  ('normal control 8',\n   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],\n     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [66, 4, '33/2'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],\n     ['s4', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],\n   [30, 3, '10']),\n  ('partial repair guard 3',\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  ('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   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],\n    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],\n   [10, 4, '5/2']),\n  ('normal control 7',\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  ('normal control 8',\n   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],\n     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],\n     ['s2', 'ECON150']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],\n   [11, 4, '11/4'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],\n     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],\n     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],\n   [105, 4, '105/4']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],\n     ['s3', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],\n   [19, 4, '19/4']),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\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   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],\n     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],\n     ['s3', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [91, 3, '91/3']),\n  ('normal control 7',\n   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],\n    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],\n   [33, 1, '33']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],\n     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],\n    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],\n   [107, 4, '107/4'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],\n     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],\n   [153, 5, '153/5']),\n  ('partial repair guard 3',\n   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],\n     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],\n     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [55, 5, '11']),\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', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],\n     ['s5', 'MATH101'], ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],\n   [56, 2, '28']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],\n     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],\n    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],\n   [36, 4, '9'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/4']),\n  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],\n     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],\n   [24, 3, '8']),\n  ('partial repair guard 3',\n   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],\n     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],\n   [70, 3, '70/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   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],\n     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],\n   [49, 4, '49/4']),\n  ('normal control 7',\n   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],\n     ['s1', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],\n   [89, 4, '89/4']),\n  ('normal control 8',\n   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],\n     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s1', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [41, 4, '41/4'])]]\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":"bf485ebc13f6a86540836bae3d92b84898c67404761f0981ee98d5e0be7bdfe0","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 [x for s2, x in enrol if s2 == st])\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: distinct exams 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\n  ('partial repair guard 3',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/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   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],\n     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],\n     ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],\n   [49, 5, '49/5']),\n  ('normal control 8',\n   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],\n     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [66, 4, '33/2'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],\n     ['s4', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],\n   [30, 3, '10']),\n  ('partial repair guard 3',\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  ('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   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],\n    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],\n   [10, 4, '5/2']),\n  ('normal control 7',\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  ('normal control 8',\n   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],\n     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],\n     ['s2', 'ECON150']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],\n   [11, 4, '11/4'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],\n     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],\n     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],\n   [105, 4, '105/4']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],\n     ['s3', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],\n   [19, 4, '19/4']),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\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   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],\n     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],\n     ['s3', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [91, 3, '91/3']),\n  ('normal control 7',\n   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],\n    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],\n   [33, 1, '33']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],\n     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],\n    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],\n   [107, 4, '107/4'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],\n     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],\n   [153, 5, '153/5']),\n  ('partial repair guard 3',\n   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],\n     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],\n     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [55, 5, '11']),\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', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],\n     ['s5', 'MATH101'], ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],\n   [56, 2, '28']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],\n     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],\n    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],\n   [36, 4, '9'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/4']),\n  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],\n     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],\n   [24, 3, '8']),\n  ('partial repair guard 3',\n   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],\n     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],\n   [70, 3, '70/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   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],\n     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],\n   [49, 4, '49/4']),\n  ('normal control 7',\n   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],\n     ['s1', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],\n   [89, 4, '89/4']),\n  ('normal control 8',\n   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],\n     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s1', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [41, 4, '41/4'])]]\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":"b80f89cf8a487e249fe2266c908d7511c36b3849145cfcd2afff74bf03db0b94","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: distinct exams 1',\n   [[['s1', 'MATH101'], ['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}], [8, 1, '8']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\n  ('partial repair guard 3',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/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   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'HIST140'],\n     ['s5', 'ECON150'], ['s3', 'ECON150'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'MATH101'],\n     ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 3, 'HIST140': 1, 'ECON150': 0}],\n   [49, 5, '49/5']),\n  ('normal control 8',\n   [[['s5', 'ECON150'], ['s1', 'MATH101'], ['s1', 'ECON150'], ['s2', 'PHYS110'], ['s1', 'CHEM120'],\n     ['s4', 'PHYS110'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s5', 'HIST140'], ['s5', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 5, 'CHEM120': 5, 'BIO130': 5, 'HIST140': 6, 'ECON150': 6}],\n   [66, 4, '33/2'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s1', 'ECON150'], ['s5', 'CHEM120'], ['s4', 'ECON150'], ['s1', 'HIST140'], ['s4', 'MATH101'],\n     ['s4', 'MATH101'], ['s1', 'PHYS110']],\n    {'MATH101': 1, 'MATH101H': 4, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 5, 'HIST140': 2, 'ECON150': 3}],\n   [30, 3, '10']),\n  ('partial repair guard 3',\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  ('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   [[['s5', 'BIO130'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'BIO130'], ['s4', 'CHEM120'],\n     ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s3', 'ECON150']],\n    {'MATH101': 7, 'MATH101H': 3, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 7, 'HIST140': 7, 'ECON150': 6}],\n   [10, 4, '5/2']),\n  ('normal control 7',\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  ('normal control 8',\n   [[['s2', 'MATH101'], ['s1', 'MATH101H'], ['s3', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'ECON150'],\n     ['s2', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101'], ['s3', 'MATH101H'], ['s3', 'BIO130'],\n     ['s2', 'ECON150']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 6, 'ECON150': 7}],\n   [11, 4, '11/4'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s5', 'MATH101H'], ['s2', 'CHEM120'], ['s1', 'BIO130'], ['s1', 'MATH101H'],\n     ['s4', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'CHEM120'], ['s4', 'ECON150'], ['s5', 'ECON150'],\n     ['s1', 'HIST140'], ['s1', 'BIO130'], ['s5', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 0, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 5, 'HIST140': 1, 'ECON150': 5}],\n   [105, 4, '105/4']),\n  ('regression variant: distinct exams 2',\n   [[['s3', 'MATH101H'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s1', 'HIST140'], ['s5', 'BIO130'],\n     ['s1', 'MATH101'], ['s2', 'PHYS110'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s2', 'HIST140'],\n     ['s3', 'HIST140']],\n    {'MATH101': 2, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 7}],\n   [19, 4, '19/4']),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 3, 'MATH101H': 4, 'PHYS110': 3, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 1, 'ECON150': 4}],\n   [48, 1, '48']),\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   [[['s4', 'MATH101H'], ['s5', 'BIO130'], ['s4', 'BIO130'], ['s4', 'CHEM120'], ['s5', 'ECON150'],\n     ['s3', 'BIO130'], ['s3', 'CHEM120'], ['s3', 'HIST140'], ['s5', 'CHEM120'], ['s4', 'PHYS110'],\n     ['s3', 'MATH101']],\n    {'MATH101': 4, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [91, 3, '91/3']),\n  ('normal control 7',\n   [[['s5', 'MATH101'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'MATH101'], ['s5', 'CHEM120']],\n    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 4, 'BIO130': 7, 'HIST140': 3, 'ECON150': 1}],\n   [33, 1, '33']),\n  ('normal control 8',\n   [[['s4', 'HIST140'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s2', 'BIO130'], ['s5', 'CHEM120'],\n     ['s5', 'ECON150'], ['s1', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'CHEM120'], ['s2', 'CHEM120']],\n    {'MATH101': 3, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 2, 'ECON150': 7}],\n   [107, 4, '107/4'])],\n [('regression: distinct exams 1',\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  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'MATH101'],\n     ['s1', 'HIST140'], ['s3', 'MATH101H'], ['s4', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'PHYS110'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'BIO130'], ['s4', 'PHYS110']],\n    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 0}],\n   [153, 5, '153/5']),\n  ('partial repair guard 3',\n   [[['s2', 'ECON150'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'HIST140'], ['s4', 'BIO130'],\n     ['s3', 'CHEM120'], ['s4', 'HIST140'], ['s5', 'MATH101H'], ['s5', 'HIST140'], ['s5', 'CHEM120'],\n     ['s4', 'MATH101'], ['s2', 'MATH101H'], ['s1', 'CHEM120'], ['s1', 'MATH101']],\n    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 4, 'ECON150': 4}],\n   [55, 5, '11']),\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', 'MATH101'], ['s5', 'HIST140'], ['s1', 'MATH101H'], ['s5', 'PHYS110'], ['s1', 'ECON150'],\n     ['s5', 'MATH101'], ['s1', 'CHEM120']],\n    {'MATH101': 7, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 5, 'ECON150': 4}],\n   [56, 2, '28']),\n  ('normal control 7',\n   [[['s1', 'MATH101'], ['s2', 'MATH101H'], ['s2', 'CHEM120'], ['s5', 'MATH101'], ['s4', 'MATH101'],\n     ['s2', 'MATH101'], ['s1', 'PHYS110'], ['s1', 'CHEM120'], ['s1', 'BIO130'], ['s4', 'HIST140'],\n     ['s4', 'BIO130']],\n    {'MATH101': 6, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 6, 'ECON150': 4}],\n   [96, 4, '24']),\n  ('normal control 8',\n   [[['s5', 'PHYS110'], ['s5', 'CHEM120'], ['s2', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'CHEM120'],\n     ['s2', 'HIST140'], ['s2', 'MATH101'], ['s3', 'PHYS110']],\n    {'MATH101': 2, 'MATH101H': 4, 'PHYS110': 2, 'CHEM120': 0, 'BIO130': 1, 'HIST140': 3, 'ECON150': 6}],\n   [36, 4, '9'])],\n [('regression: distinct exams 1',\n   [[['s4', 'HIST140'], ['s3', 'PHYS110'], ['s3', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'HIST140'],\n     ['s3', 'BIO130'], ['s2', 'MATH101H'], ['s5', 'MATH101'], ['s2', 'MATH101'], ['s4', 'ECON150'],\n     ['s2', 'CHEM120'], ['s3', 'MATH101']],\n    {'MATH101': 0, 'MATH101H': 5, 'PHYS110': 2, 'CHEM120': 4, 'BIO130': 4, 'HIST140': 4, 'ECON150': 6}],\n   [65, 4, '65/4']),\n  ('regression variant: distinct exams 2',\n   [[['s5', 'ECON150'], ['s5', 'CHEM120'], ['s5', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101'],\n     ['s2', 'CHEM120'], ['s1', 'HIST140'], ['s2', 'BIO130']],\n    {'MATH101': 2, 'MATH101H': 5, 'PHYS110': 1, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 4, 'ECON150': 1}],\n   [24, 3, '8']),\n  ('partial repair guard 3',\n   [[['s2', 'MATH101'], ['s5', 'PHYS110'], ['s3', 'BIO130'], ['s5', 'ECON150'], ['s2', 'BIO130'],\n     ['s5', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 2, 'PHYS110': 4, 'CHEM120': 1, 'BIO130': 3, 'HIST140': 7, 'ECON150': 5}],\n   [70, 3, '70/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   [[['s2', 'BIO130'], ['s5', 'PHYS110'], ['s2', 'PHYS110'], ['s5', 'BIO130'], ['s5', 'ECON150'],\n     ['s5', 'MATH101'], ['s4', 'PHYS110'], ['s1', 'PHYS110'], ['s2', 'ECON150'], ['s2', 'ECON150']],\n    {'MATH101': 1, 'MATH101H': 0, 'PHYS110': 7, 'CHEM120': 5, 'BIO130': 6, 'HIST140': 6, 'ECON150': 0}],\n   [49, 4, '49/4']),\n  ('normal control 7',\n   [[['s3', 'MATH101'], ['s1', 'MATH101'], ['s5', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'MATH101H'],\n     ['s5', 'CHEM120'], ['s5', 'MATH101'], ['s5', 'HIST140'], ['s4', 'ECON150'], ['s3', 'ECON150'],\n     ['s1', 'PHYS110'], ['s3', 'HIST140']],\n    {'MATH101': 4, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 5, 'HIST140': 3, 'ECON150': 7}],\n   [89, 4, '89/4']),\n  ('normal control 8',\n   [[['s1', 'PHYS110'], ['s4', 'ECON150'], ['s1', 'CHEM120'], ['s4', 'BIO130'], ['s3', 'MATH101H'],\n     ['s4', 'MATH101H'], ['s3', 'HIST140'], ['s2', 'PHYS110'], ['s1', 'HIST140'], ['s3', 'CHEM120'],\n     ['s4', 'HIST140'], ['s1', 'BIO130']],\n    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 7, 'CHEM120': 0, 'BIO130': 2, 'HIST140': 7, 'ECON150': 4}],\n   [41, 4, '41/4'])]]\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-distinct-exams","generated_at":"2026-09-29T14:52:04.218095+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":"Form pairs over each student's distinct exams.","root_cause":"Pairs are formed from raw enrolment rows instead of distinct exams.","sha256":"35cce866a34f751bb52653367e7edba4d1d13fee2d603c769f3f88b25a52ee70","title":"Repeated enrolment rows multiply proximity pairs · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.185,"exit_code":1,"observations":[{"actual":[8,1,"8"],"check":"regression: distinct exams 1","expected":[8,1,"8"],"passed":true},{"actual":[28,1,"28"],"check":"regression variant: distinct exams 2","expected":[48,1,"48"],"passed":false},{"actual":[55,4,"55/4"],"check":"partial repair guard 3","expected":[65,4,"65/4"],"passed":false},{"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":[64,4,"16"],"check":"normal control 6","expected":[96,4,"24"],"passed":false},{"actual":[48,5,"48/5"],"check":"normal control 7","expected":[49,5,"49/5"],"passed":false},{"actual":[33,4,"33/4"],"check":"normal control 8","expected":[66,4,"33/2"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: distinct exams 1\", \"actual\": [8, 1, \"8\"], \"expected\": [8, 1, \"8\"], \"passed\": true}, {\"check\": \"regression variant: distinct exams 2\", \"actual\": [28, 1, \"28\"], \"expected\": [48, 1, \"48\"], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [55, 4, \"55/4\"], \"expected\": [65, 4, \"65/4\"], \"passed\": false}, {\"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\": [64, 4, \"16\"], \"expected\": [96, 4, \"24\"], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [48, 5, \"48/5\"], \"expected\": [49, 5, \"49/5\"], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [33, 4, \"33/4\"], \"expected\": [66, 4, \"33/2\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.885,"exit_code":1,"observations":[{"actual":[16,1,"16"],"check":"regression: distinct exams 1","expected":[8,1,"8"],"passed":false},{"actual":[88,1,"88"],"check":"regression variant: distinct exams 2","expected":[48,1,"48"],"passed":false},{"actual":[81,4,"81/4"],"check":"partial repair guard 3","expected":[65,4,"65/4"],"passed":false},{"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":[96,4,"24"],"check":"normal control 6","expected":[96,4,"24"],"passed":true},{"actual":[49,5,"49/5"],"check":"normal control 7","expected":[49,5,"49/5"],"passed":true},{"actual":[66,4,"33/2"],"check":"normal control 8","expected":[66,4,"33/2"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: distinct exams 1\", \"actual\": [16, 1, \"16\"], \"expected\": [8, 1, \"8\"], \"passed\": false}, {\"check\": \"regression variant: distinct exams 2\", \"actual\": [88, 1, \"88\"], \"expected\": [48, 1, \"48\"], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [81, 4, \"81/4\"], \"expected\": [65, 4, \"65/4\"], \"passed\": false}, {\"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\": [96, 4, \"24\"], \"expected\": [96, 4, \"24\"], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [49, 5, \"49/5\"], \"expected\": [49, 5, \"49/5\"], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [66, 4, \"33/2\"], \"expected\": [66, 4, \"33/2\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.27,"exit_code":0,"observations":[{"actual":[8,1,"8"],"check":"regression: distinct exams 1","expected":[8,1,"8"],"passed":true},{"actual":[48,1,"48"],"check":"regression variant: distinct exams 2","expected":[48,1,"48"],"passed":true},{"actual":[65,4,"65/4"],"check":"partial repair guard 3","expected":[65,4,"65/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":[96,4,"24"],"check":"normal control 6","expected":[96,4,"24"],"passed":true},{"actual":[49,5,"49/5"],"check":"normal control 7","expected":[49,5,"49/5"],"passed":true},{"actual":[66,4,"33/2"],"check":"normal control 8","expected":[66,4,"33/2"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: distinct exams 1\", \"actual\": [8, 1, \"8\"], \"expected\": [8, 1, \"8\"], \"passed\": true}, {\"check\": \"regression variant: distinct exams 2\", \"actual\": [48, 1, \"48\"], \"expected\": [48, 1, \"48\"], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [65, 4, \"65/4\"], \"expected\": [65, 4, \"65/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\": [96, 4, \"24\"], \"expected\": [96, 4, \"24\"], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [49, 5, \"49/5\"], \"expected\": [49, 5, \"49/5\"], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [66, 4, \"33/2\"], \"expected\": [66, 4, \"33/2\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}