222k views
3 votes
Write a function flush that takes as input a list of five cards, tests whether it is a flush (Note: straight flush is not a flush!) and return a boolean value. If the entry is anything other than five distinct cards, it should return (not print!) the message "This is not a valid poker hand".

1 Answer

1 vote

Answer:

Step-by-step explanation:

ef poker(hands):

scores = [(i, score(hand.split())) for i, hand in enumerate(hands)]

winner = sorted(scores , key=lambda x:x[1])[-1][0]

return hands[winner]

def score(hand):

ranks = '23456789TJQKA'

rcounts = {ranks.find(r): ''.join(hand).count(r) for r, _ in hand}.items()

score, ranks = zip(*sorted((cnt, rank) for rank, cnt in rcounts)[::-1])

if len(score) == 5:

if ranks[0:2] == (12, 3): #adjust if 5 high straight

ranks = (3, 2, 1, 0, -1)

straight = ranks[0] - ranks[4] == 4

flush = len({suit for _, suit in hand}) == 1

'''no pair, straight, flush, or straight flush'''

score = ([1, (3,1,1,1)], [(3,1,1,2), (5,)])[flush][straight]

return score, ranks

>>> poker(['8C TS KC 9H 4S', '7D 2S 5D 3S AC', '8C AD 8D AC 9C', '7C 5H 8D TD KS'])

'8C AD 8D AC 9C'

User Dalbergia
by
4.9k points