fork download
  1. class Card:
  2. ranks = '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'
  3. rank_map = {name: rank for rank, name in enumerate(ranks, 1)}
  4.  
  5. def __init__(self, card):
  6. self._card = card
  7.  
  8. if card != 'Joker':
  9. rank, suit = card[:-1], card[-1:]
  10. self.rank = Card.rank_map[rank]
  11. self.suit = suit
  12. else:
  13. self.rank = -1
  14. self.suit = ''
  15.  
  16. @property
  17. def is_joker(self):
  18. return self._card == 'Joker'
  19.  
  20. def __repr__(self):
  21. return self._card
  22.  
  23.  
  24. def is_straight(cards, min_cards=5):
  25. if len(cards) < min_cards:
  26. return False
  27.  
  28. ranks = sorted(x.rank for x in cards if not x.is_joker)
  29. jokers = len(cards) - len(ranks)
  30.  
  31. for i, rank in enumerate(ranks[:-1]):
  32. difference = ranks[i + 1] - rank
  33.  
  34. if difference == 1:
  35. continue
  36.  
  37. # fill the gap between the ranks with jokers
  38. if jokers >= difference - 1 > 0:
  39. jokers -= difference - 1
  40. continue
  41.  
  42. return False
  43.  
  44. return True
  45.  
  46.  
  47. tests = (
  48. (False, ),
  49. (False, 'A♣', 'A♣', 'A♠', '2♦', 'A♥'),
  50. (False, 'K♣', 'K♣', 'Q♠', '10♦', 'A♥'),
  51. (False, '9♣', 'K♣', 'Q♠', 'J♦', 'A♥'),
  52. (False, 'K♣', 'Q♠', 'J♦', '10♥'),
  53. (False, 'Joker', 'Joker', 'Joker', 'Joker'),
  54. (False, '10♣', 'A♣', 'Joker', '9♦', '8♥'),
  55. (False, 'Q♣', 'Q♣', 'Joker', '10♦', 'A♥'),
  56. (True, 'A♣', 'K♣', 'Q♠', 'J♦', '10♥'),
  57. (True, '10♣', 'K♣', 'Q♠', 'J♦', 'A♥'),
  58. (True, '10♣', 'K♣', 'Joker', 'J♦', 'A♥'),
  59. (True, '10♣', 'Joker', 'Joker', '9♦', '8♥'),
  60. (True, 'Joker', 'Joker', 'Joker', 'Joker', '9♦'),
  61. (True, 'Joker', 'Joker', 'Joker', 'Joker', 'Joker'),
  62. )
  63.  
  64. for expected, *cards in tests:
  65. cards = [Card(card) for card in cards]
  66. assert expected == is_straight(cards), (cards, expected)
Success #stdin #stdout 0.01s 28384KB
stdin
Standard input is empty
stdout
Standard output is empty