ポーカーの役判定
お題にしようと思っていたのに間違えてしまいました。今から変更可能でしょうか?
(説明) 当初間違ってトピックに投稿していたので、このようなコメントを付けていたのですが、 このコメントに気づいた管理人さんにお題に移していただきました。 (最初の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])
|





xsd
#4978()
Rating6/10=0.60
引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。
条件:
実行例:
see: ポーカー - Wikipedia
1 reply [ reply ]