Правильный расчет комбинации стрит
Столкнулся с проблемой а именно подходом в расчете, в faces у меня есть не только цифры, но и их последовательность нужно учитывать, моя функция рассчитывает стрит только циферных карт до 10. Но J, Q, K, A уже не проходят проверку как можно переделать так чтобы это работало вместе с буквами?
suits = "♥,♠,♣,♦".split(',')
faces = "2,3,4,5,6,7,8,9,10,J,Q,K,A"
face = faces.split(',')
class Card(namedtuple('Card', 'face, suit')):
def __repr__(self):
return ''.join(self)
hand = [Card("2", "♥"),Card("10", "♥"),Card("9", "♥"),Card("8", "♥"),Card("J", "♥"),Card("Q", "♥")]
#Проверка на стрит
def straight(hand):
ordered = sorted(hand, key=lambda card: (faces.index(card.face), card.suit))
if ''.join(card.face for card in ordered) in ''.join(face):
return 5, f"Стрит до {ordered[-1].face}"
return False;
Ответы (1 шт):
Автор решения: Вадим Александру
→ Ссылка
import collections
import operator
from enum import IntEnum
Suits = IntEnum("Suits", "♥ ♠ ♣ ♦")
Ranks = IntEnum("Ranks", "A 2 3 4 5 6 7 8 9 10 J Q K")
Card = collections.namedtuple("Card", "rank suit")
cardsinfo = [(3, "♣"), (4, "♦"), (5, "♥"), (6, '♥'), (7,'♥')]
hand = [Card(Ranks(r), Suits[s]) for r,s in cardsinfo]
def straight(hand):
hand.sort(key=operator.attrgetter("rank"))
start = hand[0].rank
straight = [Card(r, None) for r in range(start, start+6)]
if all(got.rank == want.rank for got,want in zip(hand, straight)):
print(f"Стрит до {hand[-1].rank}")
else: print('Увы, в следующий раз полюбому будет стрит')