FA-83701 / Card game rule engines / Open access
An exactly dealt deck produces a kitty containing the whole deck · case 01
When no cards remain, the kitty repeats the deck.
ROOT CAUSE
The kitty is sliced with a negative length.
THE FAILURE
The kitty is sliced with a negative length.
Unsuccessful approach: Burning one card before the kitty drops a kitty card.
Case contract
Input [players, dealer, batch_pattern, deck]. For each batch size in order, deal that many cards to each player starting left of the dealer (dealer+1) clockwise. Remaining cards form the kitty. Return [hands_by_seat, kitty].
Why this case matters
Card-game engines, scoring apps and online tables apply this rule automatically on every hand.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
n, dealer, pattern, deck = x
hands = [[] for _ in range(n)]
pos = 0
for batch in pattern:
for k in range(1, n + 1):
seat = (dealer + k) % n
hands[seat].extend(deck[pos:pos + batch])
pos += batch
return [hands, deck[-(len(deck) - pos):]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[5, 2, [3, 2], ['JC', 'KC', 'QH', '8C', '2S', 'TS', 'TC', 'KH', '9H', 'KS', '3D', 'AD', 'JD', '6S', 'AS', '8H', '9D', 'QD', '8D', '4H', '5D', '3H', 'JH', 'JS', 'TD']], [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], []]], [[2, 1, [2, 3], ['AC', 'KC', '2D', 'JS', '6S', '8H', '6H', '3H', '5H', '6D', '4D', '7C', '4S']], [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']]], [[2, 1, [1], ['QC', '6S', 'AH']], [[['QC'], ['6S']], ['AH']]], [[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[5, 1, [1, 1, 1], ['9H', 'AS', '2H', 'TS', 'QH', '5S', 'QD', '5H', 'AH', '3H', '8H', '7C', '3S', 'JS', '2S', '6H']], [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], ['6H']]], [[3, 1, [5], ['KH', 'QH', '7S', '2H', '4S', '5D', 'AC', '9S', '6H', 'AS', 'TH', '8C', 'TS', '4D', 'QC']], [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], []]], [[3, 2, [1, 1, 1], ['5C', 'JC', '6H', '9D', '2C', 'TH', 'JD', '7D', 'TS', 'KC', 'AD', '9H', '6D']], [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']]], [[4, 3, [2, 2, 1], ['2S', '5S', 'QD', 'QS', 'TH', 'JS', '5H', '2H', '4D', '6C', '5C', 'AD', '8D', '3S', 'TC', '4C', 'KS', '9H', 'QH', 'TD', '3H', '7C', '7D', 'JC']], [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['3H', '7C', '7D', 'JC']]]], [[[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[5, 2, [3, 2], ['AS', '9S', '7S', 'QS', '6S', '8C', '6C', '4S', '5S', '8S', 'AC', '7H', 'TC', 'TD', 'KC', '7C', '5H', '2D', '3S', '4H', '8H', 'JD', '9D', '5C', 'KS']], [[['6C', '4S', '5S', '4H', '8H'], ['8S', 'AC', '7H', 'JD', '9D'], ['TC', 'TD', 'KC', '5C', 'KS'], ['AS', '9S', '7S', '7C', '5H'], ['QS', '6S', '8C', '2D', '3S']], []]], [[3, 0, [1, 1, 1], ['3S', '7C', '4H', '7H', 'AS', '2S', '8C', '7D', '5S']], [[['4H', '2S', '5S'], ['3S', '7H', '8C'], ['7C', 'AS', '7D']], []]], [[4, 2, [3, 2], ['4C', 'JC', '4H', '7D', 'QS', '5S', '2H', 'JH', '2D', '4S', 'TC', '7S', 'AH', '2C', '5C', '4D', '7H', '6C', 'KC', 'TH']], [[['7D', 'QS', '5S', '5C', '4D'], ['2H', 'JH', '2D', '7H', '6C'], ['4S', 'TC', '7S', 'KC', 'TH'], ['4C', 'JC', '4H', 'AH', '2C']], []]], [[4, 2, [2, 3], ['5D', '9D', '7C', '8D', 'AS', 'AH', 'TD', '3C', '6H', '9H', '4H', '5H', '9C', 'KD', 'AC', 'QD', '6D', '5S', 'AD', 'QH', '6S']], [[['7C', '8D', '5H', '9C', 'KD'], ['AS', 'AH', 'AC', 'QD', '6D'], ['TD', '3C', '5S', 'AD', 'QH'], ['5D', '9D', '6H', '9H', '4H']], ['6S']]], [[5, 3, [2, 2, 1], ['AS', '6S', '9C', '6C', '5S', '6D', 'JS', '2H', '8S', '5D', '8H', '2D', 'TH', 'JD', '3D', '7D', '2C', 'QH', '8C', '3S', '8D', '9S', 'AC', 'KH', '7H', '4C']], [[['9C', '6C', 'TH', 'JD', '9S'], ['5S', '6D', '3D', '7D', 'AC'], ['JS', '2H', '2C', 'QH', 'KH'], ['8S', '5D', '8C', '3S', '7H'], ['AS', '6S', '8H', '2D', '8D']], ['4C']]], [[4, 2, [5], ['QC', '8C', '6C', 'TD', '8H', 'JS', '5C', 'TH', '3H', '5D', '3S', 'JH', 'TS', 'AD', '7H', '6S', 'JD', '7D', '7S', '7C']], [[['JS', '5C', 'TH', '3H', '5D'], ['3S', 'JH', 'TS', 'AD', '7H'], ['6S', 'JD', '7D', '7S', '7C'], ['QC', '8C', '6C', 'TD', '8H']], []]], [[3, 2, [2, 3], ['2D', '7S', '2H', 'KH', '5S', '8S', '5C', 'AD', 'TC', '9C', '3D', '9D', '6C', 'KS', '4H']], [[['2D', '7S', '5C', 'AD', 'TC'], ['2H', 'KH', '9C', '3D', '9D'], ['5S', '8S', '6C', 'KS', '4H']], []]]], [[[3, 0, [1, 1, 1], ['3S', '7C', '4H', '7H', 'AS', '2S', '8C', '7D', '5S']], [[['4H', '2S', '5S'], ['3S', '7H', '8C'], ['7C', 'AS', '7D']], []]], [[2, 1, [2, 3], ['6H', '5D', 'KS', '8D', 'AS', '5H', '3S', '3C', 'KC', '7S']], [[['6H', '5D', 'AS', '5H', '3S'], ['KS', '8D', '3C', 'KC', '7S']], []]], [[4, 3, [5], ['KD', '2H', '3H', 'JC', 'QC', 'TC', 'AS', 'JS', '4D', 'KC', '2S', 'QH', 'AC', '4S', '8S', 'TH', '3C', 'JD', 'TS', '5H']], [[['KD', '2H', '3H', 'JC', 'QC'], ['TC', 'AS', 'JS', '4D', 'KC'], ['2S', 'QH', 'AC', '4S', '8S'], ['TH', '3C', 'JD', 'TS', '5H']], []]], [[5, 4, [3, 2], ['4S', 'QD', 'JH', '8S', '8C', '2C', 'TD', 'AS', '5H', '9C', '7S', '9H', 'JC', 'QS', 'KD', '8D', '3H', '2D', 'TH', '6S', '4D', '2H', '7H', '7C', '9S', 'AC']], [[['4S', 'QD', 'JH', '8D', '3H'], ['8S', '8C', '2C', '2D', 'TH'], ['TD', 'AS', '5H', '6S', '4D'], ['9C', '7S', '9H', '2H', '7H'], ['JC', 'QS', 'KD', '7C', '9S']], ['AC']]], [[3, 1, [2, 2, 1], ['QS', '3C', '2H', 'QC', '2C', 'AH', 'AD', '6C', '7H', '6H', 'KS', '9H', 'TD', '4H', 'AS', '8H']], [[['2H', 'QC', '7H', '6H', '4H'], ['2C', 'AH', 'KS', '9H', 'AS'], ['QS', '3C', 'AD', '6C', 'TD']], ['8H']]], [[2, 1, [1], ['TH', 'JC']], [[['TH'], ['JC']], []]], [[2, 0, [3, 2], ['QD', 'TH', '7S', '5C', 'TC', '2D', '2H', 'TS', 'JD', '9S', 'QS']], [[['5C', 'TC', '2D', 'JD', '9S'], ['QD', 'TH', '7S', '2H', 'TS']], ['QS']]], [[5, 2, [1, 1, 1], ['8C', '5C', '3C', '6C', 'KH', '2S', '2D', 'KS', '3H', '9D', 'AD', 'JC', 'AC', 'QC', '8S', 'TS']], [[['3C', 'KS', 'AC'], ['6C', '3H', 'QC'], ['KH', '9D', '8S'], ['8C', '2S', 'AD'], ['5C', '2D', 'JC']], ['TS']]]], [[[3, 2, [2, 3], ['2D', '7S', '2H', 'KH', '5S', '8S', '5C', 'AD', 'TC', '9C', '3D', '9D', '6C', 'KS', '4H']], [[['2D', '7S', '5C', 'AD', 'TC'], ['2H', 'KH', '9C', '3D', '9D'], ['5S', '8S', '6C', 'KS', '4H']], []]], [[4, 1, [2, 3], ['4C', 'JC', '8S', '9S', 'TH', '5H', '7C', '5C', 'QH', '7H', 'JD', '9D', 'AH', '7D', '9C', 'KS', '8C', 'TD', 'AD', '4H', 'QS', '2S', 'AC', '3H']], [[['TH', '5H', '9C', 'KS', '8C'], ['7C', '5C', 'TD', 'AD', '4H'], ['4C', 'JC', 'QH', '7H', 'JD'], ['8S', '9S', '9D', 'AH', '7D']], ['QS', '2S', 'AC', '3H']]], [[5, 2, [1, 1, 1], ['8C', '5C', '3C', '6C', 'KH', '2S', '2D', 'KS', '3H', '9D', 'AD', 'JC', 'AC', 'QC', '8S', 'TS']], [[['3C', 'KS', 'AC'], ['6C', '3H', 'QC'], ['KH', '9D', '8S'], ['8C', '2S', 'AD'], ['5C', '2D', 'JC']], ['TS']]], [[2, 0, [5], ['2D', '7H', '4C', '7D', '5C', 'TC', '3D', 'QD', '4S', 'KS', 'JD']], [[['TC', '3D', 'QD', '4S', 'KS'], ['2D', '7H', '4C', '7D', '5C']], ['JD']]], [[3, 2, [3, 2], ['2D', '8C', 'JS', '6H', '8H', '4S', '9C', '5H', 'QH', '7C', '4H', 'QC', '3H', '6S', 'AD', '4C']], [[['2D', '8C', 'JS', '7C', '4H'], ['6H', '8H', '4S', 'QC', '3H'], ['9C', '5H', 'QH', '6S', 'AD']], ['4C']]], [[4, 2, [2, 3], ['8S', 'QS', 'JS', '2C', '5S', '3S', '6S', 'KS', '9D', 'TD', 'TH', '6D', '9H', '8D', 'JH', 'JC', '8C', '9S', '4C', '9C', 'TS', '7C', 'TC', 'KH']], [[['JS', '2C', '6D', '9H', '8D'], ['5S', '3S', 'JH', 'JC', '8C'], ['6S', 'KS', '9S', '4C', '9C'], ['8S', 'QS', '9D', 'TD', 'TH']], ['TS', '7C', 'TC', 'KH']]], [[2, 0, [3, 2], ['JC', '4C', 'KH', '7C', '6S', 'KS', 'TC', '2D', '9D', '5S', '4H', '2C', '4D', '5D']], [[['7C', '6S', 'KS', '9D', '5S'], ['JC', '4C', 'KH', 'TC', '2D']], ['4H', '2C', '4D', '5D']]], [[5, 0, [1], ['JH', 'QC', 'TC', 'AD', '4S', '7H', '4D', '3C', '3D']], [[['4S'], ['JH'], ['QC'], ['TC'], ['AD']], ['7H', '4D', '3C', '3D']]]], [[[2, 1, [1], ['TH', 'JC']], [[['TH'], ['JC']], []]], [[4, 0, [1, 1, 1], ['5H', 'TH', '6C', '6H', '8C', '8D', 'AS', '6S', '7H', '3C', '2D', 'QD']], [[['6H', '6S', 'QD'], ['5H', '8C', '7H'], ['TH', '8D', '3C'], ['6C', 'AS', '2D']], []]], [[5, 0, [1], ['JH', 'QC', 'TC', 'AD', '4S', '7H', '4D', '3C', '3D']], [[['4S'], ['JH'], ['QC'], ['TC'], ['AD']], ['7H', '4D', '3C', '3D']]], [[2, 1, [1], ['6S', '9H', 'AD', '3H', '3D', '4C']], [[['6S'], ['9H']], ['AD', '3H', '3D', '4C']]], [[2, 1, [5], ['7D', '8C', '5H', 'TD', '4H', 'AD', 'JS', 'QC', 'QH', '8D', '7C', '5S', '5C']], [[['7D', '8C', '5H', 'TD', '4H'], ['AD', 'JS', 'QC', 'QH', '8D']], ['7C', '5S', '5C']]], [[2, 1, [3, 2], ['TD', 'JD', '7D', '5S', '9H', 'QH', '8D', 'JH', '9D', 'QS', 'AS', '2D', 'TS', '2H']], [[['TD', 'JD', '7D', '8D', 'JH'], ['5S', '9H', 'QH', '9D', 'QS']], ['AS', '2D', 'TS', '2H']]], [[4, 0, [1, 1, 1], ['8H', '4C', 'TS', 'JD', '2H', '2S', '3C', '7S', '6D', 'KD', '3S', '8D']], [[['JD', '7S', '8D'], ['8H', '2H', '6D'], ['4C', '2S', 'KD'], ['TS', '3C', '3S']], []]], [[5, 0, [1], ['5H', '4C', '5D', 'TS', '2C', 'KC', '4H', '6H', '8C']], [[['2C'], ['5H'], ['4C'], ['5D'], ['TS']], ['KC', '4H', '6H', '8C']]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("deal case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| deal case 0 | [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], ['JC', 'KC', 'QH', '8C', '2S', 'TS', 'TC', 'KH', '9H', 'KS', '3D', 'AD', 'JD', '6S', 'AS', '8H', '9D', 'QD', '8D', '4H', '5D', '3H', 'JH', 'JS', 'TD']] | [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], []] | Failed |
| deal case 1 | [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']] | [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']] | Passed |
| deal case 2 | [[['QC'], ['6S']], ['AH']] | [[['QC'], ['6S']], ['AH']] | Passed |
| deal case 3 | [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']] | [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []] | Failed |
| deal case 4 | [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], ['6H']] | [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], ['6H']] | Passed |
| deal case 5 | [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], ['KH', 'QH', '7S', '2H', '4S', '5D', 'AC', '9S', '6H', 'AS', 'TH', '8C', 'TS', '4D', 'QC']] | [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], []] | Failed |
| deal case 6 | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']] | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']] | Passed |
| deal case 7 | [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['3H', '7C', '7D', 'JC']] | [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['3H', '7C', '7D', 'JC']] | Passed |
SHA-256 / 3b7d2037d5423500ae90a27f33bf8489c562ae2ff45679620530c452aa435f82
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
n, dealer, pattern, deck = x
hands = [[] for _ in range(n)]
pos = 0
for batch in pattern:
for k in range(1, n + 1):
seat = (dealer + k) % n
hands[seat].extend(deck[pos:pos + batch])
pos += batch
return [hands, deck[pos + 1:]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[5, 2, [3, 2], ['JC', 'KC', 'QH', '8C', '2S', 'TS', 'TC', 'KH', '9H', 'KS', '3D', 'AD', 'JD', '6S', 'AS', '8H', '9D', 'QD', '8D', '4H', '5D', '3H', 'JH', 'JS', 'TD']], [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], []]], [[2, 1, [2, 3], ['AC', 'KC', '2D', 'JS', '6S', '8H', '6H', '3H', '5H', '6D', '4D', '7C', '4S']], [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']]], [[2, 1, [1], ['QC', '6S', 'AH']], [[['QC'], ['6S']], ['AH']]], [[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[5, 1, [1, 1, 1], ['9H', 'AS', '2H', 'TS', 'QH', '5S', 'QD', '5H', 'AH', '3H', '8H', '7C', '3S', 'JS', '2S', '6H']], [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], ['6H']]], [[3, 1, [5], ['KH', 'QH', '7S', '2H', '4S', '5D', 'AC', '9S', '6H', 'AS', 'TH', '8C', 'TS', '4D', 'QC']], [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], []]], [[3, 2, [1, 1, 1], ['5C', 'JC', '6H', '9D', '2C', 'TH', 'JD', '7D', 'TS', 'KC', 'AD', '9H', '6D']], [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']]], [[4, 3, [2, 2, 1], ['2S', '5S', 'QD', 'QS', 'TH', 'JS', '5H', '2H', '4D', '6C', '5C', 'AD', '8D', '3S', 'TC', '4C', 'KS', '9H', 'QH', 'TD', '3H', '7C', '7D', 'JC']], [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['3H', '7C', '7D', 'JC']]]], [[[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[5, 2, [3, 2], ['AS', '9S', '7S', 'QS', '6S', '8C', '6C', '4S', '5S', '8S', 'AC', '7H', 'TC', 'TD', 'KC', '7C', '5H', '2D', '3S', '4H', '8H', 'JD', '9D', '5C', 'KS']], [[['6C', '4S', '5S', '4H', '8H'], ['8S', 'AC', '7H', 'JD', '9D'], ['TC', 'TD', 'KC', '5C', 'KS'], ['AS', '9S', '7S', '7C', '5H'], ['QS', '6S', '8C', '2D', '3S']], []]], [[3, 0, [1, 1, 1], ['3S', '7C', '4H', '7H', 'AS', '2S', '8C', '7D', '5S']], [[['4H', '2S', '5S'], ['3S', '7H', '8C'], ['7C', 'AS', '7D']], []]], [[4, 2, [3, 2], ['4C', 'JC', '4H', '7D', 'QS', '5S', '2H', 'JH', '2D', '4S', 'TC', '7S', 'AH', '2C', '5C', '4D', '7H', '6C', 'KC', 'TH']], [[['7D', 'QS', '5S', '5C', '4D'], ['2H', 'JH', '2D', '7H', '6C'], ['4S', 'TC', '7S', 'KC', 'TH'], ['4C', 'JC', '4H', 'AH', '2C']], []]], [[4, 2, [2, 3], ['5D', '9D', '7C', '8D', 'AS', 'AH', 'TD', '3C', '6H', '9H', '4H', '5H', '9C', 'KD', 'AC', 'QD', '6D', '5S', 'AD', 'QH', '6S']], [[['7C', '8D', '5H', '9C', 'KD'], ['AS', 'AH', 'AC', 'QD', '6D'], ['TD', '3C', '5S', 'AD', 'QH'], ['5D', '9D', '6H', '9H', '4H']], ['6S']]], [[5, 3, [2, 2, 1], ['AS', '6S', '9C', '6C', '5S', '6D', 'JS', '2H', '8S', '5D', '8H', '2D', 'TH', 'JD', '3D', '7D', '2C', 'QH', '8C', '3S', '8D', '9S', 'AC', 'KH', '7H', '4C']], [[['9C', '6C', 'TH', 'JD', '9S'], ['5S', '6D', '3D', '7D', 'AC'], ['JS', '2H', '2C', 'QH', 'KH'], ['8S', '5D', '8C', '3S', '7H'], ['AS', '6S', '8H', '2D', '8D']], ['4C']]], [[4, 2, [5], ['QC', '8C', '6C', 'TD', '8H', 'JS', '5C', 'TH', '3H', '5D', '3S', 'JH', 'TS', 'AD', '7H', '6S', 'JD', '7D', '7S', '7C']], [[['JS', '5C', 'TH', '3H', '5D'], ['3S', 'JH', 'TS', 'AD', '7H'], ['6S', 'JD', '7D', '7S', '7C'], ['QC', '8C', '6C', 'TD', '8H']], []]], [[3, 2, [2, 3], ['2D', '7S', '2H', 'KH', '5S', '8S', '5C', 'AD', 'TC', '9C', '3D', '9D', '6C', 'KS', '4H']], [[['2D', '7S', '5C', 'AD', 'TC'], ['2H', 'KH', '9C', '3D', '9D'], ['5S', '8S', '6C', 'KS', '4H']], []]]], [[[3, 0, [1, 1, 1], ['3S', '7C', '4H', '7H', 'AS', '2S', '8C', '7D', '5S']], [[['4H', '2S', '5S'], ['3S', '7H', '8C'], ['7C', 'AS', '7D']], []]], [[2, 1, [2, 3], ['6H', '5D', 'KS', '8D', 'AS', '5H', '3S', '3C', 'KC', '7S']], [[['6H', '5D', 'AS', '5H', '3S'], ['KS', '8D', '3C', 'KC', '7S']], []]], [[4, 3, [5], ['KD', '2H', '3H', 'JC', 'QC', 'TC', 'AS', 'JS', '4D', 'KC', '2S', 'QH', 'AC', '4S', '8S', 'TH', '3C', 'JD', 'TS', '5H']], [[['KD', '2H', '3H', 'JC', 'QC'], ['TC', 'AS', 'JS', '4D', 'KC'], ['2S', 'QH', 'AC', '4S', '8S'], ['TH', '3C', 'JD', 'TS', '5H']], []]], [[5, 4, [3, 2], ['4S', 'QD', 'JH', '8S', '8C', '2C', 'TD', 'AS', '5H', '9C', '7S', '9H', 'JC', 'QS', 'KD', '8D', '3H', '2D', 'TH', '6S', '4D', '2H', '7H', '7C', '9S', 'AC']], [[['4S', 'QD', 'JH', '8D', '3H'], ['8S', '8C', '2C', '2D', 'TH'], ['TD', 'AS', '5H', '6S', '4D'], ['9C', '7S', '9H', '2H', '7H'], ['JC', 'QS', 'KD', '7C', '9S']], ['AC']]], [[3, 1, [2, 2, 1], ['QS', '3C', '2H', 'QC', '2C', 'AH', 'AD', '6C', '7H', '6H', 'KS', '9H', 'TD', '4H', 'AS', '8H']], [[['2H', 'QC', '7H', '6H', '4H'], ['2C', 'AH', 'KS', '9H', 'AS'], ['QS', '3C', 'AD', '6C', 'TD']], ['8H']]], [[2, 1, [1], ['TH', 'JC']], [[['TH'], ['JC']], []]], [[2, 0, [3, 2], ['QD', 'TH', '7S', '5C', 'TC', '2D', '2H', 'TS', 'JD', '9S', 'QS']], [[['5C', 'TC', '2D', 'JD', '9S'], ['QD', 'TH', '7S', '2H', 'TS']], ['QS']]], [[5, 2, [1, 1, 1], ['8C', '5C', '3C', '6C', 'KH', '2S', '2D', 'KS', '3H', '9D', 'AD', 'JC', 'AC', 'QC', '8S', 'TS']], [[['3C', 'KS', 'AC'], ['6C', '3H', 'QC'], ['KH', '9D', '8S'], ['8C', '2S', 'AD'], ['5C', '2D', 'JC']], ['TS']]]], [[[3, 2, [2, 3], ['2D', '7S', '2H', 'KH', '5S', '8S', '5C', 'AD', 'TC', '9C', '3D', '9D', '6C', 'KS', '4H']], [[['2D', '7S', '5C', 'AD', 'TC'], ['2H', 'KH', '9C', '3D', '9D'], ['5S', '8S', '6C', 'KS', '4H']], []]], [[4, 1, [2, 3], ['4C', 'JC', '8S', '9S', 'TH', '5H', '7C', '5C', 'QH', '7H', 'JD', '9D', 'AH', '7D', '9C', 'KS', '8C', 'TD', 'AD', '4H', 'QS', '2S', 'AC', '3H']], [[['TH', '5H', '9C', 'KS', '8C'], ['7C', '5C', 'TD', 'AD', '4H'], ['4C', 'JC', 'QH', '7H', 'JD'], ['8S', '9S', '9D', 'AH', '7D']], ['QS', '2S', 'AC', '3H']]], [[5, 2, [1, 1, 1], ['8C', '5C', '3C', '6C', 'KH', '2S', '2D', 'KS', '3H', '9D', 'AD', 'JC', 'AC', 'QC', '8S', 'TS']], [[['3C', 'KS', 'AC'], ['6C', '3H', 'QC'], ['KH', '9D', '8S'], ['8C', '2S', 'AD'], ['5C', '2D', 'JC']], ['TS']]], [[2, 0, [5], ['2D', '7H', '4C', '7D', '5C', 'TC', '3D', 'QD', '4S', 'KS', 'JD']], [[['TC', '3D', 'QD', '4S', 'KS'], ['2D', '7H', '4C', '7D', '5C']], ['JD']]], [[3, 2, [3, 2], ['2D', '8C', 'JS', '6H', '8H', '4S', '9C', '5H', 'QH', '7C', '4H', 'QC', '3H', '6S', 'AD', '4C']], [[['2D', '8C', 'JS', '7C', '4H'], ['6H', '8H', '4S', 'QC', '3H'], ['9C', '5H', 'QH', '6S', 'AD']], ['4C']]], [[4, 2, [2, 3], ['8S', 'QS', 'JS', '2C', '5S', '3S', '6S', 'KS', '9D', 'TD', 'TH', '6D', '9H', '8D', 'JH', 'JC', '8C', '9S', '4C', '9C', 'TS', '7C', 'TC', 'KH']], [[['JS', '2C', '6D', '9H', '8D'], ['5S', '3S', 'JH', 'JC', '8C'], ['6S', 'KS', '9S', '4C', '9C'], ['8S', 'QS', '9D', 'TD', 'TH']], ['TS', '7C', 'TC', 'KH']]], [[2, 0, [3, 2], ['JC', '4C', 'KH', '7C', '6S', 'KS', 'TC', '2D', '9D', '5S', '4H', '2C', '4D', '5D']], [[['7C', '6S', 'KS', '9D', '5S'], ['JC', '4C', 'KH', 'TC', '2D']], ['4H', '2C', '4D', '5D']]], [[5, 0, [1], ['JH', 'QC', 'TC', 'AD', '4S', '7H', '4D', '3C', '3D']], [[['4S'], ['JH'], ['QC'], ['TC'], ['AD']], ['7H', '4D', '3C', '3D']]]], [[[2, 1, [1], ['TH', 'JC']], [[['TH'], ['JC']], []]], [[4, 0, [1, 1, 1], ['5H', 'TH', '6C', '6H', '8C', '8D', 'AS', '6S', '7H', '3C', '2D', 'QD']], [[['6H', '6S', 'QD'], ['5H', '8C', '7H'], ['TH', '8D', '3C'], ['6C', 'AS', '2D']], []]], [[5, 0, [1], ['JH', 'QC', 'TC', 'AD', '4S', '7H', '4D', '3C', '3D']], [[['4S'], ['JH'], ['QC'], ['TC'], ['AD']], ['7H', '4D', '3C', '3D']]], [[2, 1, [1], ['6S', '9H', 'AD', '3H', '3D', '4C']], [[['6S'], ['9H']], ['AD', '3H', '3D', '4C']]], [[2, 1, [5], ['7D', '8C', '5H', 'TD', '4H', 'AD', 'JS', 'QC', 'QH', '8D', '7C', '5S', '5C']], [[['7D', '8C', '5H', 'TD', '4H'], ['AD', 'JS', 'QC', 'QH', '8D']], ['7C', '5S', '5C']]], [[2, 1, [3, 2], ['TD', 'JD', '7D', '5S', '9H', 'QH', '8D', 'JH', '9D', 'QS', 'AS', '2D', 'TS', '2H']], [[['TD', 'JD', '7D', '8D', 'JH'], ['5S', '9H', 'QH', '9D', 'QS']], ['AS', '2D', 'TS', '2H']]], [[4, 0, [1, 1, 1], ['8H', '4C', 'TS', 'JD', '2H', '2S', '3C', '7S', '6D', 'KD', '3S', '8D']], [[['JD', '7S', '8D'], ['8H', '2H', '6D'], ['4C', '2S', 'KD'], ['TS', '3C', '3S']], []]], [[5, 0, [1], ['5H', '4C', '5D', 'TS', '2C', 'KC', '4H', '6H', '8C']], [[['2C'], ['5H'], ['4C'], ['5D'], ['TS']], ['KC', '4H', '6H', '8C']]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("deal case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| deal case 0 | [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], []] | [[['TC', 'KH', '9H', '4H', '5D'], ['KS', '3D', 'AD', '3H', 'JH'], ['JD', '6S', 'AS', 'JS', 'TD'], ['JC', 'KC', 'QH', '8H', '9D'], ['8C', '2S', 'TS', 'QD', '8D']], []] | Passed |
| deal case 1 | [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['7C', '4S']] | [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']] | Failed |
| deal case 2 | [[['QC'], ['6S']], []] | [[['QC'], ['6S']], ['AH']] | Failed |
| deal case 3 | [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []] | [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []] | Passed |
| deal case 4 | [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], []] | [[['TS', 'AH', 'JS'], ['QH', '3H', '2S'], ['9H', '5S', '8H'], ['AS', 'QD', '7C'], ['2H', '5H', '3S']], ['6H']] | Failed |
| deal case 5 | [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], []] | [[['5D', 'AC', '9S', '6H', 'AS'], ['TH', '8C', 'TS', '4D', 'QC'], ['KH', 'QH', '7S', '2H', '4S']], []] | Passed |
| deal case 6 | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['AD', '9H', '6D']] | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']] | Failed |
| deal case 7 | [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['7C', '7D', 'JC']] | [[['2S', '5S', '4D', '6C', 'KS'], ['QD', 'QS', '5C', 'AD', '9H'], ['TH', 'JS', '8D', '3S', 'QH'], ['5H', '2H', 'TC', '4C', 'TD']], ['3H', '7C', '7D', 'JC']] | Failed |
SHA-256 / 6de355d94d8561a204b45f25abc9c8d7de3ce9843b530ddfb2fe18bd81ed45db
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
A bounded toy rule contract stated explicitly in the contract field; cards are two-character codes (rank, suit). Not a complete implementation of any published rulebook or casino table rules. 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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:23.977508+00:00.
Case digest / c30358ad204504baa2e8620bf49ef2f769a10d0058df67af0c4c6ddc884fffb9