class Card:
ranks = '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'
rank_map = {name: rank for rank, name in enumerate(ranks, 1)}
def __init__(self, card):
self._card = card
if card != 'Joker':
rank, suit = card[:-1], card[-1:]
self.rank = Card.rank_map[rank]
self.suit = suit
else:
self.rank = -1
self.suit = ''
@property
def is_joker(self):
return self._card == 'Joker'
def __repr__(self):
return self._card
def is_straight(cards, min_cards=5):
if len(cards) < min_cards:
return False
ranks = sorted(x.rank for x in cards if not x.is_joker)
jokers = len(cards) - len(ranks)
for i, rank in enumerate(ranks[:-1]):
difference = ranks[i + 1] - rank
if difference == 1:
continue
# fill the gap between the ranks with jokers
if jokers >= difference - 1 > 0:
jokers -= difference - 1
continue
return False
return True
tests = (
(False, ),
(False, 'A♣', 'A♣', 'A♠', '2♦', 'A♥'),
(False, 'K♣', 'K♣', 'Q♠', '10♦', 'A♥'),
(False, '9♣', 'K♣', 'Q♠', 'J♦', 'A♥'),
(False, 'K♣', 'Q♠', 'J♦', '10♥'),
(False, 'Joker', 'Joker', 'Joker', 'Joker'),
(False, '10♣', 'A♣', 'Joker', '9♦', '8♥'),
(False, 'Q♣', 'Q♣', 'Joker', '10♦', 'A♥'),
(True, 'A♣', 'K♣', 'Q♠', 'J♦', '10♥'),
(True, '10♣', 'K♣', 'Q♠', 'J♦', 'A♥'),
(True, '10♣', 'K♣', 'Joker', 'J♦', 'A♥'),
(True, '10♣', 'Joker', 'Joker', '9♦', '8♥'),
(True, 'Joker', 'Joker', 'Joker', 'Joker', '9♦'),
(True, 'Joker', 'Joker', 'Joker', 'Joker', 'Joker'),
)
for expected, *cards in tests:
cards = [Card(card) for card in cards]
assert expected == is_straight(cards), (cards, expected)
Y2xhc3MgQ2FyZDoKICAgIHJhbmtzID0gJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcxMCcsICdKJywgJ1EnLCAnSycsICdBJwogICAgcmFua19tYXAgPSB7bmFtZTogcmFuayBmb3IgcmFuaywgbmFtZSBpbiBlbnVtZXJhdGUocmFua3MsIDEpfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXJkKToKICAgICAgICBzZWxmLl9jYXJkID0gY2FyZAoKICAgICAgICBpZiBjYXJkICE9ICdKb2tlcic6CiAgICAgICAgICAgIHJhbmssIHN1aXQgPSBjYXJkWzotMV0sIGNhcmRbLTE6XQogICAgICAgICAgICBzZWxmLnJhbmsgPSBDYXJkLnJhbmtfbWFwW3JhbmtdCiAgICAgICAgICAgIHNlbGYuc3VpdCA9IHN1aXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJhbmsgPSAtMQogICAgICAgICAgICBzZWxmLnN1aXQgPSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2pva2VyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jYXJkID09ICdKb2tlcicKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NhcmQKCgpkZWYgaXNfc3RyYWlnaHQoY2FyZHMsIG1pbl9jYXJkcz01KToKICAgIGlmIGxlbihjYXJkcykgPCBtaW5fY2FyZHM6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgcmFua3MgPSBzb3J0ZWQoeC5yYW5rIGZvciB4IGluIGNhcmRzIGlmIG5vdCB4LmlzX2pva2VyKQogICAgam9rZXJzID0gbGVuKGNhcmRzKSAtIGxlbihyYW5rcykKCiAgICBmb3IgaSwgcmFuayBpbiBlbnVtZXJhdGUocmFua3NbOi0xXSk6CiAgICAgICAgZGlmZmVyZW5jZSA9IHJhbmtzW2kgKyAxXSAtIHJhbmsKCiAgICAgICAgaWYgZGlmZmVyZW5jZSA9PSAxOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIGZpbGwgdGhlIGdhcCBiZXR3ZWVuIHRoZSByYW5rcyB3aXRoIGpva2VycwogICAgICAgIGlmIGpva2VycyA+PSBkaWZmZXJlbmNlIC0gMSA+IDA6CiAgICAgICAgICAgIGpva2VycyAtPSBkaWZmZXJlbmNlIC0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICByZXR1cm4gVHJ1ZQoKCnRlc3RzID0gKAogICAgKEZhbHNlLCApLAogICAgKEZhbHNlLCAnQeKZoycsICdB4pmjJywgJ0HimaAnLCAnMuKZpicsICdB4pmlJyksCiAgICAoRmFsc2UsICdL4pmjJywgJ0vimaMnLCAnUeKZoCcsICcxMOKZpicsICdB4pmlJyksCiAgICAoRmFsc2UsICc54pmjJywgJ0vimaMnLCAnUeKZoCcsICdK4pmmJywgJ0HimaUnKSwKICAgIChGYWxzZSwgJ0vimaMnLCAnUeKZoCcsICdK4pmmJywgJzEw4pmlJyksCiAgICAoRmFsc2UsICdKb2tlcicsICdKb2tlcicsICdKb2tlcicsICdKb2tlcicpLAogICAgKEZhbHNlLCAnMTDimaMnLCAnQeKZoycsICdKb2tlcicsICc54pmmJywgJzjimaUnKSwKICAgIChGYWxzZSwgJ1HimaMnLCAnUeKZoycsICdKb2tlcicsICcxMOKZpicsICdB4pmlJyksCiAgICAoVHJ1ZSwgICdB4pmjJywgJ0vimaMnLCAnUeKZoCcsICdK4pmmJywgJzEw4pmlJyksCiAgICAoVHJ1ZSwgICcxMOKZoycsICdL4pmjJywgJ1HimaAnLCAnSuKZpicsICdB4pmlJyksCiAgICAoVHJ1ZSwgICcxMOKZoycsICdL4pmjJywgJ0pva2VyJywgJ0rimaYnLCAnQeKZpScpLAogICAgKFRydWUsICAnMTDimaMnLCAnSm9rZXInLCAnSm9rZXInLCAnOeKZpicsICc44pmlJyksCiAgICAoVHJ1ZSwgICdKb2tlcicsICdKb2tlcicsICdKb2tlcicsICdKb2tlcicsICc54pmmJyksCiAgICAoVHJ1ZSwgICdKb2tlcicsICdKb2tlcicsICdKb2tlcicsICdKb2tlcicsICdKb2tlcicpLAopCgpmb3IgZXhwZWN0ZWQsICpjYXJkcyBpbiB0ZXN0czoKICAgIGNhcmRzID0gW0NhcmQoY2FyZCkgZm9yIGNhcmQgaW4gY2FyZHNdCiAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gaXNfc3RyYWlnaHQoY2FyZHMpLCAoY2FyZHMsIGV4cGVjdGVkKQ==