P. Расклад таков…

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

Формат ввода

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

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

Выведите на экран первые 10 получившихся троек.
Карты в каждой комбинации должны быть отсортированы лексикографически (по строке названия карты). Карты комбинации выводятся через запятую с пробелом после неё.
Комбинации между собой также должны быть отсортированы в лексикографическом порядке по строке, представляющей комбинацию целиком.

Примечание

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

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

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

Пример

Ввод

пики
10

Вывод

2 бубен, 2 пик, 2 треф
2 бубен, 2 пик, 2 червей
2 бубен, 2 пик, 3 бубен
2 бубен, 2 пик, 3 пик
2 бубен, 2 пик, 3 треф
2 бубен, 2 пик, 3 червей
2 бубен, 2 пик, 4 бубен
2 бубен, 2 пик, 4 пик
2 бубен, 2 пик, 4 треф
2 бубен, 2 пик, 4 червей

Ввод

трефы
король

Вывод

10 бубен, 10 пик, 10 треф
10 бубен, 10 пик, 2 треф
10 бубен, 10 пик, 3 треф
10 бубен, 10 пик, 4 треф
10 бубен, 10 пик, 5 треф
10 бубен, 10 пик, 6 треф
10 бубен, 10 пик, 7 треф
10 бубен, 10 пик, 8 треф
10 бубен, 10 пик, 9 треф
10 бубен, 10 пик, валет треф

Решение

Задача на генерацию составных последовательностей с заданными характеристиками.

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

Первым делом считываем входные параметры и из списка достоинств карт изымаем ненужное значение.
Далее с помощью product() генерируем колоду.
Готовим тройки с помощью permutations() и фильтруем их оставляя только те варианты, где есть требуемая масть.
Сортируем тройки и печатаем первые 10 вариантов.

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

Решение

Python
from itertools import chain, permutations, product

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

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

ranks.remove(rank)

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

triplets = permutations(deck, 3)

triplets = [triplet for triplet in triplets if suits[suit] in chain.from_iterable(triplet)]
# triplets.sort()

sorted_combinations = sorted(triplets)
for combination in sorted_combinations[:10]:
    print(', '.join(f'{rank} {suit}' for rank, suit in combination))
Подписаться
Уведомить о
guest
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Niccck
30.11.2023 07:58

triplets.sort()

sorted_combinations = sorted(triplets)

сортируем по месту
и делаем копию?
по идее без сортировки выдаёт тот же результат, при ranks и suits как в коде из решения

что значит не меняет последовательности элементов? где можно об этом прочитать

print(‘, ‘.join(f'{rank} {suit}’ for rank, suit in combination))
# почему rank, suit обращается к значениям множества внутри множества?? ведь combination это ((‘2’, ‘пик’), (‘2’, ‘треф’), (‘2’, ‘червей’))

Niccck
Ответить на  Сергей Клочко
30.11.2023 15:57

распаковываю множество

ОТЛИЧНО!
погуглил, буду пользоваться распространенной практикой
я писал код для изменения значения вложенного словаря

наверное можно было лучше код написать, пойду проверю

nmalkam
Ответить на  Сергей Клочко
05.12.2023 05:02

лучшее объяснение permutations и combinations
спасибо большое