The simplest algorithm for poker hand evaluation

后端 未结 12 1044
独厮守ぢ
独厮守ぢ 2020-12-04 12:39

I am thinking about poker hand (5 cards) evaluation in Java. Now I am looking for simplicity and clarity rather than performance and efficiency. I probably can

12条回答
  •  没有蜡笔的小新
    2020-12-04 13:09

    Here is a very short but complete histogram based 5 card poker scoring function in Python (2.x). It will get considerably longer if converted to Java.

    def 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'
    

提交回复
热议问题