def three_of_a_kind(p1, p2) -> int: if get_keys_of_value(Card.numbers_count(p1), 3) > get_keys_of_value(Card.numbers_count(p2), 3): return 1 elif get_keys_of_value(Card.numbers_count(p1), 3) < get_keys_of_value(Card.numbers_count(p2), 3): return 2 # else, three is tied return high_card(p1, p2)
def four_of_a_kind(p1, p2) -> int: if get_keys_of_value(Card.numbers_count(p1), 4) > get_keys_of_value(Card.numbers_count(p2), 4): return 1 elif get_keys_of_value(Card.numbers_count(p1), 4) < get_keys_of_value(Card.numbers_count(p2), 4): return 2 # else, tie in four, check the 5th card return high_card(p1, p2)
def two_pair(p1, p2) -> int: if get_keys_of_value(Card.numbers_count(p1), 2) > get_keys_of_value(Card.numbers_count(p2), 2): return 1 elif get_keys_of_value(Card.numbers_count(p1), 2) < get_keys_of_value(Card.numbers_count(p2), 2): return 2 # else, tie in both pairs return high_card(p1, p2)
def pair(p1, p2) -> int: if get_keys_of_value(Card.numbers_count(p1), 2) > get_keys_of_value(Card.numbers_count(p2), 2): return 1 elif get_keys_of_value(Card.numbers_count(p1), 2) < get_keys_of_value(Card.numbers_count(p2), 2): return 2 # else, pair is tied return high_card(p1, p2)
def high_card(p1, p2) -> int: p1 = Card.sort_by_number(p1) p2 = Card.sort_by_number(p2) for i in range(4, 0, -1): if p1[i].number > p2[i].number: return 1 elif p1[i].number < p2[i].number: return 2 return 0
def straight(p1, p2) -> int: p1 = Card.sort_by_number(p1) p2 = Card.sort_by_number(p2) if (p1[0] == 2 and p1[4] == 14) and (p2[0] == 2 and p2[4] == 14): return 0 elif p1[0] == 2 and p1[4] == 14: return 2 elif p2[0] == 2 and p2[4] == 14: return 1 else: return high_card(p1, p2)
def straight(cards) -> bool: cards = Card.sort_by_number(cards) # need to check 0 - 4, 1 - 5, 2 - 6, ace to 5 if cards[0].number == 2 and cards[1].number == 3 and cards[2].number == 4 and cards[3].number == 5 and \ cards[4].number == 14: return True for j in range(4): # the 5th is checked by the 4th if cards[j + 1].number - cards[j].number != 1: return False return True
def full_house(p1, p2) -> int: if get_keys_of_value(Card.numbers_count(p1), 3) > get_keys_of_value(Card.numbers_count(p2), 3): return 1 elif get_keys_of_value(Card.numbers_count(p1), 3) < get_keys_of_value(Card.numbers_count(p2), 3): return 2 # else, tie in threes, check pairs if get_keys_of_value(Card.numbers_count(p1), 2) > get_keys_of_value(Card.numbers_count(p2), 2): return 1 elif get_keys_of_value(Card.numbers_count(p1), 2) < get_keys_of_value(Card.numbers_count(p2), 2): return 2 # else, complete tie return 0
def pair(cards) -> bool: return max(Card.numbers_count(cards).values()) == 2
def two_pair(cards) -> bool: n = list(Card.numbers_count(cards).values()) return n == [2, 2, 1] or n == [2, 1, 2] or n == [1, 2, 2]
def three_of_a_kind(cards) -> bool: return max(Card.numbers_count(cards).values()) == 3
def flush(cards) -> bool: return max(Card.shapes_count(cards).values()) == 5
def full_house(cards) -> bool: n = Card.numbers_count(cards) if len(n.keys()) == 2: values = set(n.values()) return len(values.difference({2, 3})) == 0
def convert_list_to_cards(p: List[str]) -> List[Card]: """ :param p: a list of strings :return: a list of cards """ return [Card(p[i][0], p[i][1]) for i in range(5)]