diff --git a/hand_utils.py b/hand_utils.py index c3a0b6f..833ce66 100644 --- a/hand_utils.py +++ b/hand_utils.py @@ -20,6 +20,21 @@ class Card: # return str(self) == str(other) # Alternative comparison method # 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: return Counter(ranks) @@ -48,32 +63,32 @@ def evaluate_hand(hand: List[Card]) -> Tuple[int, List[int]]: flush = is_flush(suits) 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: - return (8, ranks) # Straight Flush + return (8, hand_rank_name(8), ranks) # Straight Flush if 4 in rank_counts.values(): four = max(rank for rank, count in rank_counts.items() if count == 4) 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(): 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) - return (6, [three]*3 + [pair]*2) # Full House + return (6, hand_rank_name(6), [three]*3 + [pair]*2) # Full House if flush: - return (5, ranks) # Flush + return (5, hand_rank_name(5), ranks) # Flush if straight: - return (4, ranks) # Straight + return (4, hand_rank_name(4), ranks) # Straight if 3 in rank_counts.values(): 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) - 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: 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) - return (2, pairs*2 + [kicker]) # Two Pair + return (2, hand_rank_name(2), pairs*2 + [kicker]) # Two Pair if 2 in rank_counts.values(): 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) - return (1, [pair]*2 + kickers) # One Pair - return (0, ranks) # High Card + return (1, hand_rank_name(1), [pair]*2 + kickers) # One Pair + return (0, hand_rank_name(0), ranks) # High Card