Q. А есть ещё варианты?

Давайте вновь поможем Виталию выяснить, какие вариации вытащить из колоды определённые тройки карт возможны. Напишите программу, которая выводит список вариантов согласно требованиям.

Формат ввода

В первой строке записана масть, которая должна присутствовать в тройке. Во второй строке записан достоинство, которого не должно быть в тройке. В третьей строке записан предыдущий вариант полученный Виталием.

Формат вывода

Выведите следующий вариант расклада.

Примечание

Обратите внимание: валет-дама-король-туз лексикографически упорядочены. Но «10 …» лексикографически младше, чем «2 …», а бубны младше, чем пики.

Масти в именительном и родительном падежах:

ИменительныйРодительный
бубибубен
пикипик
трефытреф
червичервей

Пример

Ввод

пики
10
9 пик, король треф, туз червей

Вывод

9 пик, король червей, туз бубен

Ввод

трефы
король
2 червей, туз пик, туз треф

Вывод

2 червей, туз треф, туз червей

Решение

Развитие предыдущей задачи. Если вы решали ее с помощью combinations(), то задача сводится к поиску нужной комбинации в списке и выводе на печать следующего элемента.
Но довольно часто, в предыдущей задачи используется permutations(), которая генерирует другую последовательность карт, потому что позволяет себе переставлять элементы комбинаций не сохраняя их изначальный порядок. В результате в ответах следующая комбинация не будет совпадать с ожидаемой.

Дополним алгоритм предыдущей задачи:
После того как сгенерировали тройки карт, перебираем их по одной и сравниваем с тем, что имеем на руках. Если тройки совпали, то ставим флажок, чтобы на следубщей итерации напечатать тройку карт и выйти из цикла.

В идеале цикл надо “закольцевать”, на случай если на руках “последняя” тройка карт из списка, но Яндекс не проверяет этот случай в тестах, поэтому предлагаемая реализация этого не предусматривает.

Посмотреть код

Решение

Python
from itertools import chain, combinations, product

suit = input().strip()
rank = input().strip()
hand = input()

suits = {'буби': 'бубен', 'пики': 'пик', 'трефы': 'треф', 'черви': 'червей'}
ranks = ['10', '2', '3', '4', '5', '6', '7', '8', '9', 'валет', 'дама', 'король', 'туз']

ranks.remove(rank)

deck = product(ranks, suits.values())

triplets = combinations(deck, 3)
triplets = [triplet for triplet in triplets if suits[suit] in list(chain.from_iterable(triplet))]
triplets.sort()

print_next = False

for triplet in triplets:
    if print_next:
        print(', '.join(f'{rank} {suit}' for rank, suit in triplet))
        break
    if ', '.join(f'{rank} {suit}' for rank, suit in triplet) == hand:
        print_next = True
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии