{"abstract":"A later exam of a different duration is seated in a room already running part of a split exam.","category":"Exam timetabling constraints","checks":8,"contract":"exams [id, size, duration, splittable], rooms [id, capacity]. Exams are placed largest first (ties by id). A room is compatible if empty or holding only exams of the same duration. Place whole in the compatible room with the least sufficient remaining capacity (ties by id); else if splittable and compatible rooms have enough total space, fill them by descending remaining capacity (ties by id), skipping full rooms; else unplaced. Return placements and unplaced ids.","evaluation_group":"w2-exam-timetabling-constraints-room-allocation-with-splitting","failed_approach":"Recording it only on the first split room leaves the other rooms open to mixed durations.","family":"w2-exam-timetabling-constraints-room-allocation-with-splitting-split-room-duration-record","id":"FA-94406","implementations":{"attempt":{"sha256":"a2f9cc425e0ae0f7bb366a740cd6b42595c079cea54c2aebfb9a138d39be67f4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, rooms):\n    rem = {r: c for r, c in rooms}\n    dur = {}\n    place = {}\n    unplaced = []\n    for eid, size, d, split in sorted(exams, key=lambda x: (-x[1], x[0])):\n        ok = [r for r in rem if dur.get(r, d) == d]\n        fit = [r for r in ok if rem[r] >= size]\n        if fit:\n            r = min(fit, key=lambda r: (rem[r], r))\n            place[eid] = [[r, size]]\n            rem[r] -= size\n            dur[r] = d\n            continue\n        if split and sum(rem[r] for r in ok) >= size:\n            parts = []\n            left = size\n            for r in sorted(ok, key=lambda r: (-rem[r], r)):\n                if left == 0:\n                    break\n                take = min(rem[r], left)\n                parts.append([r, take])\n                rem[r] -= take\n                if not parts[:-1]:\n                    dur[r] = d\n                left -= take\n            place[eid] = parts\n            continue\n        unplaced.append(eid)\n    return {'placed': place, 'unplaced': unplaced}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: split room duration record 1',\n   [[['E0', 80, 180, True], ['E1', 20, 90, True], ['E2', 80, 90, False], ['E3', 80, 90, True]],\n    [['R0', 60], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E0': [['R0', 60], ['R1', 20]], 'E1': [['R2', 20]]}, 'unplaced': ['E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 45, 120, True], ['E1', 20, 90, False], ['E2', 60, 120, True]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 50]]],\n   {'placed': {'E2': [['R3', 50], ['R0', 10]], 'E0': [['R2', 40], ['R0', 5]], 'E1': [['R1', 20]]},\n    'unplaced': []}),\n  ('partial repair guard 3',\n   [[['E0', 45, 180, False], ['E1', 80, 120, True], ['E2', 45, 180, True], ['E3', 20, 180, True],\n     ['E4', 80, 180, True]],\n    [['R0', 30], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60], ['R0', 20]], 'E3': [['R2', 20]]}, 'unplaced': ['E4', 'E0', 'E2']}),\n  ('boundary control 4', [[['A', 40, 120, False], ['B', 20, 120, False]], [['R1', 60], ['R2', 40]]],\n   {'placed': {'A': [['R2', 40]], 'B': [['R1', 20]]}, 'unplaced': []}),\n  ('normal control 5', [[['E0', 10, 180, True], ['E1', 10, 90, False]], [['R0', 60], ['R1', 60]]],\n   {'placed': {'E0': [['R0', 10]], 'E1': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 30, 180, True], ['E2', 30, 120, True], ['E3', 30, 180, True],\n     ['E4', 60, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 60], ['R3', 30]]],\n   {'placed': {'E4': [['R2', 60]], 'E0': [['R3', 30]], 'E1': [['R1', 30]], 'E3': [['R0', 20], ['R1', 10]]},\n    'unplaced': ['E2']}),\n  ('normal control 7',\n   [[['E0', 10, 90, False], ['E1', 80, 180, True], ['E2', 30, 90, True]], [['R0', 30], ['R1', 20]]],\n   {'placed': {'E2': [['R0', 30]], 'E0': [['R1', 10]]}, 'unplaced': ['E1']}),\n  ('normal control 8',\n   [[['E0', 30, 180, True], ['E1', 10, 120, True], ['E2', 80, 180, True]],\n    [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E2': [['R2', 60], ['R3', 20]], 'E0': [['R3', 30]], 'E1': [['R0', 10]]}, 'unplaced': []})],\n [('regression: split room duration record 1',\n   [[['E0', 10, 120, False], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 30, 120, True],\n     ['E4', 80, 120, False]],\n    [['R0', 60], ['R1', 50], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E1': [['R0', 60]], 'E2': [['R1', 50], ['R2', 10]], 'E3': [['R3', 30]], 'E0': [['R3', 10]]},\n    'unplaced': ['E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 10, 90, True], ['E1', 10, 120, True], ['E2', 30, 120, False], ['E3', 80, 90, False],\n     ['E4', 80, 120, True]],\n    [['R0', 30], ['R1', 40], ['R2', 50]]],\n   {'placed': {'E4': [['R2', 50], ['R1', 30]], 'E2': [['R0', 30]], 'E1': [['R1', 10]]},\n    'unplaced': ['E3', 'E0']}),\n  ('partial repair guard 3',\n   [[['E0', 45, 120, True], ['E1', 80, 90, False], ['E2', 10, 180, False], ['E3', 80, 180, True]],\n    [['R0', 40], ['R1', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 5]]}, 'unplaced': ['E1', 'E3', 'E2']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 20]]],\n   {'placed': {'A': [['R1', 30], ['R2', 20]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 120, True], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 20, 90, True],\n     ['E4', 20, 120, False]],\n    [['R0', 50], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E2': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]},\n    'unplaced': ['E0', 'E4']}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 10, 180, False]], [['R0', 20], ['R1', 30], ['R2', 30]]],\n   {'placed': {'E0': [['R1', 30]], 'E1': [['R0', 10]]}, 'unplaced': []}),\n  ('normal control 7',\n   [[['E0', 30, 120, True], ['E1', 60, 120, True], ['E2', 45, 120, False]],\n    [['R0', 40], ['R1', 60], ['R2', 30], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60]], 'E0': [['R2', 30]]}, 'unplaced': ['E2']}),\n  ('normal control 8',\n   [[['E0', 80, 120, True], ['E1', 60, 120, True], ['E2', 60, 90, True], ['E3', 20, 180, False],\n     ['E4', 30, 120, False]],\n    [['R0', 40], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 40]], 'E3': [['R2', 20]]}, 'unplaced': ['E1', 'E2', 'E4']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 180, True], ['E1', 20, 120, True], ['E2', 10, 120, True], ['E3', 45, 120, True],\n     ['E4', 45, 120, True]],\n    [['R0', 30], ['R1', 20], ['R2', 20], ['R3', 50]]],\n   {'placed': {'E0': [['R3', 50], ['R0', 10]], 'E1': [['R1', 20]], 'E2': [['R2', 10]]},\n    'unplaced': ['E3', 'E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, True], ['E1', 30, 90, False], ['E2', 30, 90, True], ['E3', 20, 120, True],\n     ['E4', 80, 120, True]],\n    [['R0', 20], ['R1', 30], ['R2', 60], ['R3', 20]]],\n   {'placed': {'E4': [['R2', 60], ['R1', 20]], 'E2': [['R0', 20], ['R3', 10]]},\n    'unplaced': ['E0', 'E1', 'E3']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 180, True], ['E1', 20, 120, False], ['E2', 20, 180, False], ['E3', 30, 180, False],\n     ['E4', 45, 90, True]],\n    [['R0', 60], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E0': [['R0', 60], ['R2', 20]], 'E3': [['R1', 30]], 'E2': [['R2', 20]]},\n    'unplaced': ['E4', 'E1']}),\n  ('boundary control 4', [[['A', 30, 120, True], ['B', 30, 120, True]], [['R1', 30], ['R2', 40]]],\n   {'placed': {'A': [['R1', 30]], 'B': [['R2', 30]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 180, False], ['E1', 60, 120, True], ['E2', 10, 180, True]],\n    [['R0', 20], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E0': [['R1', 30]], 'E2': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 45, 120, True], ['E1', 80, 120, False], ['E2', 60, 90, False]],\n    [['R0', 40], ['R1', 40], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E0': [['R2', 45]]}, 'unplaced': ['E1', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 80, 120, True]], [['R0', 40], ['R1', 20], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 45, 120, False], ['E1', 45, 90, False], ['E2', 80, 90, True], ['E3', 60, 90, False],\n     ['E4', 80, 180, True]],\n    [['R0', 60], ['R1', 20], ['R2', 20]]],\n   {'placed': {'E2': [['R0', 60], ['R1', 20]]}, 'unplaced': ['E4', 'E3', 'E0', 'E1']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 90, True], ['E1', 30, 120, False], ['E2', 10, 180, True]],\n    [['R0', 50], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 50], ['R1', 10]], 'E2': [['R2', 10]]}, 'unplaced': ['E1']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, False], ['E1', 60, 90, True], ['E2', 10, 120, True], ['E3', 20, 90, False],\n     ['E4', 30, 180, True]],\n    [['R0', 50], ['R1', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]}, 'unplaced': ['E0', 'E4', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 10, 90, True], ['E1', 20, 120, True], ['E2', 80, 120, False], ['E3', 60, 120, True],\n     ['E4', 20, 120, True]],\n    [['R0', 50], ['R1', 20], ['R2', 50], ['R3', 30]]],\n   {'placed': {'E3': [['R0', 50], ['R2', 10]], 'E1': [['R1', 20]], 'E4': [['R3', 20]]},\n    'unplaced': ['E2', 'E0']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 19]]],\n   {'placed': {}, 'unplaced': ['A']}),\n  ('normal control 5',\n   [[['E0', 60, 120, True], ['E1', 45, 120, True]], [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E0': [['R2', 60]], 'E1': [['R3', 45]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 80, 120, False], ['E2', 10, 180, False], ['E3', 45, 120, False],\n     ['E4', 80, 90, False]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 30]]],\n   {'placed': {'E0': [['R0', 40], ['R2', 40]], 'E2': [['R1', 10]]}, 'unplaced': ['E1', 'E4', 'E3']}),\n  ('normal control 7',\n   [[['E0', 30, 180, True], ['E1', 45, 120, False], ['E2', 45, 90, True], ['E3', 60, 120, False],\n     ['E4', 30, 120, True]],\n    [['R0', 30], ['R1', 50]]],\n   {'placed': {'E1': [['R1', 45]], 'E0': [['R0', 30]]}, 'unplaced': ['E3', 'E2', 'E4']}),\n  ('normal control 8',\n   [[['E0', 20, 120, True], ['E1', 60, 180, False], ['E2', 80, 180, False], ['E3', 60, 120, True]],\n    [['R0', 20], ['R1', 20], ['R2', 30], ['R3', 60]]],\n   {'placed': {'E1': [['R3', 60]], 'E3': [['R2', 30], ['R0', 20], ['R1', 10]]}, 'unplaced': ['E2', 'E0']})],\n [('regression: split room duration record 1',\n   [[['E0', 80, 120, True], ['E1', 80, 120, True], ['E2', 20, 180, True], ['E3', 10, 90, True],\n     ['E4', 80, 180, True]],\n    [['R0', 50], ['R1', 60], ['R2', 60]]],\n   {'placed': {'E0': [['R1', 60], ['R2', 20]], 'E1': [['R0', 50], ['R2', 30]]},\n    'unplaced': ['E4', 'E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 20, 120, True], ['E1', 60, 120, False], ['E2', 30, 180, True], ['E3', 80, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 40]]],\n   {'placed': {'E3': [['R1', 50], ['R2', 30]], 'E0': [['R0', 20]]}, 'unplaced': ['E1', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 90, False], ['E1', 45, 120, True], ['E2', 10, 120, True], ['E3', 20, 120, False],\n     ['E4', 20, 90, True]],\n    [['R0', 30], ['R1', 40], ['R2', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R2', 5]], 'E3': [['R0', 20]], 'E2': [['R0', 10]]},\n    'unplaced': ['E0', 'E4']}),\n  ('boundary control 4', [[['A', 30, 120, False], ['B', 30, 90, False]], [['R1', 60]]],\n   {'placed': {'A': [['R1', 30]]}, 'unplaced': ['B']}),\n  ('normal control 5', [[['E0', 30, 120, True], ['E1', 60, 120, True]], [['R0', 30], ['R1', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 45, 180, True], ['E2', 60, 180, False], ['E3', 80, 90, False]],\n    [['R0', 50], ['R1', 50], ['R2', 50], ['R3', 60]]],\n   {'placed': {'E0': [['R3', 60], ['R0', 20]], 'E1': [['R1', 45]]}, 'unplaced': ['E3', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 20, 120, True]], [['R0', 40], ['R1', 30], ['R2', 60], ['R3', 40]]],\n   {'placed': {'E1': [['R1', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 30, 90, False], ['E1', 80, 120, True], ['E2', 20, 90, False], ['E3', 20, 120, False],\n     ['E4', 60, 120, False]],\n    [['R0', 50], ['R1', 20], ['R2', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R2', 30]], 'E2': [['R1', 20]]}, 'unplaced': ['E4', 'E0', 'E3']})]]\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":"a8eb78083c174f3e5ce5e4b85ad719af75b64343ce97ebf1a0269417fadd77fd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, rooms):\n    rem = {r: c for r, c in rooms}\n    dur = {}\n    place = {}\n    unplaced = []\n    for eid, size, d, split in sorted(exams, key=lambda x: (-x[1], x[0])):\n        ok = [r for r in rem if dur.get(r, d) == d]\n        fit = [r for r in ok if rem[r] >= size]\n        if fit:\n            r = min(fit, key=lambda r: (rem[r], r))\n            place[eid] = [[r, size]]\n            rem[r] -= size\n            dur[r] = d\n            continue\n        if split and sum(rem[r] for r in ok) >= size:\n            parts = []\n            left = size\n            for r in sorted(ok, key=lambda r: (-rem[r], r)):\n                if left == 0:\n                    break\n                take = min(rem[r], left)\n                parts.append([r, take])\n                rem[r] -= take\n                left -= take\n            place[eid] = parts\n            continue\n        unplaced.append(eid)\n    return {'placed': place, 'unplaced': unplaced}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: split room duration record 1',\n   [[['E0', 80, 180, True], ['E1', 20, 90, True], ['E2', 80, 90, False], ['E3', 80, 90, True]],\n    [['R0', 60], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E0': [['R0', 60], ['R1', 20]], 'E1': [['R2', 20]]}, 'unplaced': ['E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 45, 120, True], ['E1', 20, 90, False], ['E2', 60, 120, True]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 50]]],\n   {'placed': {'E2': [['R3', 50], ['R0', 10]], 'E0': [['R2', 40], ['R0', 5]], 'E1': [['R1', 20]]},\n    'unplaced': []}),\n  ('partial repair guard 3',\n   [[['E0', 45, 180, False], ['E1', 80, 120, True], ['E2', 45, 180, True], ['E3', 20, 180, True],\n     ['E4', 80, 180, True]],\n    [['R0', 30], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60], ['R0', 20]], 'E3': [['R2', 20]]}, 'unplaced': ['E4', 'E0', 'E2']}),\n  ('boundary control 4', [[['A', 40, 120, False], ['B', 20, 120, False]], [['R1', 60], ['R2', 40]]],\n   {'placed': {'A': [['R2', 40]], 'B': [['R1', 20]]}, 'unplaced': []}),\n  ('normal control 5', [[['E0', 10, 180, True], ['E1', 10, 90, False]], [['R0', 60], ['R1', 60]]],\n   {'placed': {'E0': [['R0', 10]], 'E1': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 30, 180, True], ['E2', 30, 120, True], ['E3', 30, 180, True],\n     ['E4', 60, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 60], ['R3', 30]]],\n   {'placed': {'E4': [['R2', 60]], 'E0': [['R3', 30]], 'E1': [['R1', 30]], 'E3': [['R0', 20], ['R1', 10]]},\n    'unplaced': ['E2']}),\n  ('normal control 7',\n   [[['E0', 10, 90, False], ['E1', 80, 180, True], ['E2', 30, 90, True]], [['R0', 30], ['R1', 20]]],\n   {'placed': {'E2': [['R0', 30]], 'E0': [['R1', 10]]}, 'unplaced': ['E1']}),\n  ('normal control 8',\n   [[['E0', 30, 180, True], ['E1', 10, 120, True], ['E2', 80, 180, True]],\n    [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E2': [['R2', 60], ['R3', 20]], 'E0': [['R3', 30]], 'E1': [['R0', 10]]}, 'unplaced': []})],\n [('regression: split room duration record 1',\n   [[['E0', 10, 120, False], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 30, 120, True],\n     ['E4', 80, 120, False]],\n    [['R0', 60], ['R1', 50], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E1': [['R0', 60]], 'E2': [['R1', 50], ['R2', 10]], 'E3': [['R3', 30]], 'E0': [['R3', 10]]},\n    'unplaced': ['E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 10, 90, True], ['E1', 10, 120, True], ['E2', 30, 120, False], ['E3', 80, 90, False],\n     ['E4', 80, 120, True]],\n    [['R0', 30], ['R1', 40], ['R2', 50]]],\n   {'placed': {'E4': [['R2', 50], ['R1', 30]], 'E2': [['R0', 30]], 'E1': [['R1', 10]]},\n    'unplaced': ['E3', 'E0']}),\n  ('partial repair guard 3',\n   [[['E0', 45, 120, True], ['E1', 80, 90, False], ['E2', 10, 180, False], ['E3', 80, 180, True]],\n    [['R0', 40], ['R1', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 5]]}, 'unplaced': ['E1', 'E3', 'E2']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 20]]],\n   {'placed': {'A': [['R1', 30], ['R2', 20]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 120, True], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 20, 90, True],\n     ['E4', 20, 120, False]],\n    [['R0', 50], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E2': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]},\n    'unplaced': ['E0', 'E4']}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 10, 180, False]], [['R0', 20], ['R1', 30], ['R2', 30]]],\n   {'placed': {'E0': [['R1', 30]], 'E1': [['R0', 10]]}, 'unplaced': []}),\n  ('normal control 7',\n   [[['E0', 30, 120, True], ['E1', 60, 120, True], ['E2', 45, 120, False]],\n    [['R0', 40], ['R1', 60], ['R2', 30], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60]], 'E0': [['R2', 30]]}, 'unplaced': ['E2']}),\n  ('normal control 8',\n   [[['E0', 80, 120, True], ['E1', 60, 120, True], ['E2', 60, 90, True], ['E3', 20, 180, False],\n     ['E4', 30, 120, False]],\n    [['R0', 40], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 40]], 'E3': [['R2', 20]]}, 'unplaced': ['E1', 'E2', 'E4']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 180, True], ['E1', 20, 120, True], ['E2', 10, 120, True], ['E3', 45, 120, True],\n     ['E4', 45, 120, True]],\n    [['R0', 30], ['R1', 20], ['R2', 20], ['R3', 50]]],\n   {'placed': {'E0': [['R3', 50], ['R0', 10]], 'E1': [['R1', 20]], 'E2': [['R2', 10]]},\n    'unplaced': ['E3', 'E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, True], ['E1', 30, 90, False], ['E2', 30, 90, True], ['E3', 20, 120, True],\n     ['E4', 80, 120, True]],\n    [['R0', 20], ['R1', 30], ['R2', 60], ['R3', 20]]],\n   {'placed': {'E4': [['R2', 60], ['R1', 20]], 'E2': [['R0', 20], ['R3', 10]]},\n    'unplaced': ['E0', 'E1', 'E3']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 180, True], ['E1', 20, 120, False], ['E2', 20, 180, False], ['E3', 30, 180, False],\n     ['E4', 45, 90, True]],\n    [['R0', 60], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E0': [['R0', 60], ['R2', 20]], 'E3': [['R1', 30]], 'E2': [['R2', 20]]},\n    'unplaced': ['E4', 'E1']}),\n  ('boundary control 4', [[['A', 30, 120, True], ['B', 30, 120, True]], [['R1', 30], ['R2', 40]]],\n   {'placed': {'A': [['R1', 30]], 'B': [['R2', 30]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 180, False], ['E1', 60, 120, True], ['E2', 10, 180, True]],\n    [['R0', 20], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E0': [['R1', 30]], 'E2': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 45, 120, True], ['E1', 80, 120, False], ['E2', 60, 90, False]],\n    [['R0', 40], ['R1', 40], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E0': [['R2', 45]]}, 'unplaced': ['E1', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 80, 120, True]], [['R0', 40], ['R1', 20], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 45, 120, False], ['E1', 45, 90, False], ['E2', 80, 90, True], ['E3', 60, 90, False],\n     ['E4', 80, 180, True]],\n    [['R0', 60], ['R1', 20], ['R2', 20]]],\n   {'placed': {'E2': [['R0', 60], ['R1', 20]]}, 'unplaced': ['E4', 'E3', 'E0', 'E1']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 90, True], ['E1', 30, 120, False], ['E2', 10, 180, True]],\n    [['R0', 50], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 50], ['R1', 10]], 'E2': [['R2', 10]]}, 'unplaced': ['E1']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, False], ['E1', 60, 90, True], ['E2', 10, 120, True], ['E3', 20, 90, False],\n     ['E4', 30, 180, True]],\n    [['R0', 50], ['R1', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]}, 'unplaced': ['E0', 'E4', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 10, 90, True], ['E1', 20, 120, True], ['E2', 80, 120, False], ['E3', 60, 120, True],\n     ['E4', 20, 120, True]],\n    [['R0', 50], ['R1', 20], ['R2', 50], ['R3', 30]]],\n   {'placed': {'E3': [['R0', 50], ['R2', 10]], 'E1': [['R1', 20]], 'E4': [['R3', 20]]},\n    'unplaced': ['E2', 'E0']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 19]]],\n   {'placed': {}, 'unplaced': ['A']}),\n  ('normal control 5',\n   [[['E0', 60, 120, True], ['E1', 45, 120, True]], [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E0': [['R2', 60]], 'E1': [['R3', 45]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 80, 120, False], ['E2', 10, 180, False], ['E3', 45, 120, False],\n     ['E4', 80, 90, False]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 30]]],\n   {'placed': {'E0': [['R0', 40], ['R2', 40]], 'E2': [['R1', 10]]}, 'unplaced': ['E1', 'E4', 'E3']}),\n  ('normal control 7',\n   [[['E0', 30, 180, True], ['E1', 45, 120, False], ['E2', 45, 90, True], ['E3', 60, 120, False],\n     ['E4', 30, 120, True]],\n    [['R0', 30], ['R1', 50]]],\n   {'placed': {'E1': [['R1', 45]], 'E0': [['R0', 30]]}, 'unplaced': ['E3', 'E2', 'E4']}),\n  ('normal control 8',\n   [[['E0', 20, 120, True], ['E1', 60, 180, False], ['E2', 80, 180, False], ['E3', 60, 120, True]],\n    [['R0', 20], ['R1', 20], ['R2', 30], ['R3', 60]]],\n   {'placed': {'E1': [['R3', 60]], 'E3': [['R2', 30], ['R0', 20], ['R1', 10]]}, 'unplaced': ['E2', 'E0']})],\n [('regression: split room duration record 1',\n   [[['E0', 80, 120, True], ['E1', 80, 120, True], ['E2', 20, 180, True], ['E3', 10, 90, True],\n     ['E4', 80, 180, True]],\n    [['R0', 50], ['R1', 60], ['R2', 60]]],\n   {'placed': {'E0': [['R1', 60], ['R2', 20]], 'E1': [['R0', 50], ['R2', 30]]},\n    'unplaced': ['E4', 'E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 20, 120, True], ['E1', 60, 120, False], ['E2', 30, 180, True], ['E3', 80, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 40]]],\n   {'placed': {'E3': [['R1', 50], ['R2', 30]], 'E0': [['R0', 20]]}, 'unplaced': ['E1', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 90, False], ['E1', 45, 120, True], ['E2', 10, 120, True], ['E3', 20, 120, False],\n     ['E4', 20, 90, True]],\n    [['R0', 30], ['R1', 40], ['R2', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R2', 5]], 'E3': [['R0', 20]], 'E2': [['R0', 10]]},\n    'unplaced': ['E0', 'E4']}),\n  ('boundary control 4', [[['A', 30, 120, False], ['B', 30, 90, False]], [['R1', 60]]],\n   {'placed': {'A': [['R1', 30]]}, 'unplaced': ['B']}),\n  ('normal control 5', [[['E0', 30, 120, True], ['E1', 60, 120, True]], [['R0', 30], ['R1', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 45, 180, True], ['E2', 60, 180, False], ['E3', 80, 90, False]],\n    [['R0', 50], ['R1', 50], ['R2', 50], ['R3', 60]]],\n   {'placed': {'E0': [['R3', 60], ['R0', 20]], 'E1': [['R1', 45]]}, 'unplaced': ['E3', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 20, 120, True]], [['R0', 40], ['R1', 30], ['R2', 60], ['R3', 40]]],\n   {'placed': {'E1': [['R1', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 30, 90, False], ['E1', 80, 120, True], ['E2', 20, 90, False], ['E3', 20, 120, False],\n     ['E4', 60, 120, False]],\n    [['R0', 50], ['R1', 20], ['R2', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R2', 30]], 'E2': [['R1', 20]]}, 'unplaced': ['E4', 'E0', 'E3']})]]\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":"2bfa7bdf7a0102ff507576a739b5e4c0dcdd7e4677e6b089227fdbc62baa4b57","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, rooms):\n    rem = {r: c for r, c in rooms}\n    dur = {}\n    place = {}\n    unplaced = []\n    for eid, size, d, split in sorted(exams, key=lambda x: (-x[1], x[0])):\n        ok = [r for r in rem if dur.get(r, d) == d]\n        fit = [r for r in ok if rem[r] >= size]\n        if fit:\n            r = min(fit, key=lambda r: (rem[r], r))\n            place[eid] = [[r, size]]\n            rem[r] -= size\n            dur[r] = d\n            continue\n        if split and sum(rem[r] for r in ok) >= size:\n            parts = []\n            left = size\n            for r in sorted(ok, key=lambda r: (-rem[r], r)):\n                if left == 0:\n                    break\n                take = min(rem[r], left)\n                parts.append([r, take])\n                rem[r] -= take\n                dur[r] = d\n                left -= take\n            place[eid] = parts\n            continue\n        unplaced.append(eid)\n    return {'placed': place, 'unplaced': unplaced}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: split room duration record 1',\n   [[['E0', 80, 180, True], ['E1', 20, 90, True], ['E2', 80, 90, False], ['E3', 80, 90, True]],\n    [['R0', 60], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E0': [['R0', 60], ['R1', 20]], 'E1': [['R2', 20]]}, 'unplaced': ['E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 45, 120, True], ['E1', 20, 90, False], ['E2', 60, 120, True]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 50]]],\n   {'placed': {'E2': [['R3', 50], ['R0', 10]], 'E0': [['R2', 40], ['R0', 5]], 'E1': [['R1', 20]]},\n    'unplaced': []}),\n  ('partial repair guard 3',\n   [[['E0', 45, 180, False], ['E1', 80, 120, True], ['E2', 45, 180, True], ['E3', 20, 180, True],\n     ['E4', 80, 180, True]],\n    [['R0', 30], ['R1', 60], ['R2', 20], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60], ['R0', 20]], 'E3': [['R2', 20]]}, 'unplaced': ['E4', 'E0', 'E2']}),\n  ('boundary control 4', [[['A', 40, 120, False], ['B', 20, 120, False]], [['R1', 60], ['R2', 40]]],\n   {'placed': {'A': [['R2', 40]], 'B': [['R1', 20]]}, 'unplaced': []}),\n  ('normal control 5', [[['E0', 10, 180, True], ['E1', 10, 90, False]], [['R0', 60], ['R1', 60]]],\n   {'placed': {'E0': [['R0', 10]], 'E1': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 30, 180, True], ['E2', 30, 120, True], ['E3', 30, 180, True],\n     ['E4', 60, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 60], ['R3', 30]]],\n   {'placed': {'E4': [['R2', 60]], 'E0': [['R3', 30]], 'E1': [['R1', 30]], 'E3': [['R0', 20], ['R1', 10]]},\n    'unplaced': ['E2']}),\n  ('normal control 7',\n   [[['E0', 10, 90, False], ['E1', 80, 180, True], ['E2', 30, 90, True]], [['R0', 30], ['R1', 20]]],\n   {'placed': {'E2': [['R0', 30]], 'E0': [['R1', 10]]}, 'unplaced': ['E1']}),\n  ('normal control 8',\n   [[['E0', 30, 180, True], ['E1', 10, 120, True], ['E2', 80, 180, True]],\n    [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E2': [['R2', 60], ['R3', 20]], 'E0': [['R3', 30]], 'E1': [['R0', 10]]}, 'unplaced': []})],\n [('regression: split room duration record 1',\n   [[['E0', 10, 120, False], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 30, 120, True],\n     ['E4', 80, 120, False]],\n    [['R0', 60], ['R1', 50], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E1': [['R0', 60]], 'E2': [['R1', 50], ['R2', 10]], 'E3': [['R3', 30]], 'E0': [['R3', 10]]},\n    'unplaced': ['E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 10, 90, True], ['E1', 10, 120, True], ['E2', 30, 120, False], ['E3', 80, 90, False],\n     ['E4', 80, 120, True]],\n    [['R0', 30], ['R1', 40], ['R2', 50]]],\n   {'placed': {'E4': [['R2', 50], ['R1', 30]], 'E2': [['R0', 30]], 'E1': [['R1', 10]]},\n    'unplaced': ['E3', 'E0']}),\n  ('partial repair guard 3',\n   [[['E0', 45, 120, True], ['E1', 80, 90, False], ['E2', 10, 180, False], ['E3', 80, 180, True]],\n    [['R0', 40], ['R1', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 5]]}, 'unplaced': ['E1', 'E3', 'E2']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 20]]],\n   {'placed': {'A': [['R1', 30], ['R2', 20]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 120, True], ['E1', 60, 120, False], ['E2', 60, 90, True], ['E3', 20, 90, True],\n     ['E4', 20, 120, False]],\n    [['R0', 50], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E2': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]},\n    'unplaced': ['E0', 'E4']}),\n  ('normal control 6',\n   [[['E0', 30, 120, True], ['E1', 10, 180, False]], [['R0', 20], ['R1', 30], ['R2', 30]]],\n   {'placed': {'E0': [['R1', 30]], 'E1': [['R0', 10]]}, 'unplaced': []}),\n  ('normal control 7',\n   [[['E0', 30, 120, True], ['E1', 60, 120, True], ['E2', 45, 120, False]],\n    [['R0', 40], ['R1', 60], ['R2', 30], ['R3', 20]]],\n   {'placed': {'E1': [['R1', 60]], 'E0': [['R2', 30]]}, 'unplaced': ['E2']}),\n  ('normal control 8',\n   [[['E0', 80, 120, True], ['E1', 60, 120, True], ['E2', 60, 90, True], ['E3', 20, 180, False],\n     ['E4', 30, 120, False]],\n    [['R0', 40], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 40], ['R1', 40]], 'E3': [['R2', 20]]}, 'unplaced': ['E1', 'E2', 'E4']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 180, True], ['E1', 20, 120, True], ['E2', 10, 120, True], ['E3', 45, 120, True],\n     ['E4', 45, 120, True]],\n    [['R0', 30], ['R1', 20], ['R2', 20], ['R3', 50]]],\n   {'placed': {'E0': [['R3', 50], ['R0', 10]], 'E1': [['R1', 20]], 'E2': [['R2', 10]]},\n    'unplaced': ['E3', 'E4']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, True], ['E1', 30, 90, False], ['E2', 30, 90, True], ['E3', 20, 120, True],\n     ['E4', 80, 120, True]],\n    [['R0', 20], ['R1', 30], ['R2', 60], ['R3', 20]]],\n   {'placed': {'E4': [['R2', 60], ['R1', 20]], 'E2': [['R0', 20], ['R3', 10]]},\n    'unplaced': ['E0', 'E1', 'E3']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 180, True], ['E1', 20, 120, False], ['E2', 20, 180, False], ['E3', 30, 180, False],\n     ['E4', 45, 90, True]],\n    [['R0', 60], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E0': [['R0', 60], ['R2', 20]], 'E3': [['R1', 30]], 'E2': [['R2', 20]]},\n    'unplaced': ['E4', 'E1']}),\n  ('boundary control 4', [[['A', 30, 120, True], ['B', 30, 120, True]], [['R1', 30], ['R2', 40]]],\n   {'placed': {'A': [['R1', 30]], 'B': [['R2', 30]]}, 'unplaced': []}),\n  ('normal control 5',\n   [[['E0', 30, 180, False], ['E1', 60, 120, True], ['E2', 10, 180, True]],\n    [['R0', 20], ['R1', 40], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60]], 'E0': [['R1', 30]], 'E2': [['R1', 10]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 45, 120, True], ['E1', 80, 120, False], ['E2', 60, 90, False]],\n    [['R0', 40], ['R1', 40], ['R2', 50], ['R3', 40]]],\n   {'placed': {'E0': [['R2', 45]]}, 'unplaced': ['E1', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 80, 120, True]], [['R0', 40], ['R1', 20], ['R2', 60]]],\n   {'placed': {'E1': [['R2', 60], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 45, 120, False], ['E1', 45, 90, False], ['E2', 80, 90, True], ['E3', 60, 90, False],\n     ['E4', 80, 180, True]],\n    [['R0', 60], ['R1', 20], ['R2', 20]]],\n   {'placed': {'E2': [['R0', 60], ['R1', 20]]}, 'unplaced': ['E4', 'E3', 'E0', 'E1']})],\n [('regression: split room duration record 1',\n   [[['E0', 60, 90, True], ['E1', 30, 120, False], ['E2', 10, 180, True]],\n    [['R0', 50], ['R1', 40], ['R2', 20]]],\n   {'placed': {'E0': [['R0', 50], ['R1', 10]], 'E2': [['R2', 10]]}, 'unplaced': ['E1']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 60, 120, False], ['E1', 60, 90, True], ['E2', 10, 120, True], ['E3', 20, 90, False],\n     ['E4', 30, 180, True]],\n    [['R0', 50], ['R1', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R1', 10]], 'E3': [['R1', 20]]}, 'unplaced': ['E0', 'E4', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 10, 90, True], ['E1', 20, 120, True], ['E2', 80, 120, False], ['E3', 60, 120, True],\n     ['E4', 20, 120, True]],\n    [['R0', 50], ['R1', 20], ['R2', 50], ['R3', 30]]],\n   {'placed': {'E3': [['R0', 50], ['R2', 10]], 'E1': [['R1', 20]], 'E4': [['R3', 20]]},\n    'unplaced': ['E2', 'E0']}),\n  ('boundary control 4', [[['A', 50, 120, True]], [['R1', 30], ['R2', 19]]],\n   {'placed': {}, 'unplaced': ['A']}),\n  ('normal control 5',\n   [[['E0', 60, 120, True], ['E1', 45, 120, True]], [['R0', 20], ['R1', 20], ['R2', 60], ['R3', 60]]],\n   {'placed': {'E0': [['R2', 60]], 'E1': [['R3', 45]]}, 'unplaced': []}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 80, 120, False], ['E2', 10, 180, False], ['E3', 45, 120, False],\n     ['E4', 80, 90, False]],\n    [['R0', 40], ['R1', 30], ['R2', 40], ['R3', 30]]],\n   {'placed': {'E0': [['R0', 40], ['R2', 40]], 'E2': [['R1', 10]]}, 'unplaced': ['E1', 'E4', 'E3']}),\n  ('normal control 7',\n   [[['E0', 30, 180, True], ['E1', 45, 120, False], ['E2', 45, 90, True], ['E3', 60, 120, False],\n     ['E4', 30, 120, True]],\n    [['R0', 30], ['R1', 50]]],\n   {'placed': {'E1': [['R1', 45]], 'E0': [['R0', 30]]}, 'unplaced': ['E3', 'E2', 'E4']}),\n  ('normal control 8',\n   [[['E0', 20, 120, True], ['E1', 60, 180, False], ['E2', 80, 180, False], ['E3', 60, 120, True]],\n    [['R0', 20], ['R1', 20], ['R2', 30], ['R3', 60]]],\n   {'placed': {'E1': [['R3', 60]], 'E3': [['R2', 30], ['R0', 20], ['R1', 10]]}, 'unplaced': ['E2', 'E0']})],\n [('regression: split room duration record 1',\n   [[['E0', 80, 120, True], ['E1', 80, 120, True], ['E2', 20, 180, True], ['E3', 10, 90, True],\n     ['E4', 80, 180, True]],\n    [['R0', 50], ['R1', 60], ['R2', 60]]],\n   {'placed': {'E0': [['R1', 60], ['R2', 20]], 'E1': [['R0', 50], ['R2', 30]]},\n    'unplaced': ['E4', 'E2', 'E3']}),\n  ('regression variant: split room duration record 2',\n   [[['E0', 20, 120, True], ['E1', 60, 120, False], ['E2', 30, 180, True], ['E3', 80, 120, True]],\n    [['R0', 20], ['R1', 50], ['R2', 40]]],\n   {'placed': {'E3': [['R1', 50], ['R2', 30]], 'E0': [['R0', 20]]}, 'unplaced': ['E1', 'E2']}),\n  ('partial repair guard 3',\n   [[['E0', 80, 90, False], ['E1', 45, 120, True], ['E2', 10, 120, True], ['E3', 20, 120, False],\n     ['E4', 20, 90, True]],\n    [['R0', 30], ['R1', 40], ['R2', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R2', 5]], 'E3': [['R0', 20]], 'E2': [['R0', 10]]},\n    'unplaced': ['E0', 'E4']}),\n  ('boundary control 4', [[['A', 30, 120, False], ['B', 30, 90, False]], [['R1', 60]]],\n   {'placed': {'A': [['R1', 30]]}, 'unplaced': ['B']}),\n  ('normal control 5', [[['E0', 30, 120, True], ['E1', 60, 120, True]], [['R0', 30], ['R1', 40]]],\n   {'placed': {'E1': [['R1', 40], ['R0', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 6',\n   [[['E0', 80, 180, True], ['E1', 45, 180, True], ['E2', 60, 180, False], ['E3', 80, 90, False]],\n    [['R0', 50], ['R1', 50], ['R2', 50], ['R3', 60]]],\n   {'placed': {'E0': [['R3', 60], ['R0', 20]], 'E1': [['R1', 45]]}, 'unplaced': ['E3', 'E2']}),\n  ('normal control 7',\n   [[['E0', 80, 120, False], ['E1', 20, 120, True]], [['R0', 40], ['R1', 30], ['R2', 60], ['R3', 40]]],\n   {'placed': {'E1': [['R1', 20]]}, 'unplaced': ['E0']}),\n  ('normal control 8',\n   [[['E0', 30, 90, False], ['E1', 80, 120, True], ['E2', 20, 90, False], ['E3', 20, 120, False],\n     ['E4', 60, 120, False]],\n    [['R0', 50], ['R1', 20], ['R2', 40]]],\n   {'placed': {'E1': [['R0', 50], ['R2', 30]], 'E2': [['R1', 20]]}, 'unplaced': ['E4', 'E0', 'E3']})]]\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-room-allocation-with-splitting-split-room-duration-record","generated_at":"2026-09-29T14:52:04.031458+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Room allocation rules (mixed durations, best fit, splitting) are the second hard-constraint family of exam timetabling.","repair":"Record the duration on every room that receives part of the split exam.","root_cause":"The split branch does not record the exam duration on the rooms it fills.","sha256":"6f52dc6ee652c483cd1a05526d102bfc3c1d8dbe80c95925d18a3fcc87eb1018","title":"Rooms used by a split exam keep no duration record · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.433,"exit_code":1,"observations":[{"actual":{"placed":{"E0":[["R0",60],["R1",20]],"E3":[["R1",40],["R2",20],["R3",20]]},"unplaced":["E2","E1"]},"check":"regression: split room duration record 1","expected":{"placed":{"E0":[["R0",60],["R1",20]],"E1":[["R2",20]]},"unplaced":["E2","E3"]},"passed":false},{"actual":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R0",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"check":"regression variant: split room duration record 2","expected":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R1",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"passed":false},{"actual":{"placed":{"E1":[["R1",60],["R0",20]],"E2":[["R2",20],["R3",20],["R0",5]]},"unplaced":["E4","E0","E3"]},"check":"partial repair guard 3","expected":{"placed":{"E1":[["R1",60],["R0",20]],"E3":[["R2",20]]},"unplaced":["E4","E0","E2"]},"passed":false},{"actual":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"check":"boundary control 4","expected":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"check":"normal control 5","expected":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"check":"normal control 6","expected":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"passed":true},{"actual":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"check":"normal control 7","expected":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"check":"normal control 8","expected":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: split room duration record 1\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E3\": [[\"R1\", 40], [\"R2\", 20], [\"R3\", 20]]}, \"unplaced\": [\"E2\", \"E1\"]}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E1\": [[\"R2\", 20]]}, \"unplaced\": [\"E2\", \"E3\"]}, \"passed\": false}, {\"check\": \"regression variant: split room duration record 2\", \"actual\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R0\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E2\": [[\"R2\", 20], [\"R3\", 20], [\"R0\", 5]]}, \"unplaced\": [\"E4\", \"E0\", \"E3\"]}, \"expected\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E3\": [[\"R2\", 20]]}, \"unplaced\": [\"E4\", \"E0\", \"E2\"]}, \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"expected\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"expected\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.951,"exit_code":1,"observations":[{"actual":{"placed":{"E0":[["R0",60],["R1",20]],"E3":[["R1",40],["R2",20],["R3",20]]},"unplaced":["E2","E1"]},"check":"regression: split room duration record 1","expected":{"placed":{"E0":[["R0",60],["R1",20]],"E1":[["R2",20]]},"unplaced":["E2","E3"]},"passed":false},{"actual":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R0",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"check":"regression variant: split room duration record 2","expected":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R1",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"passed":false},{"actual":{"placed":{"E1":[["R1",60],["R0",20]],"E2":[["R2",20],["R3",20],["R0",5]]},"unplaced":["E4","E0","E3"]},"check":"partial repair guard 3","expected":{"placed":{"E1":[["R1",60],["R0",20]],"E3":[["R2",20]]},"unplaced":["E4","E0","E2"]},"passed":false},{"actual":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"check":"boundary control 4","expected":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"check":"normal control 5","expected":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"check":"normal control 6","expected":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"passed":true},{"actual":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"check":"normal control 7","expected":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"check":"normal control 8","expected":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: split room duration record 1\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E3\": [[\"R1\", 40], [\"R2\", 20], [\"R3\", 20]]}, \"unplaced\": [\"E2\", \"E1\"]}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E1\": [[\"R2\", 20]]}, \"unplaced\": [\"E2\", \"E3\"]}, \"passed\": false}, {\"check\": \"regression variant: split room duration record 2\", \"actual\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R0\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E2\": [[\"R2\", 20], [\"R3\", 20], [\"R0\", 5]]}, \"unplaced\": [\"E4\", \"E0\", \"E3\"]}, \"expected\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E3\": [[\"R2\", 20]]}, \"unplaced\": [\"E4\", \"E0\", \"E2\"]}, \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"expected\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"expected\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.029,"exit_code":0,"observations":[{"actual":{"placed":{"E0":[["R0",60],["R1",20]],"E1":[["R2",20]]},"unplaced":["E2","E3"]},"check":"regression: split room duration record 1","expected":{"placed":{"E0":[["R0",60],["R1",20]],"E1":[["R2",20]]},"unplaced":["E2","E3"]},"passed":true},{"actual":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R1",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"check":"regression variant: split room duration record 2","expected":{"placed":{"E0":[["R2",40],["R0",5]],"E1":[["R1",20]],"E2":[["R3",50],["R0",10]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E1":[["R1",60],["R0",20]],"E3":[["R2",20]]},"unplaced":["E4","E0","E2"]},"check":"partial repair guard 3","expected":{"placed":{"E1":[["R1",60],["R0",20]],"E3":[["R2",20]]},"unplaced":["E4","E0","E2"]},"passed":true},{"actual":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"check":"boundary control 4","expected":{"placed":{"A":[["R2",40]],"B":[["R1",20]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"check":"normal control 5","expected":{"placed":{"E0":[["R0",10]],"E1":[["R1",10]]},"unplaced":[]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"check":"normal control 6","expected":{"placed":{"E0":[["R3",30]],"E1":[["R1",30]],"E3":[["R0",20],["R1",10]],"E4":[["R2",60]]},"unplaced":["E2"]},"passed":true},{"actual":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"check":"normal control 7","expected":{"placed":{"E0":[["R1",10]],"E2":[["R0",30]]},"unplaced":["E1"]},"passed":true},{"actual":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"check":"normal control 8","expected":{"placed":{"E0":[["R3",30]],"E1":[["R0",10]],"E2":[["R2",60],["R3",20]]},"unplaced":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: split room duration record 1\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E1\": [[\"R2\", 20]]}, \"unplaced\": [\"E2\", \"E3\"]}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 60], [\"R1\", 20]], \"E1\": [[\"R2\", 20]]}, \"unplaced\": [\"E2\", \"E3\"]}, \"passed\": true}, {\"check\": \"regression variant: split room duration record 2\", \"actual\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R1\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R3\", 50], [\"R0\", 10]], \"E0\": [[\"R2\", 40], [\"R0\", 5]], \"E1\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E3\": [[\"R2\", 20]]}, \"unplaced\": [\"E4\", \"E0\", \"E2\"]}, \"expected\": {\"placed\": {\"E1\": [[\"R1\", 60], [\"R0\", 20]], \"E3\": [[\"R2\", 20]]}, \"unplaced\": [\"E4\", \"E0\", \"E2\"]}, \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"A\": [[\"R2\", 40]], \"B\": [[\"R1\", 20]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E0\": [[\"R0\", 10]], \"E1\": [[\"R1\", 10]]}, \"unplaced\": []}, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"expected\": {\"placed\": {\"E4\": [[\"R2\", 60]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R1\", 30]], \"E3\": [[\"R0\", 20], [\"R1\", 10]]}, \"unplaced\": [\"E2\"]}, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"expected\": {\"placed\": {\"E2\": [[\"R0\", 30]], \"E0\": [[\"R1\", 10]]}, \"unplaced\": [\"E1\"]}, \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"expected\": {\"placed\": {\"E2\": [[\"R2\", 60], [\"R3\", 20]], \"E0\": [[\"R3\", 30]], \"E1\": [[\"R0\", 10]]}, \"unplaced\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}