{"abstract":"When two exclusive promos tie, the promo with the higher id is recorded as applied.","category":"Loyalty points ledgers","checks":7,"contract":"Input {base, promos:[{id,kind,value,stackable,cap}]}. A multiplier promo (value in percent) gives floor(base*(value-100)/100) extra; a fixed promo gives value. Each extra is capped at cap when cap > 0. All stackable extras apply; of the non-stackable promos only the single best capped extra applies (ties to the lower id), in addition to the stackable ones. Return {bonus, applied ids sorted}.","evaluation_group":"w2-loyalty-points-ledgers-promo-stacking","failed_approach":"Taking the first maximum in list order depends on how promos were listed.","family":"w2-loyalty-points-ledgers-promo-stacking-non-stackable-tie-break","id":"FA-60551","implementations":{"attempt":{"sha256":"e9ed9b2596a93fa1912ce018ebbb192e248c028d3537e40a031bd92a175f8755","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    st = []\n    ns = []\n    for p in x['promos']:\n        if p['kind'] == 'multiplier':\n            e = x['base'] * (p['value'] - 100) // 100\n        else:\n            e = p['value']\n        if p['cap'] > 0:\n            e = min(e, p['cap'])\n        (st if p['stackable'] else ns).append([e, p['id']])\n    bonus = sum(e for e, _ in st)\n    applied = [i for _, i in st]\n    if ns:\n        best = max(ns, key=lambda r: r[0])\n        bonus += best[0]\n        applied.append(best[1])\n    return {'bonus': bonus, 'applied': sorted(applied)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['mixed promos', {'base': 1001, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1501, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2501}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3001, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 101, 'stackable': True, 'cap': 0}]}, {'bonus': 301, 'applied': [3, 9]}], ['no promos', {'base': 10, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 111, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 77, 'applied': [5]}], ['odd base', {'base': 334, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 333, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 501, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 531, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1002, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1503, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2502}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3002, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 102, 'stackable': True, 'cap': 0}]}, {'bonus': 302, 'applied': [3, 9]}], ['no promos', {'base': 20, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 112, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 84, 'applied': [5]}], ['odd base', {'base': 335, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 334, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 502, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 532, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1003, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1504, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2503}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3003, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 103, 'stackable': True, 'cap': 0}]}, {'bonus': 303, 'applied': [3, 9]}], ['no promos', {'base': 30, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 113, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 91, 'applied': [5]}], ['odd base', {'base': 336, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 503, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 533, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1004, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1506, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2504}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3004, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 104, 'stackable': True, 'cap': 0}]}, {'bonus': 304, 'applied': [3, 9]}], ['no promos', {'base': 40, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 114, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 98, 'applied': [5]}], ['odd base', {'base': 337, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 504, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 534, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1005, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1507, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2505}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3005, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 105, 'stackable': True, 'cap': 0}]}, {'bonus': 305, 'applied': [3, 9]}], ['no promos', {'base': 50, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 115, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 105, 'applied': [5]}], ['odd base', {'base': 338, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 337, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 505, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 535, 'applied': [1, 2, 3]}]]]\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":"7d608a4a32d339833effd62860ec77245b506bfa38c9cee4f83973a1b6b96f3e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    st = []\n    ns = []\n    for p in x['promos']:\n        if p['kind'] == 'multiplier':\n            e = x['base'] * (p['value'] - 100) // 100\n        else:\n            e = p['value']\n        if p['cap'] > 0:\n            e = min(e, p['cap'])\n        (st if p['stackable'] else ns).append([e, p['id']])\n    bonus = sum(e for e, _ in st)\n    applied = [i for _, i in st]\n    if ns:\n        best = min(ns, key=lambda r: (-r[0], -r[1]))\n        bonus += best[0]\n        applied.append(best[1])\n    return {'bonus': bonus, 'applied': sorted(applied)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['mixed promos', {'base': 1001, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1501, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2501}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3001, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 101, 'stackable': True, 'cap': 0}]}, {'bonus': 301, 'applied': [3, 9]}], ['no promos', {'base': 10, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 111, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 77, 'applied': [5]}], ['odd base', {'base': 334, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 333, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 501, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 531, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1002, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1503, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2502}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3002, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 102, 'stackable': True, 'cap': 0}]}, {'bonus': 302, 'applied': [3, 9]}], ['no promos', {'base': 20, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 112, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 84, 'applied': [5]}], ['odd base', {'base': 335, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 334, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 502, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 532, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1003, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1504, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2503}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3003, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 103, 'stackable': True, 'cap': 0}]}, {'bonus': 303, 'applied': [3, 9]}], ['no promos', {'base': 30, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 113, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 91, 'applied': [5]}], ['odd base', {'base': 336, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 503, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 533, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1004, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1506, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2504}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3004, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 104, 'stackable': True, 'cap': 0}]}, {'bonus': 304, 'applied': [3, 9]}], ['no promos', {'base': 40, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 114, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 98, 'applied': [5]}], ['odd base', {'base': 337, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 504, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 534, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1005, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1507, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2505}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3005, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 105, 'stackable': True, 'cap': 0}]}, {'bonus': 305, 'applied': [3, 9]}], ['no promos', {'base': 50, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 115, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 105, 'applied': [5]}], ['odd base', {'base': 338, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 337, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 505, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 535, 'applied': [1, 2, 3]}]]]\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":"14bfcfd24c0b8e99efd797321797ba442fcaa6943154fd06d8a2ceafc985d6fb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    st = []\n    ns = []\n    for p in x['promos']:\n        if p['kind'] == 'multiplier':\n            e = x['base'] * (p['value'] - 100) // 100\n        else:\n            e = p['value']\n        if p['cap'] > 0:\n            e = min(e, p['cap'])\n        (st if p['stackable'] else ns).append([e, p['id']])\n    bonus = sum(e for e, _ in st)\n    applied = [i for _, i in st]\n    if ns:\n        best = min(ns, key=lambda r: (-r[0], r[1]))\n        bonus += best[0]\n        applied.append(best[1])\n    return {'bonus': bonus, 'applied': sorted(applied)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['mixed promos', {'base': 1001, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1501, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2501}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3001, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 101, 'stackable': True, 'cap': 0}]}, {'bonus': 301, 'applied': [3, 9]}], ['no promos', {'base': 10, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 111, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 77, 'applied': [5]}], ['odd base', {'base': 334, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 333, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 501, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 531, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1002, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1503, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2502}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3002, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 102, 'stackable': True, 'cap': 0}]}, {'bonus': 302, 'applied': [3, 9]}], ['no promos', {'base': 20, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 112, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 84, 'applied': [5]}], ['odd base', {'base': 335, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 334, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 502, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 532, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1003, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1504, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2503}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3003, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 103, 'stackable': True, 'cap': 0}]}, {'bonus': 303, 'applied': [3, 9]}], ['no promos', {'base': 30, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 113, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 91, 'applied': [5]}], ['odd base', {'base': 336, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 503, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 533, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1004, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1506, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2504}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3004, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 104, 'stackable': True, 'cap': 0}]}, {'bonus': 304, 'applied': [3, 9]}], ['no promos', {'base': 40, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 114, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 98, 'applied': [5]}], ['odd base', {'base': 337, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 336, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 504, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 534, 'applied': [1, 2, 3]}]], [['mixed promos', {'base': 1005, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 200, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 300, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}]}, {'bonus': 1507, 'applied': [1, 3]}], ['caps', {'base': 2000, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 300, 'stackable': True, 'cap': 2505}, {'id': 2, 'kind': 'fixed', 'value': 900, 'stackable': True, 'cap': 500}]}, {'bonus': 3005, 'applied': [1, 2]}], ['tie on value', {'base': 400, 'promos': [{'id': 7, 'kind': 'fixed', 'value': 200, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'multiplier', 'value': 150, 'stackable': False, 'cap': 0}, {'id': 9, 'kind': 'fixed', 'value': 105, 'stackable': True, 'cap': 0}]}, {'bonus': 305, 'applied': [3, 9]}], ['no promos', {'base': 50, 'promos': []}, {'bonus': 0, 'applied': []}], ['only non stackable', {'base': 700, 'promos': [{'id': 4, 'kind': 'fixed', 'value': 50, 'stackable': False, 'cap': 0}, {'id': 5, 'kind': 'multiplier', 'value': 115, 'stackable': False, 'cap': 0}, {'id': 6, 'kind': 'fixed', 'value': 60, 'stackable': False, 'cap': 40}]}, {'bonus': 105, 'applied': [5]}], ['odd base', {'base': 338, 'promos': [{'id': 1, 'kind': 'multiplier', 'value': 125, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'multiplier', 'value': 175, 'stackable': True, 'cap': 0}]}, {'bonus': 337, 'applied': [1, 2]}], ['best beats stack', {'base': 100, 'promos': [{'id': 1, 'kind': 'fixed', 'value': 10, 'stackable': True, 'cap': 0}, {'id': 2, 'kind': 'fixed', 'value': 505, 'stackable': False, 'cap': 0}, {'id': 3, 'kind': 'fixed', 'value': 20, 'stackable': True, 'cap': 0}]}, {'bonus': 535, 'applied': [1, 2, 3]}]]]\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 bounded loyalty-program model with explicit toy rules; not any real program terms. 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-loyalty-points-ledgers-promo-stacking-non-stackable-tie-break","generated_at":"2026-09-29T14:46:46.644716+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Member point balances, statements and the program liability depend on this ledger rule.","repair":"Break ties toward the lower promo id.","root_cause":"The tie-break orders ids descending.","sha256":"ee3be78047eb3e4866eb1453d1b73d7e3b3d1175abf8e90ef711831f2c4afe76","title":"Promotion stacking rules: non-stackable tie-break · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.319,"exit_code":1,"observations":[{"actual":{"applied":[1,3],"bonus":1501},"check":"mixed promos","expected":{"applied":[1,3],"bonus":1501},"passed":true},{"actual":{"applied":[1,2],"bonus":3001},"check":"caps","expected":{"applied":[1,2],"bonus":3001},"passed":true},{"actual":{"applied":[7,9],"bonus":301},"check":"tie on value","expected":{"applied":[3,9],"bonus":301},"passed":false},{"actual":{"applied":[],"bonus":0},"check":"no promos","expected":{"applied":[],"bonus":0},"passed":true},{"actual":{"applied":[5],"bonus":77},"check":"only non stackable","expected":{"applied":[5],"bonus":77},"passed":true},{"actual":{"applied":[1,2],"bonus":333},"check":"odd base","expected":{"applied":[1,2],"bonus":333},"passed":true},{"actual":{"applied":[1,2,3],"bonus":531},"check":"best beats stack","expected":{"applied":[1,2,3],"bonus":531},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"mixed promos\", \"actual\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"expected\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"passed\": true}, {\"check\": \"caps\", \"actual\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"tie on value\", \"actual\": {\"bonus\": 301, \"applied\": [7, 9]}, \"expected\": {\"bonus\": 301, \"applied\": [3, 9]}, \"passed\": false}, {\"check\": \"no promos\", \"actual\": {\"bonus\": 0, \"applied\": []}, \"expected\": {\"bonus\": 0, \"applied\": []}, \"passed\": true}, {\"check\": \"only non stackable\", \"actual\": {\"bonus\": 77, \"applied\": [5]}, \"expected\": {\"bonus\": 77, \"applied\": [5]}, \"passed\": true}, {\"check\": \"odd base\", \"actual\": {\"bonus\": 333, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 333, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"best beats stack\", \"actual\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"expected\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.466,"exit_code":1,"observations":[{"actual":{"applied":[1,3],"bonus":1501},"check":"mixed promos","expected":{"applied":[1,3],"bonus":1501},"passed":true},{"actual":{"applied":[1,2],"bonus":3001},"check":"caps","expected":{"applied":[1,2],"bonus":3001},"passed":true},{"actual":{"applied":[7,9],"bonus":301},"check":"tie on value","expected":{"applied":[3,9],"bonus":301},"passed":false},{"actual":{"applied":[],"bonus":0},"check":"no promos","expected":{"applied":[],"bonus":0},"passed":true},{"actual":{"applied":[5],"bonus":77},"check":"only non stackable","expected":{"applied":[5],"bonus":77},"passed":true},{"actual":{"applied":[1,2],"bonus":333},"check":"odd base","expected":{"applied":[1,2],"bonus":333},"passed":true},{"actual":{"applied":[1,2,3],"bonus":531},"check":"best beats stack","expected":{"applied":[1,2,3],"bonus":531},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"mixed promos\", \"actual\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"expected\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"passed\": true}, {\"check\": \"caps\", \"actual\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"tie on value\", \"actual\": {\"bonus\": 301, \"applied\": [7, 9]}, \"expected\": {\"bonus\": 301, \"applied\": [3, 9]}, \"passed\": false}, {\"check\": \"no promos\", \"actual\": {\"bonus\": 0, \"applied\": []}, \"expected\": {\"bonus\": 0, \"applied\": []}, \"passed\": true}, {\"check\": \"only non stackable\", \"actual\": {\"bonus\": 77, \"applied\": [5]}, \"expected\": {\"bonus\": 77, \"applied\": [5]}, \"passed\": true}, {\"check\": \"odd base\", \"actual\": {\"bonus\": 333, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 333, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"best beats stack\", \"actual\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"expected\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.929,"exit_code":0,"observations":[{"actual":{"applied":[1,3],"bonus":1501},"check":"mixed promos","expected":{"applied":[1,3],"bonus":1501},"passed":true},{"actual":{"applied":[1,2],"bonus":3001},"check":"caps","expected":{"applied":[1,2],"bonus":3001},"passed":true},{"actual":{"applied":[3,9],"bonus":301},"check":"tie on value","expected":{"applied":[3,9],"bonus":301},"passed":true},{"actual":{"applied":[],"bonus":0},"check":"no promos","expected":{"applied":[],"bonus":0},"passed":true},{"actual":{"applied":[5],"bonus":77},"check":"only non stackable","expected":{"applied":[5],"bonus":77},"passed":true},{"actual":{"applied":[1,2],"bonus":333},"check":"odd base","expected":{"applied":[1,2],"bonus":333},"passed":true},{"actual":{"applied":[1,2,3],"bonus":531},"check":"best beats stack","expected":{"applied":[1,2,3],"bonus":531},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"mixed promos\", \"actual\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"expected\": {\"bonus\": 1501, \"applied\": [1, 3]}, \"passed\": true}, {\"check\": \"caps\", \"actual\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 3001, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"tie on value\", \"actual\": {\"bonus\": 301, \"applied\": [3, 9]}, \"expected\": {\"bonus\": 301, \"applied\": [3, 9]}, \"passed\": true}, {\"check\": \"no promos\", \"actual\": {\"bonus\": 0, \"applied\": []}, \"expected\": {\"bonus\": 0, \"applied\": []}, \"passed\": true}, {\"check\": \"only non stackable\", \"actual\": {\"bonus\": 77, \"applied\": [5]}, \"expected\": {\"bonus\": 77, \"applied\": [5]}, \"passed\": true}, {\"check\": \"odd base\", \"actual\": {\"bonus\": 333, \"applied\": [1, 2]}, \"expected\": {\"bonus\": 333, \"applied\": [1, 2]}, \"passed\": true}, {\"check\": \"best beats stack\", \"actual\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"expected\": {\"bonus\": 531, \"applied\": [1, 2, 3]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}