Checking for a full house
flupke
flupke at nonexistingdomain.com
Thu May 26 08:43:00 EDT 2005
Raymond Hettinger wrote:
> [Benedict]
>
>>>It would be interesting to see how complicated it would get to write
>>>code to detect the correct hands in poker with wildcards included.
>
>
> There is an interesting SF project with code written in C:
> http://pokersource.sourceforge.net/
>
> In contrast, Python makes short work of these kind of problems. Here
> are some primitives to get you started (just add a representation for
> suits, flush detection, and controlling logic for ranking hands):
>
> def is_straight(hand, numwildcards=0):
> """Checks for a five card straight
>
> Inputs: list of non-wildcards plus wildcard count
> 2,3,4, ... 10, 11 for Jack, 12 for Queen,
> 13 for King, 14 for Ace
> Hand can be any length (i.e. it works for seven card games).
>
> Outputs: highest card in a five card straight
> or 0 if not a straight.
> Original list is not mutated.
> Ace can also be a low card (i.e. A2345).
>
> >>> is_straight([14,2,3,4,5])
> 5
> >>> is_straight([14,2,3,4,6])
> 0
> >>> is_straight([10,11,12,13,14])
> 14
> >>> is_straight([2,3,5], 2)
> 6
> >>> is_straight([], 5)
> 14
> >>> is_straight([2,4,6,8,10], 3)
> 12
> >>> is_straight([2,4,4,5,5], 2)
> 6
> """
>
> hand = set(hand)
> if 14 in hand:
> hand.add(1)
> for low in (10,9,8,7,6,5,4,3,2,1):
> needed = set(range(low, low+5))
> if len(needed & hand) + numwildcards >= 5:
> return low+4
> return 0
>
>
>
> def groups(hand, numwildcards=0):
> """Checks for pairs, threes-of-kind, fours-of-a-kind,
> and fives-of-a-kind
>
> Inputs: list of non-wildcards plus wildcard count
> 2,3,4, ... 10, 11 for Jack, 12 for Queen,
> 13 for King, 14 for Ace
> Hand can be any length (i.e. it works for seven card games)
> Output: tuple with counts for each value (high cards first)
> for example (3, 14), (2, 11) full-house Aces over Jacks
> for example (2, 9), (2, 7) two-pair Nines and Sevens
> Maximum count is limited to five (there is no seven of a kind).
> Original list is not mutated.
>
> >>> groups([11,14,11,14,14])
> [(3, 14), (2, 11)]
> >>> groups([7, 9, 10, 9, 7])
> [(2, 9), (2, 7)]
> >>> groups([11,14,11,14], 1)
> [(3, 14), (2, 11)]
> >>> groups([9,9,9,9,8], 2)
> [(5, 9), (2, 8)]
> >>> groups([], 7)
> [(5, 14), (2, 13)]
> """
>
> result = []
> counts = [(hand.count(v), v) for v in range(2,15)]
> for c, v in sorted(counts, reverse=True):
> newcount = min(5, c + numwildcards) # Add wildcards upto five
> numwildcards -= newcount - c # Wildcards remaining
> if newcount > 1:
> result.append((newcount, v))
> return result
>
>
>
> import doctest
> print doctest.testmod()
>
Wow Raymond that's amazing !
Makes we feel stupid, happy and in awe of python at the same time.
I only felt this weird before when i got married :)
I will have a good look at your code. Excellent :)
Regards,
Benedict Verheyen
More information about the Python-list
mailing list