FA-81971 / Poker hand evaluation / Open access
Multiplicity pattern looked up in ascending order · case 01
Paired hands raise a lookup failure instead of being named.
ROOT CAUSE
The multiplicity list is sorted ascending, but the name table is keyed by descending patterns.
VERIFIED REPAIR
Sort multiplicities in descending order before the table lookup.
Unsuccessful approach: Reversing the rank-ordered list only works when the larger group has the lower rank.
Case contract
Input: five cards "Rs" (rank may be written "10" for ten; suits ignored, repeated ranks allowed up to four). Each rank maps to a distinct prime (2 for deuce ... 41 for ace); the product of the five primes is factored back into rank multiplicities, and the sorted multiplicity pattern names the rank shape: four of a kind, full house, three of a kind, two pair, one pair or high card.
Why this case matters
Prime-product hashing is how table-driven evaluators identify non-flush rank multisets.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.index('T' if c[:-1]=='10' else c[:-1])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps.sort()
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | error:KeyError | one pair | Failed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | error:KeyError | one pair | Failed |
| full house | error:KeyError | full house | Failed |
| deuce and ace | high card | high card | Passed |
| high card low | high card | high card | Passed |
SHA-256 / 04dffa54792c1500e549e924a83daa965ec65d05cd9b4a2f618bcfd21970b258
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.index('T' if c[:-1]=='10' else c[:-1])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps=exps[::-1]
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | one pair | one pair | Passed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | error:KeyError | one pair | Failed |
| full house | error:KeyError | full house | Failed |
| deuce and ace | high card | high card | Passed |
| high card low | high card | high card | Passed |
SHA-256 / 609fd710fe63a551bbd6c14c39aeee1baef841ee80ef38ebcf4406ad07d84fbe
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.index('T' if c[:-1]=='10' else c[:-1])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps.sort(reverse=True)
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card')],
[('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | one pair | one pair | Passed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | one pair | one pair | Passed |
| full house | full house | full house | Passed |
| deuce and ace | high card | high card | Passed |
| high card low | high card | high card | Passed |
SHA-256 / f4b810c1acdbaeafb68470d6c0f8a39fdba31de915aaf2f9ba9dbde004e1049c
Verification & scope
A deterministic toy model with an explicitly stated contract; card strings are rank+suit (for example "As", "Td", "10h"); 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:07.792910+00:00.
Case digest / 439079a5b57a83534ed53d02788ab1f0efab04e4c0ae578120ca3933c5697e72