FA-82156 / Poker hand evaluation / Open access
Pocket pair combos enumerated as ordered deals · case 01
"QQ" enumerates 12 combos with no blockers and 9 with one queen dead.
ROOT CAUSE
Only identical suits are skipped, so Qc-Qd and Qd-Qc are both counted.
VERIFIED REPAIR
For pairs, enumerate suit pairs with the second index strictly after the first.
Unsuccessful approach: Skipping only j<i keeps the impossible same-card pair Qh-Qh.
Case contract
Input: {"hand": class such as "AKs", "AKo", "AK" or "QQ", "dead": [known cards, rank upper-case or lower-case, suit lower-case or upper-case]}. Enumerate the concrete two-card combos of the class (suits c,d,h,s) and return how many contain no dead card.
Why this case matters
Blocker math decides how many value combos an opponent can still hold.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
S='cdhs'
h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
r1,r2=h[0],h[1]; suf=h[2:]
n=0
for i,s1 in enumerate(S):
for j,s2 in enumerate(S):
if r1==r2 and j==i: continue
if suf=='s' and s1!=s2: continue
if suf=='o' and s1==s2: continue
if r1+s1 in dead or r2+s2 in dead: continue
n+=1
return n
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| pair no blockers | 12 | 6 | Failed |
| pair one blocker | 6 | 3 | Failed |
| suited no blockers | 4 | 4 | Passed |
| suited blocked king | 3 | 3 | Passed |
| offsuit blocked king | 9 | 9 | Passed |
| any ace king two blockers | 9 | 9 | Passed |
| lower-case dead | 7 | 7 | Passed |
| upper-case suit dead | 3 | 3 | Passed |
SHA-256 / d150c8af410facefd43ad0cf7b0e008fae6411ebba54dfc16cb8603e4f3f76c1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
S='cdhs'
h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
r1,r2=h[0],h[1]; suf=h[2:]
n=0
for i,s1 in enumerate(S):
for j,s2 in enumerate(S):
if r1==r2 and j<i: continue
if suf=='s' and s1!=s2: continue
if suf=='o' and s1==s2: continue
if r1+s1 in dead or r2+s2 in dead: continue
n+=1
return n
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| pair no blockers | 10 | 6 | Failed |
| pair one blocker | 6 | 3 | Failed |
| suited no blockers | 4 | 4 | Passed |
| suited blocked king | 3 | 3 | Passed |
| offsuit blocked king | 9 | 9 | Passed |
| any ace king two blockers | 9 | 9 | Passed |
| lower-case dead | 7 | 7 | Passed |
| upper-case suit dead | 3 | 3 | Passed |
SHA-256 / e3d83fa209d84c43fb9a280e59fb71f1d27023cb348c0642276ff0c8cb4bc82c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
S='cdhs'
h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
r1,r2=h[0],h[1]; suf=h[2:]
n=0
for i,s1 in enumerate(S):
for j,s2 in enumerate(S):
if r1==r2 and j<=i: continue
if suf=='s' and s1!=s2: continue
if suf=='o' and s1==s2: continue
if r1+s1 in dead or r2+s2 in dead: continue
n+=1
return n
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
[('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| pair no blockers | 6 | 6 | Passed |
| pair one blocker | 3 | 3 | Passed |
| suited no blockers | 4 | 4 | Passed |
| suited blocked king | 3 | 3 | Passed |
| offsuit blocked king | 9 | 9 | Passed |
| any ace king two blockers | 9 | 9 | Passed |
| lower-case dead | 7 | 7 | Passed |
| upper-case suit dead | 3 | 3 | Passed |
SHA-256 / 4661b1e891e7fab2e354e335542dcdfbe0fd46235b27a4d525c32546bd4298ca
Verification & scope
A deterministic toy model with an explicitly stated contract; card strings are rank+suit (for example "As", "Td"); no claim of conformance to any casino or tournament rulebook. 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:09.508548+00:00.
Case digest / ec559c6184da8f162fcc1f138efd56313da0bd9892ef69113aa970f1a8115dcc