Разбор задачи: Лучшая покерная комбинация

Предложенный нами код:

def bestHand(ranks, suits):
    """
    Определяет наилучшую покерную руку из 5 карт.
    :param ranks: Список рангов карт
    :param suits: Список мастей карт
    :return: Строка, представляющая наилучшую руку
    """
    # Если все карты одной масти - Flush
    if len(set(suits)) == 1:
        return "Flush"
    
    # Подсчитываем количество одинаковых рангов
    rank_count = {}
    for rank in ranks:
        rank_count[rank] = rank_count.get(rank, 0) + 1
    
    # Если есть три одинаковых карты - Three of a Kind
    for count in rank_count.values():
        if count >= 3:
            return "Three of a Kind"
    
    # Если есть пара - Pair
    for count in rank_count.values():
        if count == 2:
            return "Pair"
    
    # Если ничего из вышеуказанного не подходит - High Card
    return "High Card"

1. Проверка на "Flush"

if len(set(suits)) == 1:
    return "Flush"
  • Фрагмент кода: Проверяется, если все карты имеют одинаковую масть. Для этого используется функция set(suits), которая удаляет все дубли в списке мастей карт, оставляя только уникальные элементы. Если результат этой операции содержит только один элемент, значит все карты имеют одну и ту же масть.
  • Логика: Если все карты имеют одинаковую масть, то рука называется "Flush", и мы сразу возвращаем строку "Flush".

2. Подсчёт количества одинаковых рангов

rank_count = {}
for rank in ranks:
    rank_count[rank] = rank_count.get(rank, 0) + 1
  • Фрагмент кода: Мы создаём пустой словарь rank_count, где ключом будет являться ранг карты (например, 10, 2, 3), а значением — количество карт с этим рангом. Далее, в цикле перебираем все элементы списка ranks и для каждого значения увеличиваем соответствующий счётчик в словаре.
  • Логика: В результате мы получаем словарь, в котором для каждого ранга будет указано количество карт с таким рангом. Например, если у нас есть 3 карты с рангом 4, словарь будет выглядеть так: {4: 3}.

3. Проверка на "Three of a Kind"

for count in rank_count.values():
    if count >= 3:
        return "Three of a Kind"
  • Фрагмент кода: В цикле по значениям словаря rank_count проверяется, есть ли хотя бы один ранг, который встречается 3 или более раз. Если такой ранг найден, значит у нас есть три карты с одинаковым рангов и мы возвращаем строку "Three of a Kind".
  • Логика: Это условие позволяет определить, если в руке есть три карты одного ранга, что является одним из сильнейших типов рук в покере.

4. Проверка на "Pair"

for count in rank_count.values():
    if count == 2:
        return "Pair"
  • Фрагмент кода: Аналогично предыдущему шагу, мы проверяем наличие пары — то есть, если в словаре есть хотя бы одно значение, равное 2, это значит, что у нас есть пара карт с одинаковым рангом. В таком случае возвращаем строку "Pair".
  • Логика: Пара — это две карты одного ранга, что также является типом покерной руки.

5. Проверка на "High Card"

return "High Card"
  • Фрагмент кода: Если ни одно из предыдущих условий не выполнено, это значит, что наилучшая рука — это "High Card". В данном случае мы возвращаем строку "High Card", что означает, что в руке нет пары, триплетов или флеша, и определяющим фактором будет просто высокая карта.

Итоговая логика алгоритма:

  1. Проверяется, все ли карты одной масти, и если да, то возвращается "Flush".
  2. Затем проверяется, есть ли три карты одного ранга, что соответствует руке "Three of a Kind".
  3. Если нет, проверяется наличие пары ("Pair").
  4. Если ни одно из условий не выполнено, возвращается "High Card".

Пример 1:

ranks = [13, 2, 3, 1, 9]
suits = ["a", "a", "a", "a", "a"]
  • Все карты имеют одинаковую масть, значит, результат будет "Flush".

Пример 2:

ranks = [4, 4, 2, 4, 4]
suits = ["d", "a", "a", "b", "c"]
  • Есть 3 карты с одинаковым рангом (4), значит, результат будет "Three of a Kind".

Пример 3:

ranks = [10, 10, 2, 12, 9]
suits = ["a", "b", "c", "a", "d"]
  • Есть пара (10 и 10), значит, результат будет "Pair".

Пример 4:

ranks = [10, 2, 3, 5, 9]
suits = ["a", "b", "c", "a", "d"]
  • У нас нет пары, триплетов или флеша, значит, результат будет "High Card".

 



Комментарии

xsnm_avatar
xsnm
,
5 месяцев, 11 дней назад

# Подсчитываем количество одинаковых рангов
rank_count = {}
for rank in ranks:
    rank_count[rank] = rank_count.get(rank, 0) + 1
print(rank_count),exit()
# Если есть три  и четыре одинаковых карты - Three of a Kind => four_of_a_kind
for count in rank_count.values():
    if count >= 3:
        return "Three of a Kind"
print(),exit()
 

0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии