Top.Mail.Ru
Ответы

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! Я изо всех сил старался, искал в интернете, пытался сам додумать, но НЕ ВЫ-ШЛО!!!! Я уже на грани... Прошу помощи всех знающих умов этого сайта!

Вот код, чтобы убедились:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
 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))) 
По дате
По рейтингу
Аватар пользователя
Новичок
1мес

Вот исправленный код:

1234567891011121314151617181920212223242526272829303132333435363738
 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)) 
Аватар пользователя
Просветленный
1мес

Пиши тг, за 100 р решу