Помощь в правке кода 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 шт):
В задачах из серии 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)
Ограничения на производительность довольно щедрые. Количество различных "рук" (комбинаций карт) невелико - 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