Не могу решить задачу 54 Ейлера
Решил как-то решить одну задачу из проекта Ейлера, а именно 54(https://euler.jakumo.org/problems/view/54.html)
Несколько дней с ней мучаюсь, но никак не выходит правильное значение.
from collections import Counter
player_1 = 0
player_2 = 0
rating = {'A': 14, 'K': 13, 'Q': 12, 'J': 11, 'T': 10, '9': 9,
'8': 8, '7': 7, '6': 6, '5': 5, '4': 4, '3': 3, '2': 2, '1': 1}
def values(x):
cards = [sorted([rating[i] for i in x[0]]), x[1]]
if max(Counter(cards[0]).values()) == 2: #Одна пара
return 2
elif Counter(cards[0]).values() == [2, 2, 1]: #Две пары
return 3
elif max(Counter(cards[0]).values()) == 3:#Тройка
return 4
elif cards[0][-1] - cards[0][0] == 4: #Стрейт
return 5
elif cards[1] is True: #Флаш
return 6
elif sorted(Counter(cards[0]).values()) == [2, 3]: #Фул-хаус
return 7
elif max(Counter(cards[0]).values()) == 4: #Каре
return 8
elif cards[0][-1] - cards[0][0] == 4 and cards[1] is True: #Стрейт-флаш
return 9
elif cards == [[10, 11, 12, 13, 14], True]: #Роял-флаш
return 10
else:
return 0
def check(x, y): #сравнение достоинств карт каре, фул-хаус, тройка, две пары и одна пара
a1 = [rating[i] for i in x[0]]
keys = sorted([i for i in Counter(a1).values()])[::-1]
for i in keys:
if rating[get_key(Counter(x[0]), i)] > rating[get_key(Counter(y[0]), i)]:
return True
elif rating[get_key(Counter(x[0]), i)] < rating[get_key(Counter(y[0]), i)]:
return False
else:
return check_cards_0(x, y)
def check_cards_0(x, y): #сравнение достоинств карт самых младших комбинаций
a1 = sorted([rating[i] for i in x[0]])[::-1]
a2 = sorted([rating[i] for i in y[0]])[::-1]
for i in range(4):
if a1[i] == a2[i]:
pass
else:
if a1[i] > a2[i]:
return True
else:
return False
def get_key(d, value):
for k, v in d.items():
if v == value:
return k
with open('poker.txt', 'r') as file:
for a in file.readlines():
p1 = [[x for x, y in a.split()[0:5]], all(x == [y for x, y in a.split()[0:5]][0] for x in [y for x, y in a.split()[0:5]])]
p2 = [[x for x, y in a.split()[5::]], all(x == [y for x, y in a.split()[5::]][0] for x in [y for x, y in a.split()[5::]])]
print(p1, values(p1), p2, values(p2)) # [[список достоинств карт], True(если все карты одной масти) или False(если не одной масти)]
if values(p1) > values(p2):
print(values(p1), values(p2))
player_1 += 1
elif values(p1) < values(p2):
print(values(p1), values(p2))
player_2 += 1
else:
print(values(p1), values(p2))
if values(p1) in [8, 7, 4, 3, 2]:
if check(p1, p2) is True:
player_1 += 1
else:
player_2 += 1
else:
if check_cards_0(p1, p2) is True:
player_1 += 1
else:
player_2 += 1
print(player_1, player_2)
У меня выходит 382 618, а должно 376 624