FA-83706 / Card game rule engines / Open access
Each player receives the whole pattern before the next player is served · case 01
In a 3-2 deal the first player gets five consecutive cards.
ROOT CAUSE
The seat loop is outside the batch loop.
VERIFIED REPAIR
Deal each batch size to every player before the next batch size.
Unsuccessful approach: Reversing the batch order still deals 2-3 instead of 3-2.
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 k in range(1, n + 1):
for batch in pattern:
seat = (dealer + k) % n
hands[seat].extend(deck[pos:pos + batch])
pos += batch
return [hands, deck[pos:]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[5, 4, [2, 3], ['6S', '5S', 'AC', 'KS', '3C', '7S', 'TH', 'QC', '4C', '5C', '4D', 'QD', 'AD', '7C', 'JS', 'TS', 'JC', '9C', '5H', '6C', 'AH', '2S', 'QH', 'TC', 'KC', '8S', 'JD', '9S']], [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']]], [[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']]], [[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']], []]]], [[[4, 1, [1, 1, 1], ['AH', '3H', '7D', 'AS', 'TD', '4C', 'TH', '4H', '5H', '6S', '3S', '4D']], [[['7D', 'TH', '3S'], ['AS', '4H', '4D'], ['AH', 'TD', '5H'], ['3H', '4C', '6S']], []]], [[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']], []]], [[2, 1, [2, 3], ['6H', '5D', 'KS', '8D', 'AS', '5H', '3S', '3C', 'KC', '7S']], [[['6H', '5D', 'AS', '5H', '3S'], ['KS', '8D', '3C', 'KC', '7S']], []]]], [[[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[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']]], [[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']]]], [[[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']]], [[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']]], [[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, 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, 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']], []]], [[4, 3, [2, 3], ['3D', 'TH', '7H', '9H', '8H', '5S', 'QS', '6S', '4C', 'JC', 'TC', 'KD', 'AS', '6D', '2H', '7S', 'JD', '3H', '2D', 'TS', 'QH', '5H', '2C']], [[['3D', 'TH', '4C', 'JC', 'TC'], ['7H', '9H', 'KD', 'AS', '6D'], ['8H', '5S', '2H', '7S', 'JD'], ['QS', '6S', '3H', '2D', 'TS']], ['QH', '5H', '2C']]]]]
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 | [[['6S', '5S', 'AC', 'KS', '3C'], ['7S', 'TH', 'QC', '4C', '5C'], ['4D', 'QD', 'AD', '7C', 'JS'], ['TS', 'JC', '9C', '5H', '6C'], ['AH', '2S', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']] | [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']] | Failed |
| deal case 1 | [[['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']] | Failed |
| deal case 2 | [[['QC'], ['6S']], ['AH']] | [[['QC'], ['6S']], ['AH']] | Passed |
| deal case 3 | [[['9H', 'AH', '7S', '4D', 'KD'], ['3H', '5D', '7C', 'TD', 'QS']], []] | [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []] | Failed |
| deal case 4 | [[['3H', '8H', '7C'], ['3S', 'JS', '2S'], ['9H', 'AS', '2H'], ['TS', 'QH', '5S'], ['QD', '5H', 'AH']], ['6H']] | [[['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', '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']] | Failed |
| deal case 7 | [[['AC', '7H', 'TC', 'TD', 'KC'], ['7C', '5H', '2D', '3S', '4H'], ['8H', 'JD', '9D', '5C', 'KS'], ['AS', '9S', '7S', 'QS', '6S'], ['8C', '6C', '4S', '5S', '8S']], []] | [[['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']], []] | Failed |
SHA-256 / ebda2551bc8438678a7c9310bc516a63e70810c0467dec3b327a1d81e9005f3b
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 reversed(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:]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[5, 4, [2, 3], ['6S', '5S', 'AC', 'KS', '3C', '7S', 'TH', 'QC', '4C', '5C', '4D', 'QD', 'AD', '7C', 'JS', 'TS', 'JC', '9C', '5H', '6C', 'AH', '2S', 'QH', 'TC', 'KC', '8S', 'JD', '9S']], [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']]], [[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']]], [[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']], []]]], [[[4, 1, [1, 1, 1], ['AH', '3H', '7D', 'AS', 'TD', '4C', 'TH', '4H', '5H', '6S', '3S', '4D']], [[['7D', 'TH', '3S'], ['AS', '4H', '4D'], ['AH', 'TD', '5H'], ['3H', '4C', '6S']], []]], [[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']], []]], [[2, 1, [2, 3], ['6H', '5D', 'KS', '8D', 'AS', '5H', '3S', '3C', 'KC', '7S']], [[['6H', '5D', 'AS', '5H', '3S'], ['KS', '8D', '3C', 'KC', '7S']], []]]], [[[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[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']]], [[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']]]], [[[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']]], [[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']]], [[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, 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, 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']], []]], [[4, 3, [2, 3], ['3D', 'TH', '7H', '9H', '8H', '5S', 'QS', '6S', '4C', 'JC', 'TC', 'KD', 'AS', '6D', '2H', '7S', 'JD', '3H', '2D', 'TS', 'QH', '5H', '2C']], [[['3D', 'TH', '4C', 'JC', 'TC'], ['7H', '9H', 'KD', 'AS', '6D'], ['8H', '5S', '2H', '7S', 'JD'], ['QS', '6S', '3H', '2D', 'TS']], ['QH', '5H', '2C']]]]]
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 | [[['6S', '5S', 'AC', 'TS', 'JC'], ['KS', '3C', '7S', '9C', '5H'], ['TH', 'QC', '4C', '6C', 'AH'], ['5C', '4D', 'QD', '2S', 'QH'], ['AD', '7C', 'JS', 'TC', 'KC']], ['8S', 'JD', '9S']] | [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']] | Failed |
| deal case 1 | [[['AC', 'KC', '2D', '6H', '3H'], ['JS', '6S', '8H', '5H', '6D']], ['4D', '7C', '4S']] | [[['AC', 'KC', '6S', '8H', '6H'], ['2D', 'JS', '3H', '5H', '6D']], ['4D', '7C', '4S']] | Failed |
| deal case 2 | [[['QC'], ['6S']], ['AH']] | [[['QC'], ['6S']], ['AH']] | Passed |
| deal case 3 | [[['9H', 'AH', 'KD', '3H', '5D'], ['7S', '4D', '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']], []] | [[['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']], ['KC', 'AD', '9H', '6D']] | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']] | Passed |
| deal case 7 | [[['6S', '8C', '5H', '2D', '3S'], ['6C', '4S', '4H', '8H', 'JD'], ['5S', '8S', '9D', '5C', 'KS'], ['AS', '9S', 'AC', '7H', 'TC'], ['7S', 'QS', 'TD', 'KC', '7C']], []] | [[['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']], []] | Failed |
SHA-256 / 70c5829778a63be2bc4c9bcd2c7960b0fd1e554c7b3ba0f51beccf03d4ebc5ee
3 / The verified repair
Exit 0"""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:]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[5, 4, [2, 3], ['6S', '5S', 'AC', 'KS', '3C', '7S', 'TH', 'QC', '4C', '5C', '4D', 'QD', 'AD', '7C', 'JS', 'TS', 'JC', '9C', '5H', '6C', 'AH', '2S', 'QH', 'TC', 'KC', '8S', 'JD', '9S']], [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']]], [[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']]], [[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']], []]]], [[[4, 1, [1, 1, 1], ['AH', '3H', '7D', 'AS', 'TD', '4C', 'TH', '4H', '5H', '6S', '3S', '4D']], [[['7D', 'TH', '3S'], ['AS', '4H', '4D'], ['AH', 'TD', '5H'], ['3H', '4C', '6S']], []]], [[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']], []]], [[2, 1, [2, 3], ['6H', '5D', 'KS', '8D', 'AS', '5H', '3S', '3C', 'KC', '7S']], [[['6H', '5D', 'AS', '5H', '3S'], ['KS', '8D', '3C', 'KC', '7S']], []]]], [[[2, 1, [3, 2], ['9H', 'AH', '7S', '4D', 'KD', '3H', '5D', '7C', 'TD', 'QS']], [[['9H', 'AH', '7S', '5D', '7C'], ['4D', 'KD', '3H', 'TD', 'QS']], []]], [[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']]], [[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']]]], [[[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']]], [[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']]], [[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, 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, 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']], []]], [[4, 3, [2, 3], ['3D', 'TH', '7H', '9H', '8H', '5S', 'QS', '6S', '4C', 'JC', 'TC', 'KD', 'AS', '6D', '2H', '7S', 'JD', '3H', '2D', 'TS', 'QH', '5H', '2C']], [[['3D', 'TH', '4C', 'JC', 'TC'], ['7H', '9H', 'KD', 'AS', '6D'], ['8H', '5S', '2H', '7S', 'JD'], ['QS', '6S', '3H', '2D', 'TS']], ['QH', '5H', '2C']]]]]
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 | [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']] | [[['6S', '5S', '4D', 'QD', 'AD'], ['AC', 'KS', '7C', 'JS', 'TS'], ['3C', '7S', 'JC', '9C', '5H'], ['TH', 'QC', '6C', 'AH', '2S'], ['4C', '5C', 'QH', 'TC', 'KC']], ['8S', 'JD', '9S']] | Passed |
| 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', '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']], ['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']], []] | [[['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']], ['KC', 'AD', '9H', '6D']] | [[['5C', '9D', 'JD'], ['JC', '2C', '7D'], ['6H', 'TH', 'TS']], ['KC', 'AD', '9H', '6D']] | Passed |
| deal case 7 | [[['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']], []] | [[['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']], []] | Passed |
SHA-256 / f5fcf21e320c3b57e63ff785b1678ff3771db96fede1d6f74a31d2c6718b7799
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:24.017185+00:00.
Case digest / c03f613c404dcb0dca806b360093c7662a082584baa5ef71e349d3c56ac7460e