{"abstract":"A Friday-evening restriction is enforced on Saturday.","category":"Exam timetabling constraints","checks":8,"contract":"sits [student, exam, period]; periods index -> [weekday 0=Mon..6=Sun, slot am/pm/eve]; avoid student -> rules \"day\" (whole day) or \"day-slot\" (that slot and later slots that day). Each sitting matching any rule is reported once as [student, exam, period]; return rows sorted.","contract_signature":"sits, periods, avoid","evaluation_group":"w2-exam-timetabling-constraints-observance-unavailability","failed_approach":"Shifting the index forward moves the restriction the other way.","family":"w2-exam-timetabling-constraints-observance-unavailability-weekday-names","id":"FA-94716","implementations":{"attempt":{"sha256":"3e026fe664e40339ab058076206d1274f3492548cf6dad85c07a4b02f221cd2a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, periods, avoid):\n    names = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\n    order = ['am', 'pm', 'eve']\n    out = []\n    for st, ex, p in sits:\n        wd, slot = periods[p]\n        for rule in avoid.get(st, []):\n            parts = rule.split('-')\n            if parts[0] != names[(wd + 1) % 7]:\n                continue\n            if len(parts) == 1 or order.index(slot) >= order.index(parts[1]):\n                out.append([st, ex, p])\n                break\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: weekday names 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101', 0], ['s1', 'CHEM120', 2], ['s3', 'MATH101', 1], ['s2', 'CHEM120', 1],\n     ['s1', 'BIO130', 2]],\n    [[3, 'am'], [4, 'eve'], [1, 'eve'], [1, 'pm'], [0, 'pm'], [4, 'am']],\n    {'s1': ['sat'], 's3': ['fri', 'sun-am']}],\n   [['s3', 'MATH101', 1]]),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101', 0]], [[5, 'eve'], [0, 'pm'], [2, 'am'], [5, 'eve'], [1, 'eve'], [3, 'am']],\n    {'s1': ['fri', 'fri-eve'], 's3': ['sun-am']}],\n   []),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'CHEM120', 3], ['s1', 'BIO130', 4], ['s2', 'ECON150', 4], ['s1', 'HIST140', 0],\n     ['s1', 'CHEM120', 1]],\n    [[6, 'pm'], [3, 'pm'], [5, 'pm'], [0, 'eve'], [6, 'am'], [1, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['sat', 'fri-pm', 'fri']}],\n   [['s1', 'BIO130', 4], ['s1', 'CHEM120', 3], ['s1', 'HIST140', 0]]),\n  ('normal control 6',\n   [[['s1', 'PHYS110', 1], ['s3', 'CHEM120', 4], ['s3', 'MATH101H', 2], ['s3', 'MATH101', 3]],\n    [[1, 'am'], [1, 'pm'], [6, 'pm'], [1, 'pm'], [2, 'eve'], [3, 'pm']],\n    {'s1': ['fri', 'mon-eve'], 's2': ['mon-eve', 'sun-am'], 's3': ['sat']}],\n   []),\n  ('normal control 7',\n   [[['s1', 'ECON150', 3]], [[2, 'eve'], [6, 'pm'], [0, 'eve'], [3, 'eve'], [4, 'pm'], [0, 'pm']],\n    {'s3': ['fri', 'mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'ECON150', 2], ['s1', 'ECON150', 1], ['s3', 'PHYS110', 2], ['s1', 'BIO130', 0]],\n    [[4, 'pm'], [4, 'eve'], [2, 'am'], [0, 'am'], [6, 'pm'], [5, 'pm']],\n    {'s1': ['mon-eve', 'sun-am', 'fri'], 's2': ['fri', 'sun-am', 'fri-eve'], 's3': ['sun-am', 'fri']}],\n   [['s1', 'BIO130', 0], ['s1', 'ECON150', 1]])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101H', 2]], [[3, 'pm'], [4, 'pm'], [1, 'eve'], [5, 'am'], [3, 'am'], [2, 'pm']],\n    {'s1': ['sun-am'], 's2': ['mon-eve', 'fri-eve'], 's3': ['mon-eve', 'fri']}],\n   []),\n  ('partial repair guard 3',\n   [[['s2', 'MATH101', 2], ['s3', 'MATH101', 3], ['s3', 'BIO130', 3], ['s1', 'ECON150', 2],\n     ['s3', 'BIO130', 1], ['s1', 'BIO130', 1]],\n    [[2, 'am'], [5, 'pm'], [0, 'am'], [5, 'pm'], [6, 'pm'], [6, 'am']],\n    {'s2': ['sat', 'fri-pm', 'fri'], 's3': ['fri-pm', 'fri-eve', 'sat']}],\n   [['s3', 'BIO130', 1], ['s3', 'BIO130', 3], ['s3', 'MATH101', 3]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'am']], {'s1': ['fri-pm']}], []),\n  ('normal control 5',\n   [[['s2', 'HIST140', 1], ['s1', 'MATH101', 1], ['s2', 'HIST140', 5]],\n    [[4, 'pm'], [4, 'am'], [2, 'eve'], [5, 'eve'], [0, 'am'], [2, 'pm']],\n    {'s1': ['fri', 'fri-pm'], 's2': ['fri-eve', 'fri', 'mon-eve'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101', 1], ['s2', 'HIST140', 1]]),\n  ('normal control 6',\n   [[['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0], ['s2', 'PHYS110', 4],\n     ['s2', 'BIO130', 1]],\n    [[6, 'eve'], [5, 'am'], [5, 'eve'], [0, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['sat', 'mon-eve'], 's2': ['fri'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0]]),\n  ('normal control 7',\n   [[['s3', 'CHEM120', 4], ['s3', 'BIO130', 4]],\n    [[1, 'eve'], [0, 'am'], [0, 'am'], [5, 'am'], [0, 'eve'], [2, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['fri-eve', 'mon-eve', 'fri-pm'], 's3': ['sat']}],\n   []),\n  ('normal control 8',\n   [[['s2', 'BIO130', 1], ['s1', 'ECON150', 2]],\n    [[4, 'pm'], [5, 'eve'], [0, 'eve'], [5, 'am'], [1, 'am'], [0, 'pm']],\n    {'s1': ['sat'], 's2': ['fri'], 's3': ['mon-eve']}],\n   [])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s1', 'HIST140', 2], ['s3', 'MATH101H', 1], ['s1', 'CHEM120', 4], ['s2', 'CHEM120', 4],\n     ['s2', 'MATH101', 4], ['s3', 'MATH101H', 5]],\n    [[0, 'eve'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [5, 'pm'], [0, 'pm']],\n    {'s1': ['fri-eve', 'sat', 'mon-eve'],\n     's2': ['mon-eve', 'fri', 'sun-am'],\n     's3': ['sun-am', 'fri-pm', 'fri']}],\n   [['s1', 'CHEM120', 4], ['s3', 'MATH101H', 1]]),\n  ('partial repair guard 3',\n   [[['s3', 'PHYS110', 2], ['s2', 'BIO130', 4]],\n    [[3, 'pm'], [5, 'pm'], [0, 'pm'], [5, 'am'], [5, 'eve'], [4, 'am']],\n    {'s2': ['fri', 'sat', 'fri-pm'], 's3': ['sat', 'fri-eve', 'mon-eve']}],\n   [['s2', 'BIO130', 4]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('normal control 5',\n   [[['s3', 'MATH101H', 4], ['s2', 'PHYS110', 1]],\n    [[4, 'am'], [2, 'am'], [4, 'am'], [0, 'eve'], [0, 'eve'], [5, 'pm']],\n    {'s1': ['fri-pm', 'sat', 'fri-eve'], 's2': ['fri', 'sun-am', 'sat'], 's3': ['fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 2], ['s2', 'CHEM120', 3], ['s3', 'PHYS110', 3], ['s3', 'BIO130', 5],\n     ['s3', 'BIO130', 2], ['s3', 'MATH101H', 1]],\n    [[4, 'eve'], [6, 'am'], [2, 'am'], [2, 'am'], [1, 'am'], [4, 'eve']],\n    {'s1': ['sat', 'fri-pm', 'mon-eve'], 's2': ['mon-eve'], 's3': ['fri']}],\n   [['s3', 'BIO130', 5]]),\n  ('normal control 7',\n   [[['s1', 'MATH101', 5], ['s3', 'ECON150', 4], ['s1', 'ECON150', 5], ['s3', 'MATH101H', 3],\n     ['s1', 'MATH101H', 1], ['s3', 'PHYS110', 3]],\n    [[1, 'eve'], [3, 'am'], [2, 'pm'], [3, 'am'], [3, 'eve'], [4, 'pm']],\n    {'s1': ['sun-am', 'mon-eve'], 's2': ['mon-eve', 'sun-am', 'fri'], 's3': ['fri-eve', 'sun-am', 'fri']}],\n   []),\n  ('normal control 8',\n   [[['s3', 'PHYS110', 2], ['s2', 'HIST140', 4], ['s2', 'MATH101', 0]],\n    [[3, 'pm'], [1, 'am'], [6, 'am'], [0, 'pm'], [5, 'pm'], [5, 'am']],\n    {'s1': ['fri-pm'], 's2': ['fri', 'mon-eve'], 's3': ['fri-pm', 'sun-am', 'mon-eve']}],\n   [['s3', 'PHYS110', 2]])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('regression variant: weekday names 2',\n   [[['s2', 'ECON150', 5]], [[1, 'pm'], [2, 'eve'], [4, 'pm'], [4, 'am'], [1, 'eve'], [1, 'eve']],\n    {'s1': ['sat', 'fri-pm', 'fri'], 's2': ['mon-eve'], 's3': ['fri-pm', 'mon-eve', 'fri-eve']}],\n   []),\n  ('partial repair guard 3',\n   [[['s3', 'PHYS110', 2], ['s2', 'MATH101', 1], ['s3', 'PHYS110', 5], ['s1', 'MATH101H', 1],\n     ['s2', 'CHEM120', 5], ['s1', 'MATH101', 0]],\n    [[4, 'eve'], [4, 'pm'], [0, 'pm'], [2, 'eve'], [0, 'am'], [4, 'pm']],\n    {'s1': ['sun-am', 'mon-eve'], 's2': ['sat', 'mon-eve'], 's3': ['sun-am']}],\n   []),\n  ('boundary control 4', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'ECON150', 5], ['s1', 'HIST140', 0], ['s3', 'CHEM120', 2], ['s1', 'HIST140', 4],\n     ['s3', 'ECON150', 2]],\n    [[2, 'eve'], [5, 'pm'], [6, 'pm'], [6, 'eve'], [1, 'am'], [0, 'am']],\n    {'s1': ['sat'], 's2': ['fri', 'fri-eve', 'sat']}],\n   []),\n  ('normal control 6',\n   [[['s2', 'MATH101H', 2], ['s1', 'ECON150', 1], ['s1', 'ECON150', 2]],\n    [[3, 'eve'], [5, 'am'], [2, 'am'], [2, 'pm'], [4, 'am'], [2, 'pm']],\n    {'s1': ['fri', 'sat'], 's2': ['fri-eve', 'sun-am', 'fri'], 's3': ['fri', 'sun-am', 'mon-eve']}],\n   [['s1', 'ECON150', 1]]),\n  ('normal control 7',\n   [[['s1', 'CHEM120', 5], ['s3', 'CHEM120', 4], ['s2', 'CHEM120', 4], ['s1', 'PHYS110', 4]],\n    [[5, 'eve'], [3, 'am'], [6, 'am'], [5, 'am'], [1, 'am'], [3, 'pm']],\n    {'s1': ['fri'], 's2': ['mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 8',\n   [[['s2', 'MATH101H', 5], ['s1', 'BIO130', 1], ['s3', 'MATH101', 3], ['s3', 'ECON150', 1],\n     ['s3', 'PHYS110', 1]],\n    [[1, 'pm'], [5, 'am'], [6, 'eve'], [5, 'eve'], [3, 'am'], [5, 'pm']], {'s3': ['fri-pm']}],\n   [])],\n [('regression: weekday names 1',\n   [[['s2', 'PHYS110', 4], ['s3', 'BIO130', 3], ['s1', 'CHEM120', 1], ['s1', 'HIST140', 5],\n     ['s3', 'HIST140', 3], ['s3', 'HIST140', 5]],\n    [[5, 'eve'], [3, 'eve'], [1, 'eve'], [6, 'eve'], [0, 'am'], [5, 'am']],\n    {'s1': ['mon-eve', 'sat'], 's2': ['fri-pm'], 's3': ['mon-eve', 'sun-am']}],\n   [['s1', 'HIST140', 5], ['s3', 'BIO130', 3], ['s3', 'HIST140', 3]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101', 1], ['s2', 'PHYS110', 0], ['s2', 'MATH101H', 4], ['s1', 'HIST140', 4],\n     ['s3', 'BIO130', 1], ['s1', 'ECON150', 5]],\n    [[4, 'eve'], [5, 'pm'], [1, 'am'], [1, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['fri-eve'], 's2': ['sun-am', 'fri', 'mon-eve'], 's3': ['mon-eve', 'fri-eve', 'fri-pm']}],\n   [['s2', 'PHYS110', 0]]),\n  ('partial repair guard 3',\n   [[['s1', 'PHYS110', 2], ['s3', 'HIST140', 0], ['s3', 'PHYS110', 1]],\n    [[0, 'pm'], [5, 'pm'], [4, 'eve'], [6, 'am'], [6, 'am'], [0, 'pm']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-pm', 'sun-am', 'fri-eve']}],\n   [['s1', 'PHYS110', 2]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'MATH101H', 3], ['s3', 'MATH101H', 4], ['s2', 'CHEM120', 1]],\n    [[2, 'eve'], [4, 'pm'], [6, 'pm'], [2, 'eve'], [2, 'am'], [0, 'eve']], {'s3': ['fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s2', 'PHYS110', 4], ['s1', 'ECON150', 0], ['s2', 'ECON150', 2], ['s3', 'PHYS110', 4],\n     ['s2', 'HIST140', 0]],\n    [[3, 'pm'], [0, 'pm'], [5, 'pm'], [1, 'pm'], [1, 'pm'], [4, 'am']],\n    {'s1': ['fri', 'mon-eve', 'fri-pm'], 's2': ['sat'], 's3': ['sat', 'fri', 'sun-am']}],\n   [['s2', 'ECON150', 2]]),\n  ('normal control 7',\n   [[['s2', 'MATH101H', 0], ['s1', 'CHEM120', 4], ['s1', 'HIST140', 2], ['s2', 'BIO130', 3]],\n    [[4, 'am'], [3, 'pm'], [6, 'eve'], [3, 'pm'], [4, 'pm'], [4, 'pm']],\n    {'s1': ['fri-pm'], 's2': ['fri'], 's3': ['fri-pm', 'mon-eve', 'sun-am']}],\n   [['s1', 'CHEM120', 4], ['s2', 'MATH101H', 0]]),\n  ('normal control 8',\n   [[['s1', 'BIO130', 3]], [[5, 'am'], [5, 'am'], [0, 'am'], [1, 'pm'], [3, 'am'], [6, 'am']],\n    {'s2': ['sun-am', 'sat', 'mon-eve'], 's3': ['sat', 'sun-am']}],\n   [])]]\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":"d1e312502654c5cd17334a677dc09872d58c116b2d649f179874140bf8dda3fe","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, periods, avoid):\n    names = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']\n    order = ['am', 'pm', 'eve']\n    out = []\n    for st, ex, p in sits:\n        wd, slot = periods[p]\n        for rule in avoid.get(st, []):\n            parts = rule.split('-')\n            if parts[0] != names[wd]:\n                continue\n            if len(parts) == 1 or order.index(slot) >= order.index(parts[1]):\n                out.append([st, ex, p])\n                break\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: weekday names 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101', 0], ['s1', 'CHEM120', 2], ['s3', 'MATH101', 1], ['s2', 'CHEM120', 1],\n     ['s1', 'BIO130', 2]],\n    [[3, 'am'], [4, 'eve'], [1, 'eve'], [1, 'pm'], [0, 'pm'], [4, 'am']],\n    {'s1': ['sat'], 's3': ['fri', 'sun-am']}],\n   [['s3', 'MATH101', 1]]),\n  ('partial repair guard 3',\n   [[['s3', 'MATH101', 0]], [[5, 'eve'], [0, 'pm'], [2, 'am'], [5, 'eve'], [1, 'eve'], [3, 'am']],\n    {'s1': ['fri', 'fri-eve'], 's3': ['sun-am']}],\n   []),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'CHEM120', 3], ['s1', 'BIO130', 4], ['s2', 'ECON150', 4], ['s1', 'HIST140', 0],\n     ['s1', 'CHEM120', 1]],\n    [[6, 'pm'], [3, 'pm'], [5, 'pm'], [0, 'eve'], [6, 'am'], [1, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['sat', 'fri-pm', 'fri']}],\n   [['s1', 'BIO130', 4], ['s1', 'CHEM120', 3], ['s1', 'HIST140', 0]]),\n  ('normal control 6',\n   [[['s1', 'PHYS110', 1], ['s3', 'CHEM120', 4], ['s3', 'MATH101H', 2], ['s3', 'MATH101', 3]],\n    [[1, 'am'], [1, 'pm'], [6, 'pm'], [1, 'pm'], [2, 'eve'], [3, 'pm']],\n    {'s1': ['fri', 'mon-eve'], 's2': ['mon-eve', 'sun-am'], 's3': ['sat']}],\n   []),\n  ('normal control 7',\n   [[['s1', 'ECON150', 3]], [[2, 'eve'], [6, 'pm'], [0, 'eve'], [3, 'eve'], [4, 'pm'], [0, 'pm']],\n    {'s3': ['fri', 'mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'ECON150', 2], ['s1', 'ECON150', 1], ['s3', 'PHYS110', 2], ['s1', 'BIO130', 0]],\n    [[4, 'pm'], [4, 'eve'], [2, 'am'], [0, 'am'], [6, 'pm'], [5, 'pm']],\n    {'s1': ['mon-eve', 'sun-am', 'fri'], 's2': ['fri', 'sun-am', 'fri-eve'], 's3': ['sun-am', 'fri']}],\n   [['s1', 'BIO130', 0], ['s1', 'ECON150', 1]])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101H', 2]], [[3, 'pm'], [4, 'pm'], [1, 'eve'], [5, 'am'], [3, 'am'], [2, 'pm']],\n    {'s1': ['sun-am'], 's2': ['mon-eve', 'fri-eve'], 's3': ['mon-eve', 'fri']}],\n   []),\n  ('partial repair guard 3',\n   [[['s2', 'MATH101', 2], ['s3', 'MATH101', 3], ['s3', 'BIO130', 3], ['s1', 'ECON150', 2],\n     ['s3', 'BIO130', 1], ['s1', 'BIO130', 1]],\n    [[2, 'am'], [5, 'pm'], [0, 'am'], [5, 'pm'], [6, 'pm'], [6, 'am']],\n    {'s2': ['sat', 'fri-pm', 'fri'], 's3': ['fri-pm', 'fri-eve', 'sat']}],\n   [['s3', 'BIO130', 1], ['s3', 'BIO130', 3], ['s3', 'MATH101', 3]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'am']], {'s1': ['fri-pm']}], []),\n  ('normal control 5',\n   [[['s2', 'HIST140', 1], ['s1', 'MATH101', 1], ['s2', 'HIST140', 5]],\n    [[4, 'pm'], [4, 'am'], [2, 'eve'], [5, 'eve'], [0, 'am'], [2, 'pm']],\n    {'s1': ['fri', 'fri-pm'], 's2': ['fri-eve', 'fri', 'mon-eve'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101', 1], ['s2', 'HIST140', 1]]),\n  ('normal control 6',\n   [[['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0], ['s2', 'PHYS110', 4],\n     ['s2', 'BIO130', 1]],\n    [[6, 'eve'], [5, 'am'], [5, 'eve'], [0, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['sat', 'mon-eve'], 's2': ['fri'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0]]),\n  ('normal control 7',\n   [[['s3', 'CHEM120', 4], ['s3', 'BIO130', 4]],\n    [[1, 'eve'], [0, 'am'], [0, 'am'], [5, 'am'], [0, 'eve'], [2, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['fri-eve', 'mon-eve', 'fri-pm'], 's3': ['sat']}],\n   []),\n  ('normal control 8',\n   [[['s2', 'BIO130', 1], ['s1', 'ECON150', 2]],\n    [[4, 'pm'], [5, 'eve'], [0, 'eve'], [5, 'am'], [1, 'am'], [0, 'pm']],\n    {'s1': ['sat'], 's2': ['fri'], 's3': ['mon-eve']}],\n   [])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: weekday names 2',\n   [[['s1', 'HIST140', 2], ['s3', 'MATH101H', 1], ['s1', 'CHEM120', 4], ['s2', 'CHEM120', 4],\n     ['s2', 'MATH101', 4], ['s3', 'MATH101H', 5]],\n    [[0, 'eve'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [5, 'pm'], [0, 'pm']],\n    {'s1': ['fri-eve', 'sat', 'mon-eve'],\n     's2': ['mon-eve', 'fri', 'sun-am'],\n     's3': ['sun-am', 'fri-pm', 'fri']}],\n   [['s1', 'CHEM120', 4], ['s3', 'MATH101H', 1]]),\n  ('partial repair guard 3',\n   [[['s3', 'PHYS110', 2], ['s2', 'BIO130', 4]],\n    [[3, 'pm'], [5, 'pm'], [0, 'pm'], [5, 'am'], [5, 'eve'], [4, 'am']],\n    {'s2': ['fri', 'sat', 'fri-pm'], 's3': ['sat', 'fri-eve', 'mon-eve']}],\n   [['s2', 'BIO130', 4]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('normal control 5',\n   [[['s3', 'MATH101H', 4], ['s2', 'PHYS110', 1]],\n    [[4, 'am'], [2, 'am'], [4, 'am'], [0, 'eve'], [0, 'eve'], [5, 'pm']],\n    {'s1': ['fri-pm', 'sat', 'fri-eve'], 's2': ['fri', 'sun-am', 'sat'], 's3': ['fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 2], ['s2', 'CHEM120', 3], ['s3', 'PHYS110', 3], ['s3', 'BIO130', 5],\n     ['s3', 'BIO130', 2], ['s3', 'MATH101H', 1]],\n    [[4, 'eve'], [6, 'am'], [2, 'am'], [2, 'am'], [1, 'am'], [4, 'eve']],\n    {'s1': ['sat', 'fri-pm', 'mon-eve'], 's2': ['mon-eve'], 's3': ['fri']}],\n   [['s3', 'BIO130', 5]]),\n  ('normal control 7',\n   [[['s1', 'MATH101', 5], ['s3', 'ECON150', 4], ['s1', 'ECON150', 5], ['s3', 'MATH101H', 3],\n     ['s1', 'MATH101H', 1], ['s3', 'PHYS110', 3]],\n    [[1, 'eve'], [3, 'am'], [2, 'pm'], [3, 'am'], [3, 'eve'], [4, 'pm']],\n    {'s1': ['sun-am', 'mon-eve'], 's2': ['mon-eve', 'sun-am', 'fri'], 's3': ['fri-eve', 'sun-am', 'fri']}],\n   []),\n  ('normal control 8',\n   [[['s3', 'PHYS110', 2], ['s2', 'HIST140', 4], ['s2', 'MATH101', 0]],\n    [[3, 'pm'], [1, 'am'], [6, 'am'], [0, 'pm'], [5, 'pm'], [5, 'am']],\n    {'s1': ['fri-pm'], 's2': ['fri', 'mon-eve'], 's3': ['fri-pm', 'sun-am', 'mon-eve']}],\n   [['s3', 'PHYS110', 2]])],\n [('regression: weekday names 1', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('regression variant: weekday names 2',\n   [[['s2', 'ECON150', 5]], [[1, 'pm'], [2, 'eve'], [4, 'pm'], [4, 'am'], [1, 'eve'], [1, 'eve']],\n    {'s1': ['sat', 'fri-pm', 'fri'], 's2': ['mon-eve'], 's3': ['fri-pm', 'mon-eve', 'fri-eve']}],\n   []),\n  ('partial repair guard 3',\n   [[['s3', 'PHYS110', 2], ['s2', 'MATH101', 1], ['s3', 'PHYS110', 5], ['s1', 'MATH101H', 1],\n     ['s2', 'CHEM120', 5], ['s1', 'MATH101', 0]],\n    [[4, 'eve'], [4, 'pm'], [0, 'pm'], [2, 'eve'], [0, 'am'], [4, 'pm']],\n    {'s1': ['sun-am', 'mon-eve'], 's2': ['sat', 'mon-eve'], 's3': ['sun-am']}],\n   []),\n  ('boundary control 4', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'ECON150', 5], ['s1', 'HIST140', 0], ['s3', 'CHEM120', 2], ['s1', 'HIST140', 4],\n     ['s3', 'ECON150', 2]],\n    [[2, 'eve'], [5, 'pm'], [6, 'pm'], [6, 'eve'], [1, 'am'], [0, 'am']],\n    {'s1': ['sat'], 's2': ['fri', 'fri-eve', 'sat']}],\n   []),\n  ('normal control 6',\n   [[['s2', 'MATH101H', 2], ['s1', 'ECON150', 1], ['s1', 'ECON150', 2]],\n    [[3, 'eve'], [5, 'am'], [2, 'am'], [2, 'pm'], [4, 'am'], [2, 'pm']],\n    {'s1': ['fri', 'sat'], 's2': ['fri-eve', 'sun-am', 'fri'], 's3': ['fri', 'sun-am', 'mon-eve']}],\n   [['s1', 'ECON150', 1]]),\n  ('normal control 7',\n   [[['s1', 'CHEM120', 5], ['s3', 'CHEM120', 4], ['s2', 'CHEM120', 4], ['s1', 'PHYS110', 4]],\n    [[5, 'eve'], [3, 'am'], [6, 'am'], [5, 'am'], [1, 'am'], [3, 'pm']],\n    {'s1': ['fri'], 's2': ['mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 8',\n   [[['s2', 'MATH101H', 5], ['s1', 'BIO130', 1], ['s3', 'MATH101', 3], ['s3', 'ECON150', 1],\n     ['s3', 'PHYS110', 1]],\n    [[1, 'pm'], [5, 'am'], [6, 'eve'], [5, 'eve'], [3, 'am'], [5, 'pm']], {'s3': ['fri-pm']}],\n   [])],\n [('regression: weekday names 1',\n   [[['s2', 'PHYS110', 4], ['s3', 'BIO130', 3], ['s1', 'CHEM120', 1], ['s1', 'HIST140', 5],\n     ['s3', 'HIST140', 3], ['s3', 'HIST140', 5]],\n    [[5, 'eve'], [3, 'eve'], [1, 'eve'], [6, 'eve'], [0, 'am'], [5, 'am']],\n    {'s1': ['mon-eve', 'sat'], 's2': ['fri-pm'], 's3': ['mon-eve', 'sun-am']}],\n   [['s1', 'HIST140', 5], ['s3', 'BIO130', 3], ['s3', 'HIST140', 3]]),\n  ('regression variant: weekday names 2',\n   [[['s3', 'MATH101', 1], ['s2', 'PHYS110', 0], ['s2', 'MATH101H', 4], ['s1', 'HIST140', 4],\n     ['s3', 'BIO130', 1], ['s1', 'ECON150', 5]],\n    [[4, 'eve'], [5, 'pm'], [1, 'am'], [1, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['fri-eve'], 's2': ['sun-am', 'fri', 'mon-eve'], 's3': ['mon-eve', 'fri-eve', 'fri-pm']}],\n   [['s2', 'PHYS110', 0]]),\n  ('partial repair guard 3',\n   [[['s1', 'PHYS110', 2], ['s3', 'HIST140', 0], ['s3', 'PHYS110', 1]],\n    [[0, 'pm'], [5, 'pm'], [4, 'eve'], [6, 'am'], [6, 'am'], [0, 'pm']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-pm', 'sun-am', 'fri-eve']}],\n   [['s1', 'PHYS110', 2]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s1', 'MATH101H', 3], ['s3', 'MATH101H', 4], ['s2', 'CHEM120', 1]],\n    [[2, 'eve'], [4, 'pm'], [6, 'pm'], [2, 'eve'], [2, 'am'], [0, 'eve']], {'s3': ['fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s2', 'PHYS110', 4], ['s1', 'ECON150', 0], ['s2', 'ECON150', 2], ['s3', 'PHYS110', 4],\n     ['s2', 'HIST140', 0]],\n    [[3, 'pm'], [0, 'pm'], [5, 'pm'], [1, 'pm'], [1, 'pm'], [4, 'am']],\n    {'s1': ['fri', 'mon-eve', 'fri-pm'], 's2': ['sat'], 's3': ['sat', 'fri', 'sun-am']}],\n   [['s2', 'ECON150', 2]]),\n  ('normal control 7',\n   [[['s2', 'MATH101H', 0], ['s1', 'CHEM120', 4], ['s1', 'HIST140', 2], ['s2', 'BIO130', 3]],\n    [[4, 'am'], [3, 'pm'], [6, 'eve'], [3, 'pm'], [4, 'pm'], [4, 'pm']],\n    {'s1': ['fri-pm'], 's2': ['fri'], 's3': ['fri-pm', 'mon-eve', 'sun-am']}],\n   [['s1', 'CHEM120', 4], ['s2', 'MATH101H', 0]]),\n  ('normal control 8',\n   [[['s1', 'BIO130', 3]], [[5, 'am'], [5, 'am'], [0, 'am'], [1, 'pm'], [3, 'am'], [6, 'am']],\n    {'s2': ['sun-am', 'sat', 'mon-eve'], 's3': ['sat', 'sun-am']}],\n   [])]]\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-observance-unavailability-weekday-names","generated_at":"2026-09-29T14:52:06.948927+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Religious-observance and other unavailability constraints are student-specific hard constraints.","root_cause":"Weekday index 0 is named Sunday although periods use Monday = 0.","sha256":"ed5474569f11b454c940e3d99087081110b81a02efd0496f631a4323eb142abc","title":"Weekday names mapped with a Sunday-first table · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":40.173,"exit_code":1,"observations":[{"actual":[],"check":"regression: weekday names 1","expected":[["s1","A",0]],"passed":false},{"actual":[["s3","MATH101",0]],"check":"regression variant: weekday names 2","expected":[["s3","MATH101",1]],"passed":false},{"actual":[["s3","MATH101",0]],"check":"partial repair guard 3","expected":[],"passed":false},{"actual":[],"check":"boundary control 4","expected":[["s1","A",0]],"passed":false},{"actual":[["s1","CHEM120",1]],"check":"normal control 5","expected":[["s1","BIO130",4],["s1","CHEM120",3],["s1","HIST140",0]],"passed":false},{"actual":[],"check":"normal control 6","expected":[],"passed":true},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[],"check":"normal control 8","expected":[["s1","BIO130",0],["s1","ECON150",1]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: weekday names 1\", \"actual\": [], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": false}, {\"check\": \"regression variant: weekday names 2\", \"actual\": [[\"s3\", \"MATH101\", 0]], \"expected\": [[\"s3\", \"MATH101\", 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"s3\", \"MATH101\", 0]], \"expected\": [], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[\"s1\", \"CHEM120\", 1]], \"expected\": [[\"s1\", \"BIO130\", 4], [\"s1\", \"CHEM120\", 3], [\"s1\", \"HIST140\", 0]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [], \"expected\": [[\"s1\", \"BIO130\", 0], [\"s1\", \"ECON150\", 1]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.292,"exit_code":1,"observations":[{"actual":[],"check":"regression: weekday names 1","expected":[["s1","A",0]],"passed":false},{"actual":[],"check":"regression variant: weekday names 2","expected":[["s3","MATH101",1]],"passed":false},{"actual":[],"check":"partial repair guard 3","expected":[],"passed":true},{"actual":[],"check":"boundary control 4","expected":[["s1","A",0]],"passed":false},{"actual":[["s1","CHEM120",3],["s2","ECON150",4]],"check":"normal control 5","expected":[["s1","BIO130",4],["s1","CHEM120",3],["s1","HIST140",0]],"passed":false},{"actual":[["s3","MATH101H",2]],"check":"normal control 6","expected":[],"passed":false},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[],"check":"normal control 8","expected":[["s1","BIO130",0],["s1","ECON150",1]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: weekday names 1\", \"actual\": [], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": false}, {\"check\": \"regression variant: weekday names 2\", \"actual\": [], \"expected\": [[\"s3\", \"MATH101\", 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[\"s1\", \"CHEM120\", 3], [\"s2\", \"ECON150\", 4]], \"expected\": [[\"s1\", \"BIO130\", 4], [\"s1\", \"CHEM120\", 3], [\"s1\", \"HIST140\", 0]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"s3\", \"MATH101H\", 2]], \"expected\": [], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [], \"expected\": [[\"s1\", \"BIO130\", 0], [\"s1\", \"ECON150\", 1]], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}