challenge ポーカーの役判定

引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。

条件:

  • スートはS,D,H,C、ランクはA,2~9,T,J,Q,Kのそれぞれ一文字で表します。
  • 手札は S2D5H3CQS9 のように10文字で指定されます。特にソートはされていません。
  • 手札にジョーカーは含まれません。
  • ストレートで取りうるランクの種類はA2345, 23456 ... 9TJQK, TJQKAの10種類で、JQKA2のようにK-A-2をまたぐものはストレートではありません。

実行例:

% ./poker SQSJSASKST
Royal flush

% ./poker D9D7D6D5D8
Straight flush

% ./poker C2D2S2H3H2
Four of a kind

% ./poker C2D3S2H3H2
Full house

% ./poker S9S4S8STSJ
Flush

% ./poker C4H7D5S6H3
Straight

% ./poker S6H6C5DQC6
Three of a kind

% ./poker S6HQC5DQC6
Two pair

% ./poker S6H4C5DQC6
One pair

% ./poker SJSQSKSAC2
No pair

お題にしようと思っていたのに間違えてしまいました。今から変更可能でしょうか?

(説明)
当初間違ってトピックに投稿していたので、このようなコメントを付けていたのですが、
このコメントに気づいた管理人さんにお題に移していただきました。
(最初の2つだけ投稿日時が早いのはそのためです)

Posted feedbacks - Python

こんな感じ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import sys
import collections

def solve(s):
    it = iter(s)
    cards = []
    for _ in xrange(5):
        suit = "SDHC".index(it.next())
        number = "A23456789TJQK".index(it.next()) + 1
        cards.append((suit, number))

    counts = collections.defaultdict(int)
    for suit, number in cards:
        counts[number] += 1
    counts = sorted(counts.itervalues())

    flush = all(cards[0][0] == suit for suit, number in cards[1:])

    numbers = sorted(number for suit, number in cards)
    royal_straight = (numbers == [1, 10, 11, 12, 13])
    straight = all(numbers[i] + 1 == numbers[i + 1] for i in xrange(4)) or royal_straight

    if royal_straight and flush:
        return "Royal flush"
    elif straight and flush:
        return "Straight flush"
    elif counts == [1, 4]:
        return "Four of a kind"
    elif counts == [2, 3]:
        return "Full House"
    elif flush:
        return "Flush"
    elif straight:
        return "Straight"
    elif counts == [1, 1, 3]:
        return "Three of a kind"
    elif counts == [1, 2, 2]:
        return "Two pair"
    elif counts == [1, 1, 1, 2]:
        return "One pair"
    else:
        assert counts == [1, 1, 1, 1, 1]
        return "No pair"

def main():
    if len(sys.argv) >= 2:
        for s in sys.argv[1:]:
            print solve(s)
    else:
        print solve("SQSJSASKST") # Royal flush
        print solve("D9D7D6D5D8") # Straight flush
        print solve("C2D2S2H3H2") # Four of a kind
        print solve("C2D3S2H3H2") # Full house
        print solve("S9S4S8STSJ") # Flush
        print solve("C4H7D5S6H3") # Straight
        print solve("S6H6C5DQC6") # Three of a kind
        print solve("S6HQC5DQC6") # Two pair
        print solve("S6H4C5DQC6") # One pair
        print solve("SJSQSKSAC2") # No pair

if __name__ == '__main__':
    main()


	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys

def f(c):
  d = {'A': '1', 'T': 'a', 'J': 'b', 'Q': 'c', 'K': 'd'}
  s = len(set([c[i] for i in range(0,10,2)])) == 1
  r = ''.join(sorted([d[c[i]] if c[i] in d else c[i] for i in range(1,11,2)]))
  l = len(set(r))
  if l == 2:
    print 'Four of a kind' if r.count(r[0]) in [1,4] else 'Full house'
  elif l == 5:
    if '123456789abcd 1abcd'.find(r) >= 0:
      print ('Royal flush 'if r == '1abcd' else 'Straight flush') if s else 'Straight'
    elif s:
      print 'Flush'
    else:
      print 'No pair'
  elif s:
    print 'Flush'
  elif l == 4:
    print 'One pair'
  elif l == 3:
    print 'Three of a kind' if [i for i in set(r) if r.count(i) >= 3] else 'Two pair'

f(sys.argv[1])

こういうときに便利なスライスの記法を思い出したのと
文字の置換も必要なかったので、ちょっと書き直しました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys

def f(c):
  s = len(set(c[0::2])) == 1
  r = ''.join(sorted(c[1::2]))
  l = len(set(r))
  if l == 2:
    print 'Four of a kind' if r.count(r[0]) in [1,4] else 'Full house'
  elif l == 5:
    if '2345A23456789T789JT89JQT9JKQTAJKQT'.find(r) >= 0:
      print ('Royal flush' if r == 'AJKQT' else 'Straight flush') if s else 'Straight'
    elif s:
      print 'Flush'
    else:
      print 'No pair'
  elif s:
    print 'Flush'
  elif l == 3:
    print 'Three of a kind' if [i for i in set(r) if r.count(i) >= 3] else 'Two pair'
  else:
    print 'One pair'

f(sys.argv[1])

Index

Feed

Other

Link

Pathtraq

loading...