Working on 2023-12-07 part2. Missing tiebreaker

This commit is contained in:
FrederikBaerentsen 2023-12-07 21:41:09 +01:00
parent 22fe83f156
commit 27f66da8f8
3 changed files with 233 additions and 11 deletions

View File

@ -1,11 +1,23 @@
32T3K 765 J2566 131
T55J5 684 K7KK7 272
AA8AA 21 AA222 222
KK677 28 222AA 123
AAAAA 123 44T55 467
KTJJT 220 4K339 546
23332 1 42TT2 174
A23A4 64 TQTTT 710
QQQJA 483 84766 682
23456 64 K22KK 607
HNJIP 317 77595 922
26778 768
JJ667 198
JJ2JJ 123
44Q9A 821
T6682 851
3A232 890
5Q5J4 691
79789 305
KK666 138
TT9TT 742
Q4276 489
6T48J 921

9
2023/day7/exp2 Normal file
View File

@ -0,0 +1,9 @@
2J345 213
22345 425
2JJ34 654
22234 234
2JJJ3 623
22223 658
J2JJJ 987
2JJJJ 456
22222 604

201
2023/day7/part2.py Normal file
View File

@ -0,0 +1,201 @@
#!/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)