mirror of
https://github.com/correl/euler.git
synced 2024-11-23 19:19:53 +00:00
Making the best hand creator a generator function, adding some chinese
poker logic. git-svn-id: file:///srv/svn/euler@70 e5f4c3ec-3c0c-11df-b522-21efaa4426b5
This commit is contained in:
parent
3b11a2d0b9
commit
29cdc8556a
1 changed files with 44 additions and 12 deletions
|
@ -46,7 +46,12 @@ class Card:
|
||||||
Compares this card's value with another. Used for sorting.
|
Compares this card's value with another. Used for sorting.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return cmp(self.value, other.value)
|
result = cmp(self.value, other.value)
|
||||||
|
if result == 0:
|
||||||
|
"""Values are identical, suits differ. Doesn't affect ranking in
|
||||||
|
any way."""
|
||||||
|
result = cmp(self.suit, other.suit)
|
||||||
|
return result
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
"""Builds a string representation of the hand"""
|
"""Builds a string representation of the hand"""
|
||||||
val = self.value
|
val = self.value
|
||||||
|
@ -200,6 +205,8 @@ class Hand:
|
||||||
if not self.__values:
|
if not self.__values:
|
||||||
self.rank()
|
self.rank()
|
||||||
return self.__values
|
return self.__values
|
||||||
|
def cards(self):
|
||||||
|
return self.__cards
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create_best_hand(cards):
|
def create_best_hand(cards):
|
||||||
"""Create the strongest possible poker hand
|
"""Create the strongest possible poker hand
|
||||||
|
@ -213,7 +220,8 @@ class Hand:
|
||||||
if len(cards) <= 5:
|
if len(cards) <= 5:
|
||||||
return Hand(cards)
|
return Hand(cards)
|
||||||
else:
|
else:
|
||||||
return Hand.create_best_hand_smart(cards)
|
for hand in Hand.create_best_hand_smart(cards):
|
||||||
|
return hand
|
||||||
return false
|
return false
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create_best_hand_bruteforce(cards):
|
def create_best_hand_bruteforce(cards):
|
||||||
|
@ -257,7 +265,7 @@ class Hand:
|
||||||
flushes = sorted(flushes, reverse=True)
|
flushes = sorted(flushes, reverse=True)
|
||||||
if (flushes and flushes[0].rank() >= Hand.STRAIGHT_FLUSH):
|
if (flushes and flushes[0].rank() >= Hand.STRAIGHT_FLUSH):
|
||||||
# Straight flush! No need to check anything else
|
# Straight flush! No need to check anything else
|
||||||
return flushes[0]
|
yield flushes[0]
|
||||||
|
|
||||||
#Get all sets
|
#Get all sets
|
||||||
merged = {}
|
merged = {}
|
||||||
|
@ -279,48 +287,48 @@ class Hand:
|
||||||
h = quads[:4]
|
h = quads[:4]
|
||||||
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:1]
|
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:1]
|
||||||
for r in remaining: h.append(r)
|
for r in remaining: h.append(r)
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
if trips and pairs:
|
if trips and pairs:
|
||||||
# Get a full house together
|
# Get a full house together
|
||||||
h = trips[:3]
|
h = trips[:3]
|
||||||
remaining = pairs[:2]
|
remaining = pairs[:2]
|
||||||
for r in remaining: h.append(r)
|
for r in remaining: h.append(r)
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
if flushes:
|
if flushes:
|
||||||
# We've already got a flush, return it!
|
# We've already got a flush, return it!
|
||||||
return flushes[0]
|
yield flushes[0]
|
||||||
# Look for a straight!
|
# Look for a straight!
|
||||||
mvals = sorted(merged.keys(), reverse=True)
|
mvals = sorted(merged.keys(), reverse=True)
|
||||||
for i in range(0, len(mvals) -4, 1):
|
for i in range(0, len(mvals) -4, 1):
|
||||||
if (mvals[i] - mvals[i + 4]) == 4:
|
if (mvals[i] - mvals[i + 4]) == 4:
|
||||||
# Regular straight
|
# Regular straight
|
||||||
h = [[c for c in cards if c.value == v][0] for v in mvals[i:i + 5]]
|
h = [[c for c in cards if c.value == v][0] for v in mvals[i:i + 5]]
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
elif 14 in [c.value for c in cards] and mvals[i + 1] == 5 and mvals[i + 4] == 2:
|
elif 14 in [c.value for c in cards] and mvals[i + 1] == 5 and mvals[i + 4] == 2:
|
||||||
# Ace low straight
|
# Ace low straight
|
||||||
h = [[c for c in cards if c.value == v][0] for v in mvals[i + 1:i + 5]]
|
h = [[c for c in cards if c.value == v][0] for v in mvals[i + 1:i + 5]]
|
||||||
h.append([c for c in cards if c.value == 14][0])
|
h.append([c for c in cards if c.value == 14][0])
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
|
|
||||||
if trips:
|
if trips:
|
||||||
h = trips[:3]
|
h = trips[:3]
|
||||||
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:2]
|
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:2]
|
||||||
for r in remaining: h.append(r)
|
for r in remaining: h.append(r)
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
if pairs:
|
if pairs:
|
||||||
if len(pairs) > 2:
|
if len(pairs) > 2:
|
||||||
h = pairs[:4]
|
h = pairs[:4]
|
||||||
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:1]
|
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:1]
|
||||||
for r in remaining: h.append(r)
|
for r in remaining: h.append(r)
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
else:
|
else:
|
||||||
h = pairs
|
h = pairs
|
||||||
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:3]
|
remaining = [c for c in cards if c.value not in [cc.value for cc in h]][:3]
|
||||||
for r in remaining: h.append(r)
|
for r in remaining: h.append(r)
|
||||||
return Hand([str(c) for c in h])
|
yield Hand([str(c) for c in h])
|
||||||
|
|
||||||
# High card, send the top 5 reverse-sorted cards
|
# High card, send the top 5 reverse-sorted cards
|
||||||
return Hand([str(c) for c in cards[:5]])
|
yield Hand([str(c) for c in cards[:5]])
|
||||||
def __cmp__(self, other):
|
def __cmp__(self, other):
|
||||||
"""Compare hand rankings
|
"""Compare hand rankings
|
||||||
|
|
||||||
|
@ -337,6 +345,22 @@ class Hand:
|
||||||
return result
|
return result
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
class ChinesePokerHand:
|
||||||
|
def __init__(self, cards):
|
||||||
|
if len(cards) != 13:
|
||||||
|
raise InvalidHand();
|
||||||
|
self.__cards = cards
|
||||||
|
self.build_hands()
|
||||||
|
def build_hands(self):
|
||||||
|
self.build_hands_dumb()
|
||||||
|
def build_hands_dumb(self):
|
||||||
|
self.__bottom = Hand.create_best_hand([str(c) for c in self.__cards])
|
||||||
|
self.__middle = Hand.create_best_hand([str(c) for c in self.__cards if c not in self.__bottom.cards()])
|
||||||
|
self.__top = Hand.create_best_hand([str(c) for c in self.__cards if c not in (self.__bottom.cards() + self.__middle.cards())])
|
||||||
|
def __repr__(self):
|
||||||
|
return 'Chinese Poker Hand:\n\tTop: {0}\n\tMiddle: {1}\n\tBottom: {2}'.format(self.__top, self.__middle, self.__bottom)
|
||||||
|
|
||||||
|
|
||||||
class Player:
|
class Player:
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.__name = name
|
self.__name = name
|
||||||
|
@ -382,3 +406,11 @@ if __name__ == '__main__':
|
||||||
print 'Community', community_cards
|
print 'Community', community_cards
|
||||||
for player in players:
|
for player in players:
|
||||||
print player
|
print player
|
||||||
|
|
||||||
|
print '\nChinese Poker Example'
|
||||||
|
deck = Deck()
|
||||||
|
deck.shuffle()
|
||||||
|
for i in range(4):
|
||||||
|
cards = deck.deal(13)
|
||||||
|
chinese = ChinesePokerHand(cards)
|
||||||
|
print chinese
|
Loading…
Reference in a new issue