From b882ba3c8db4f870aa8c9f58f24243c0ac869a6f Mon Sep 17 00:00:00 2001 From: Correl Roush Date: Wed, 31 Mar 2010 20:14:47 +0000 Subject: [PATCH] Updated class comparisons to use the magic __cmp__ method. Fixed ace low straight values. Fixed broken comparison tests. git-svn-id: file:///srv/svn/euler@9 e5f4c3ec-3c0c-11df-b522-21efaa4426b5 --- 054/poker.py | 31 ++++++++++++++----------------- 054/test.py | 10 +++++----- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/054/poker.py b/054/poker.py index ce9f166..723dbe3 100644 --- a/054/poker.py +++ b/054/poker.py @@ -28,14 +28,8 @@ class Card: self.suit = string[1] if not self.suit in ['H', 'C', 'S', 'D']: raise InvalidCard - @staticmethod - def compare(a, b): - if a.value > b.value: - return 1 - elif a.value == b.value: - return 0 - else: - return -1 + def __cmp__(self, other): + return cmp(self.value, other.value) class Hand: HIGH_CARD = 0 @@ -62,7 +56,7 @@ class Hand: ] def __init__(self, cards): self.__rank = None - self.__cards = sorted([Card(c) for c in cards], cmp=Card.compare, reverse=True) + self.__cards = sorted([Card(c) for c in cards], reverse=True) self.__values = [] self.rank() def __str__(self): @@ -88,9 +82,13 @@ class Hand: merged[c.value] = 1 if (len(merged)) == 5: # All unique cards, check for a straight - if self.__cards[0].value - self.__cards[4].value == 4 or \ - (self.__cards[4].value == 2 and self.__cards[1].value == 5 and self.__cards[0].value == 14): + if self.__cards[0].value - self.__cards[4].value == 4: straight = True + if self.__cards[4].value == 2 and self.__cards[1].value == 5 and self.__cards[0].value == 14: + straight = True + # Set the value of the ace to 1 and resort so hand comparisons work correctly + self.__cards[0].value = 1 + self.__cards = sorted(self.__cards, reverse=True) if straight and flush: if self.__cards[0].value == 14: self.__rank = Hand.ROYAL_FLUSH @@ -138,20 +136,19 @@ class Hand: def create_best_hand_bruteforce(cards): combos = unique_combinations(cards, 5) hands = [Hand(combo) for combo in combos] - hands = sorted(hands, cmp=Hand.compare, reverse=True) + hands = sorted(hands, reverse=True) return hands[0] @staticmethod def create_best_hand_smart(cards): #TODO: Figure out a smarter algorithm for getting the best hand! pass - @staticmethod - def compare(a, b): + def __cmp__(self, other): # Compare hand rankings - result = cmp(a.rank(), b.rank()) + result = cmp(self.rank(), other.rank()) if (result == 0): # Compare hand values - for i in range(len(a.values())): - result = cmp(a.values()[i], b.values()[i]) + for i in range(len(self.values())): + result = cmp(self.values()[i], other.values()[i]) if (result != 0): return result return result \ No newline at end of file diff --git a/054/test.py b/054/test.py index 321f71d..f490cc0 100644 --- a/054/test.py +++ b/054/test.py @@ -16,7 +16,7 @@ class TestCards(unittest.TestCase): self.assertRaises(poker.InvalidCard, poker.Card, '9Z') def test_compare(self): cards = ['QH', '9D', 'JS'] - cards_sorted = sorted([poker.Card(c) for c in cards], cmp=poker.Card.compare, reverse=True) + cards_sorted = sorted([poker.Card(c) for c in cards], reverse=True) self.assertEqual([c.value for c in cards_sorted], [12, 11, 9]) class TestFiveCardHands(unittest.TestCase): @@ -41,7 +41,7 @@ class TestFiveCardHands(unittest.TestCase): self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [14, 13, 12, 11, 10]]) def test_ace_low_straight(self): hand = poker.Hand(['AH', '2S', '3C', '4S', '5S']) - self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [14, 5, 4, 3, 2]]) + self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [5, 4, 3, 2, 1]]) def test_compare_ace_low_straight(self): low = poker.Hand(['AH', '2S', '3C', '4S', '5S']) high = poker.Hand(['2S', '3C', '4S', '5S', '6S']) @@ -77,10 +77,10 @@ class TestSevenCardHands(unittest.TestCase): hand = poker.Hand.create_best_hand(['AH', 'KS', 'QC', 'JS', '9S', '7D', 'TS']) self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [14, 13, 12, 11, 10]]) def test_ace_low_straight(self): - hand = poker.Hand.create_best_hand(['AH', '2S', '3C', '4S', '6D', '4C', '5S']) - self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [14, 5, 4, 3, 2]]) + hand = poker.Hand.create_best_hand(['AH', '2S', '3C', '4S', '9D', '4C', '5S']) + self.assertEqual([hand.rank(), hand.values()], [poker.Hand.STRAIGHT, [5, 4, 3, 2, 1]]) def test_compare_ace_low_straight(self): - low = poker.Hand.create_best_hand(['AH', '2S', '3C', '4S', '6D', '4C', '5S']) + low = poker.Hand.create_best_hand(['AH', '2S', '3C', '4S', '9D', '4C', '5S']) high = poker.Hand.create_best_hand(['2S', '3C', '4S', '5S', '8D', 'TC', '6S']) self.assertTrue(low < high) def test_compare_ranks(self):