Программа курса:
Разбор задачи: Лучшая покерная комбинация
Предложенный нами код:
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", что означает, что в руке нет пары, триплетов или флеша, и определяющим фактором будет просто высокая карта.
Итоговая логика алгоритма:
- Проверяется, все ли карты одной масти, и если да, то возвращается "Flush".
- Затем проверяется, есть ли три карты одного ранга, что соответствует руке "Three of a Kind".
- Если нет, проверяется наличие пары ("Pair").
- Если ни одно из условий не выполнено, возвращается "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
,# Подсчитываем количество одинаковых рангов
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()