Moved hand_rank_name to hand_utils.py

This commit is contained in:
Donald Calloway 2025-09-19 18:57:07 -07:00
parent 689ac58a7d
commit 8dd2abb38c

View File

@ -20,6 +20,21 @@ class Card:
# return str(self) == str(other) # Alternative comparison method # return str(self) == str(other) # Alternative comparison method
# Other utility functions for hand evaluation # Other utility functions for hand evaluation
def hand_rank_name(rank: int) -> str:
names = {
9: "Royal Flush",
8: "Straight Flush",
7: "Four of a Kind",
6: "Full House",
5: "Flush",
4: "Straight",
3: "Three of a Kind",
2: "Two Pair",
1: "One Pair",
0: "High Card"
}
return names.get(rank, "Unknown Hand")
def get_rank_counts(ranks: List[int]) -> Counter: def get_rank_counts(ranks: List[int]) -> Counter:
return Counter(ranks) return Counter(ranks)
@ -48,32 +63,32 @@ def evaluate_hand(hand: List[Card]) -> Tuple[int, List[int]]:
flush = is_flush(suits) flush = is_flush(suits)
if flush and ranks == [14, 13, 12, 11, 10]: if flush and ranks == [14, 13, 12, 11, 10]:
return (9, ranks) # Royal Flush return (9, hand_rank_name(9), ranks) # Royal Flush
if flush and straight: if flush and straight:
return (8, ranks) # Straight Flush return (8, hand_rank_name(8), ranks) # Straight Flush
if 4 in rank_counts.values(): if 4 in rank_counts.values():
four = max(rank for rank, count in rank_counts.items() if count == 4) four = max(rank for rank, count in rank_counts.items() if count == 4)
kicker = max(rank for rank in ranks if rank != four) kicker = max(rank for rank in ranks if rank != four)
return (7, [four]*4 + [kicker]) # Four of a Kind return (7, hand_rank_name(7), [four]*4 + [kicker]) # Four of a Kind
if 3 in rank_counts.values() and 2 in rank_counts.values(): if 3 in rank_counts.values() and 2 in rank_counts.values():
three = max(rank for rank, count in rank_counts.items() if count == 3) three = max(rank for rank, count in rank_counts.items() if count == 3)
pair = max(rank for rank, count in rank_counts.items() if count == 2) pair = max(rank for rank, count in rank_counts.items() if count == 2)
return (6, [three]*3 + [pair]*2) # Full House return (6, hand_rank_name(6), [three]*3 + [pair]*2) # Full House
if flush: if flush:
return (5, ranks) # Flush return (5, hand_rank_name(5), ranks) # Flush
if straight: if straight:
return (4, ranks) # Straight return (4, hand_rank_name(4), ranks) # Straight
if 3 in rank_counts.values(): if 3 in rank_counts.values():
three = max(rank for rank, count in rank_counts.items() if count == 3) three = max(rank for rank, count in rank_counts.items() if count == 3)
kickers = sorted([rank for rank in ranks if rank != three], reverse=True) kickers = sorted([rank for rank in ranks if rank != three], reverse=True)
return (3, [three]*3 + kickers) # Three of a Kind return (3, hand_rank_name(3), [three]*3 + kickers) # Three of a Kind
if list(rank_counts.values()).count(2) == 2: if list(rank_counts.values()).count(2) == 2:
pairs = sorted([rank for rank, count in rank_counts.items() if count == 2], reverse=True) pairs = sorted([rank for rank, count in rank_counts.items() if count == 2], reverse=True)
kicker = max(rank for rank in ranks if rank not in pairs) kicker = max(rank for rank in ranks if rank not in pairs)
return (2, pairs*2 + [kicker]) # Two Pair return (2, hand_rank_name(2), pairs*2 + [kicker]) # Two Pair
if 2 in rank_counts.values(): if 2 in rank_counts.values():
pair = max(rank for rank, count in rank_counts.items() if count == 2) pair = max(rank for rank, count in rank_counts.items() if count == 2)
kickers = sorted([rank for rank in ranks if rank != pair], reverse=True) kickers = sorted([rank for rank in ranks if rank != pair], reverse=True)
return (1, [pair]*2 + kickers) # One Pair return (1, hand_rank_name(1), [pair]*2 + kickers) # One Pair
return (0, ranks) # High Card return (0, hand_rank_name(0), ranks) # High Card