Помощь в правке кода Python

Делаю задачки и засел на одной

Макс и простой покер

ограничение по времени на тест2 секунды

ограничение по памяти на тест64 мегабайта

ввод стандартный ввод

вывод стандартный вывод

Макс изучает новую карточную игру, напоминающую покер с упрощёнными правилами.

Для игры используются карты, на которых написаны числа от 1 до 7 (карт каждого вида неограниченно много). Цель игроков — собрать как можно более сильную комбинацию из трёх карт. Существуют следующие виды комбинаций:

Тройка: три карты одинакового номинала; Двойка: две карты одинакового номинала и одна карта другого номинала; Беспорядок: три карты разных номиналов. Комбинации сравниваются друг с другом по силе по следующим правилам:

Любая тройка побеждает любую двойку и любой беспорядок. Например, ( 6 , 6 , 6 ) сильнее, чем ( 3 , 7 , 7 ) ; Любая двойка побеждает любой беспорядок. Например, ( 4 , 7 , 7 ) сильнее, чем ( 1 , 5 , 6 ) ; Из двух троек побеждает та, в которой карты имеют больший номинал. Например, ( 4 , 4 , 4 ) сильнее, чем ( 2 , 2 , 2 ) ; Из двух двоек, если номиналы одинаковых карт в них не совпадают, побеждает та, в которой одинаковые карты имеют больший номинал. Например, ( 3 , 3 , 6 ) сильнее, чем ( 1 , 2 , 2 ) ; Из двух двоек, если номиналы одинаковых карт в них совпадают, побеждает та, в которой отличающаяся карта имеет больший номинал. Например, ( 4 , 4 , 7 ) сильнее, чем ( 3 , 4 , 4 ) ; Из двух беспорядков побеждает тот, в котором старшая карта имеет больший номинал. Если номиналы старших карт совпадают, то аналогичным образом сравниваются средние карты. Если номиналы средних карт совпадают, то аналогичным образом сравниваются младшие карты. Например, ( 1 , 5 , 7 ) сильнее, чем ( 3 , 4 , 7 ) . Макс хочет проверить своё понимание правил игры. Он выбрал три карты и теперь пытается определить минимальную по силе комбинацию, которая оказалась бы сильнее, чем три выбранные карты. Помогите ему сделать это.

Входные данные

Ввод содержит целые числа A , B и C ( 1 ≤ A ≤ B ≤ C ≤ 7 ) — номиналы карт в комбинации.

Выходные данные

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

Если подходящей комбинации не существует, выведите одно число -1.

Примеры

входные данные

2 5 7

выходные данные

3 5 7

входные данные

5 6 6

выходные данные

6 6 7

a = input().split()
a[0]=int(a[0])
a[1]=int(a[1])
a[2]=int(a[2])
if a[0]==a[1] and a[1]==a[2]:
    zn=3
elif a[0]==a[1] or a[0]==a[2] or a[1]==a[2]:
    zn=2
else:
    zn=1
if zn == 3 and a[0]!=7:
    a[0]=int(a[0])+1
    a[1]=int(a[1])+1
    a[2]=int(a[2])+1
    print(*a)
elif zn == 2:
    if  min(a) == max(a)-1:
            aa = int(a[0]) + int(int(a[0]) == int(min(a)))*2
            aaa = int(a[1]) + int(int(a[1]) == int(min(a)))*2
            aaaa = int(a[2]) + int(int(a[2]) == int(min(a)))*2
            a[0]=aa
            a[1]=aaa
            a[2]=aaaa
            print(*sorted(a))
    else:
            a[0] = int(a[0]) + int(int(a[0]) == int(min(a)))
            a[1] = int(a[1]) + int(int(a[1]) == int(min(a)))
            a[2] = int(a[2]) + int(int(a[2]) == int(min(a)))
            print(*sorted(a))
elif zn == 1:
    if a[0]+1 == a[1] and a[1]+1==a[2]:
        a[0] = int(a[0]) + int(int(a[0]) == int(min(a)))
        a[1] = int(a[1]) + int(int(a[1]) == int(min(a)))
        a[2] = int(a[2]) + int(int(a[2]) == int(min(a)))
        print(*sorted(a))
    elif abs(a[0]-a[1]) == 1 and abs(a[2]-a[1]) != 1 and abs(a[2]-a[0]) != 1 or  abs(a[0]-a[2]) == 1 and abs(a[2]-a[1]) != 1 and abs(a[1]-a[0]) != 1 or  abs(a[2]-a[1]) == 1 and abs(a[2]-a[0]) != 1 and abs(a[1]-a[0]) != 1:
        a[a.index(sum(a)-max(a)-min(a))] += 1
        print(*sorted(a))
    else:
        a[0] = int(a[0]) + int(int(a[0]) == int(min(a)))
        a[1] = int(a[1]) + int(int(a[1]) == int(min(a)))
        a[2] = int(a[2]) + int(int(a[2]) == int(min(a)))
    print(*sorted(a))
else:
    print(-1)

Ответы (2 шт):

Автор решения: OPTIMUS PRIME

В задачах из серии if-else hell важно продумать все граничные случаи. Сначала набросать структуру условий, а потом только взяться за реализацию каждого случая.

if min(a) == max(a) - 1:
    # 1 2 2,   2 3 3,   3 4 4,   ...,   6 7 7
    aa = int(a[0]) + int(int(a[0]) == int(min(a)))*2
    aaa = int(a[1]) + int(int(a[1]) == int(min(a)))*2
    aaaa = int(a[2]) + int(int(a[2]) == int(min(a)))*2

Для 1 2 2: aa = int(1) + int(1 == 1)*2 → 3 // 3 2 2 (правильно)
Для 6 7 7: aa = int(6) + int(6 == 6)*2 → 8 // 8 7 7 (должно быть 1 1 1)


В else этой же части:

else:
    a[0] = int(a[0]) + int(int(a[0]) == int(min(a)))
    a[1] = int(a[1]) + int(int(a[1]) == int(min(a)))
    a[2] = int(a[2]) + int(int(a[2]) == int(min(a)))
    print(*sorted(a))

Не учтены варианты 7 6 6, 7 5 5..., 7 1 1, где семерке некуда расти.

Для 7 6 6 получается:
    a[0] = int(7) + int(7 == 6) = 7
    a[1] = int(6) + int(6 == 6) = 7
    a[0] = int(6) + int(6 == 6) = 7
Должно быть: 1 7 7

elif zn == 1: (все карты разные) этот кусок на всякий случай легче переписать, чем искать в нем ошибку)

a.sort() # В любой непонятной ситуации - сортируй!

if a[2] == 7:
    if a[0] == 5 and a[1] == 6:
        # 5 6 7 — Некуда расти, берем двойную.
        print(2, 1, 1)
    elif a[1] <= 5:
        a[1] += 1
        print(*a)
else:
    # среди чисел точно нет «7»
    # a = [int[1-4], int[2-5], int[3-6]]

    if a[1] < a[2] - 1:
        # 1 4 6
        a[1] += 1
        # 1 5 6
    elif a[0] < a[1] - 1:
        # 1 5 6
        a[0] += 1
        # 2 5 6
    else:
        # 4 5 6
        a[0], a[1], a[2] = [x + 1 for x in a]
        # 5 6 7

    print(*a)
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ограничения на производительность довольно щедрые. Количество различных "рук" (комбинаций карт) невелико - 84. Можно перебрать все руки и найти следующую по силе.

Перебор рук:

def all_hands():
    return itertools.combinations_with_replacement(range(1, 8), 3)

Оценка силы руки. Функция power для руки возвращает структуру со следующим свойством: если рука h1 сильнее руки h2, то power(h1) > power(h2):

def power(h):
    h = tuple(sorted(h, reverse=True))
    count = len(set(h))
    if count == 2:
        if h[1] == h[2]:
            h = h[1], h[2], h[0]
    return 3 - count, h

Основная программа считывает руку, вычисляет её силу. Затем перебирает все возможные руки, и ищет следующую по силе после считаной:

h = tuple(map(int, input().split()))
p = power(h)

min_h2 = 7, 7, 7
min_p2 = power(min_h2)
for h2 in all_hands():
    p2 = power(h2)
    if p < p2 < min_p2:
        min_h2 = h2
        min_p2 = p2
if min_p2 == p:
    print('-1')
else:
    print(*min_h2)
$ echo 1 2 3 | py pocker.py
1 2 4

$ echo 5 6 7 | py pocker.py
1 1 2

$ echo 1 1 2 | py pocker.py
1 1 3

$ echo 1 2 2 | py pocker.py
2 2 3

$ echo 6 7 7 | py pocker.py
1 1 1

$ echo 1 1 1 | py pocker.py
2 2 2

$ echo 7 7 7 | py pocker.py
-1
→ Ссылка