AdventOfCode/2023/day7/part2.py

202 lines
5.0 KiB
Python

#!/bin/python3
import re
import sys
from pprint import pprint
from collections import Counter
input_f = sys.argv[1]
d =[]
rank = 0
#prev 250197359
strength = 'AKQT98765432J'
print(strength)
with open(input_f) as file:
for line in file:
d.append(line.split())
pprint(d)
print()
def same_kind(x):
s = Counter(x)
for i in s.values():
if i == 4:
return True
return False
def five_of_kind(x):
if len(Counter(x)) == 1:
return True
return False
def full_house(x):
#print('full_house')
s = Counter(x)
if len(s) != 2:
return False
else:
tmp = list(s.values())
if (tmp[0] == 2 or tmp[0] == 3) and (tmp[1] == 2 or tmp[1] == 3):
return True
else:
return False
def three_of_kind(x):
s = Counter(x)
for i in s.values():
if i == 3:
return True
return False
def pairs(x):
s = Counter(x)
pairs = 0
for i in s.values():
if i == 2:
pairs += 1
return pairs
def c_pairs(x):
pairs = 0
for i in x.values():
if i == 2:
pairs += 1
return pairs
for idx,i in enumerate(d):
d[idx].append(rank)
card = d[idx][0]
tmp = Counter(card)
if card.find('J') != -1:
print(Counter(card))
c = list(Counter(card))
l = list(Counter(card).keys())
if list(tmp.most_common()[0])[0] == 'J' and list(tmp.most_common()[0])[1] == 5:
print(tmp)
continue
v = tmp['J']
del tmp['J']
h = list(tmp.most_common()[0])[0]
for j in range(0,v):
tmp.update(h)
print(tmp)
print()
if len(Counter(tmp)) == 1:
d[idx][2] = 7
continue
if list(Counter(tmp).most_common()[0])[1] == 4:
d[idx][2] = 6
continue
if list(Counter(tmp).most_common()[0])[1] == 3 and list(Counter(tmp).most_common()[1])[1] == 2:
d[idx][2] = 5
continue
if list(Counter(tmp).most_common()[0])[1] == 3:
d[idx][2] = 4
continue
if c_pairs(Counter(tmp)) == 2:
d[idx][2] = 3
continue
if c_pairs(Counter(tmp)) == 1:
d[idx][2] = 2
continue
if c_pairs(Counter(tmp)) == 0:
d[idx][2] = 1
continue
else:
# Five of a kind, where all five cards have the same label: AAAAA
if five_of_kind(d[idx][0]) == True:
d[idx][2] = 7
continue
#Four of a kind, where four cards have the same label and one card has a different label: AA8AA
if same_kind(d[idx][0]) == True:
d[idx][2] = 6
continue
#Full house, where three cards have the same label, and the remaining two cards share a different label: 23332
if full_house(d[idx][0]) == True:
d[idx][2] = 5
continue
#Three of a kind, where three cards have the same label, and the remaining two cards are each different from any other card in the hand: TTT98
if three_of_kind(d[idx][0]) == True:
d[idx][2] = 4
continue
#Two pair, where two cards share one label, two other cards share a second label, and the remaining card has a third label: 23432
if pairs(d[idx][0]) == 2:
d[idx][2] = 3
continue
#One pair, where two cards share one label, and the other three cards have a different label from the pair and each other: A23A4
if pairs(d[idx][0]) == 1:
d[idx][2] = 2
continue
#High card, where all cards' labels are distinct: 23456
if pairs(d[idx][0]) == 0:
d[idx][2] = 1
continue
#d.sort()
#d = sorted(d, key=lambda x: x[2])
def pp(x):
for p in x:
for q in p:
print(q,end='\t')
print()
x_1 = []
x_2 = []
x_3 = []
x_4 = []
x_5 = []
x_6 = []
x_7 = []
for y in d:
if y[2] == 1:
x_1.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 2:
x_2.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 3:
x_3.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 4:
x_4.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 5:
x_5.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 6:
x_6.append(y+[[strength.index(c) for c in y[0]]])
if y[2] == 7:
x_7.append(y+[[strength.index(c) for c in y[0]]])
x_1 = sorted(x_1, key=lambda x: x[3],reverse=True)
x_2 = sorted(x_2, key=lambda x: x[3],reverse=True)
x_3 = sorted(x_3, key=lambda x: x[3],reverse=True)
x_4 = sorted(x_4, key=lambda x: x[3],reverse=True)
x_5 = sorted(x_5, key=lambda x: x[3],reverse=True)
x_6 = sorted(x_6, key=lambda x: x[3],reverse=True)
x_7 = sorted(x_7, key=lambda x: x[3],reverse=True)
e = []
X = [x_1,x_2,x_3,x_4,x_5,x_6,x_7]
for n in X:
for m in n:
e.append(m)
pprint(e)
result = 0
for idx,i in enumerate(e):
x = i[1]
result += (int(x) * (idx+1))
print(result)