Виталий любит играть в карты. Он решил выяснить, какие есть вариации вытащить из колоды определённые тройки карт. Напишите программу, которая выводит список вариантов согласно требованиям.
Формат ввода
В первой строке записана масть, которая должна присутствовать в тройке.
Во второй строке записан достоинство, которого не должно быть в тройке.
Формат вывода
Выведите на экран первые 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 вариантов.
Посмотреть код
Решение
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))
triplets.sort()
sorted_combinations = sorted(triplets)
сортируем по месту
и делаем копию?
по идее без сортировки выдаёт тот же результат, при ranks и suits как в коде из решения
что значит не меняет последовательности элементов? где можно об этом прочитать
print(‘, ‘.join(f'{rank} {suit}’ for rank, suit in combination))
# почему rank, suit обращается к значениям множества внутри множества?? ведь combination это ((‘2’, ‘пик’), (‘2’, ‘треф’), (‘2’, ‘червей’))
Про не меняет последовательность:
permutations и combinations различаются по способу создания комбинаций:
1. permutations(iterable, r):
– permutations генерирует все возможные перестановки элементов из итерируемого объекта iterable длиной r.
– Элементы в каждой перестановке могут встречаться в разных порядках.
– Например, если iterable = [1, 2, 3], и r = 2, то будут сгенерированы следующие перестановки: (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2).
2. combinations(iterable, r):
– combinations генерирует все возможные комбинации элементов из итерируемого объекта iterable длиной r.
– Комбинации содержат элементы в исходном порядке.
– Например, если iterable = [1, 2, 3], и r = 2, то будут сгенерированы следующие комбинации: (1, 2), (1, 3), (2, 3).
Про почему rank, suit обращается к значениям множества внутри множества:
В данной ситуации я распаковываю множество, чтобы вывести его значения в требуемом формате. Это повышает читабельность программы. Достаточно распространенная практика.
Ваш первый вопрос – это пережиток переработки программы. Иногда я возвращаюсь к своему старому коду и вношу правки, чтобы сделать его более читабельным и правильным.
С точки зрения моей философии лишней строкой там является triplets.sort()
Просто потому, что я не люблю портить данные без необходимости. Но в данной конкретной реализации допустимо и то и другое решение по сортировке. Спасибо, что обратили внимание на эту неточность.
ОТЛИЧНО!
погуглил, буду пользоваться распространенной практикой
я писал код для изменения значения вложенного словаря
наверное можно было лучше код написать, пойду проверю
лучшее объяснение permutations и combinations
спасибо большое