Python. Карточные расклады.
Вот суть задачи.
Вы будете работать с колодой карт, подобной той, что сгенерирована в задаче "Колода карт", но имеющей все четыре масти. Из колоды вы должны вытянуть три карты всеми возможными способами, при которых в тройке хотя бы одна из карт червовая и хотя бы одна - старше 10 (т.е. валет, дама, король или туз). Червовая карта и карта старше 10 могут быть различными картами.
Выведите на экран все получившиеся тройки. Карты в каждой комбинации должны быть отсортированы лексикографически (по строке названия карты). Карты комбинации выводится через запятую с пробелом после неё.
Комбинации между собой также должны быть отсортированы в лексикографическом порядке по строке, представляющей комбинацию целиком.
Ваша программа ничего не должна принимать на вход и всегда должна выдавать один и тот же выход.
Обратите внимание: валет-дама-король-туз лексикографически упорядочены. Но “10 ...” лексикографически младше, чем “2 ...”, а бубны младше, чем пики.
Вывод:
10 бубен, 10 пик, валет червей
10 бубен, 10 пик, дама червей
10 бубен, 10 пик, король червей
10 бубен, 10 пик, туз червей
10 бубен, 10 треф, валет червей
...
2 червей, 3 червей, король червей
2 червей, 3 червей, туз бубен
2 червей, 3 червей, туз пик
2 червей, 3 червей, туз треф
2 червей, 3 червей, туз червей
2 червей, 4 бубен, валет бубен
...
король червей, туз треф, туз червей
туз бубен, туз пик, туз червей
туз бубен, туз треф, туз червей
туз пик, туз треф, туз червей
Описание задачи закончил.
Проблема вот в чём. Нужные комбинации получились, но правильно упорядочить их НЕ ВЫХОДИТ! Отличительной чертой вывода является то, что в конце со слова туз начинаются 2 строки, а не 3! Я изо всех сил старался, искал в интернете, пытался сам додумать, но НЕ ВЫ-ШЛО!!!! Я уже на грани... Прошу помощи всех знающих умов этого сайта!
Вот код, чтобы убедились:
import itertools
cards = []
def replacement(x):
return x.replace('ва', '11').replace('да', '12').replace('ко', '13').replace('ту', '14')
def check(i):
if i[0] == 1:
return 'валет'
elif i[0] == 2:
return 'дама'
elif i[0] == 3:
return 'король'
elif i[0] == 4:
return 'туз'
for i in list(itertools.product(range(2, 11), range(1, 5))):
if i[1] == 1:
cards.append(f"{i[0]} бубен")
elif i[1] == 2:
cards.append(f"{i[0]} пик")
elif i[1] == 3:
cards.append(f"{i[0]} треф")
elif i[1] == 4:
cards.append(f"{i[0]} червей")
for i in list(itertools.product(range(1, 5), range(1, 5))):
if i[1] == 1:
cards.append(f"{check(i)} бубен")
elif i[1] == 2:
cards.append(f"{check(i)} пик")
elif i[1] == 3:
cards.append(f"{check(i)} треф")
elif i[1] == 4:
cards.append(f"{check(i)} червей")
permutation = [
i for i in itertools.permutations(cards, 3)
if any(map(lambda x: x >= 10, [int(replacement(v[:2]))
for v in i])) and any(map(lambda x: 'червей' in x, i))
]
for i in sorted(permutation, key=lambda x: x[0]):
print(', '.join(sorted(i)))
Вот исправленный код:
import itertools
# Создаем колоду карт с правильным порядком
suits_order = {'бубен': 1, 'пик': 2, 'треф': 3, 'червей': 4}
values_order = {
'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10,
'валет': 11, 'дама': 12, 'король': 13, 'туз': 14
}
# Генерация карт
cards = []
for value in ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'валет', 'дама', 'король', 'туз']:
for suit in ['бубен', 'пик', 'треф', 'червей']:
cards.append(f"{value} {suit}")
# Функция для сортировки карт
def card_key(card):
value, suit = card.rsplit(' ', 1)
return (values_order[value], suits_order[suit])
# Генерация и фильтрация перестановок
valid_combinations = []
for combo in itertools.permutations(cards, 3):
# Проверка условий: хотя бы одна червовая и хотя бы одна старше 10
has_hearts = any('червей' in card for card in combo)
has_high = any(values_order[card.split()[0]] >= 11 for card in combo)
if has_hearts and has_high:
# Сортируем карты в комбинации
sorted_combo = sorted(combo, key=card_key)
valid_combinations.append(sorted_combo)
# Сортируем все комбинации
valid_combinations.sort()
# Выводим результаты
for combo in valid_combinations:
print(', '.join(combo))
Пиши тг, за 100 р решу