day 7, saved by Counter
This commit is contained in:
56
d07/part1.py
Normal file
56
d07/part1.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import sys
|
||||||
|
from collections import Counter as C
|
||||||
|
from functools import cmp_to_key as ctk
|
||||||
|
|
||||||
|
def score(h:str) -> int: # get type of a hand
|
||||||
|
D = C(h)
|
||||||
|
E = C(v for k,v in D.items())
|
||||||
|
if 5 in E: # five of a kind
|
||||||
|
return 7
|
||||||
|
elif 4 in E: # four of a kind
|
||||||
|
return 6
|
||||||
|
elif 3 in E and 2 in E: # full house
|
||||||
|
return 5
|
||||||
|
elif 3 in E: # three of a kind
|
||||||
|
return 4
|
||||||
|
elif 2 in E and E[2] == 2: # two pairs
|
||||||
|
return 3
|
||||||
|
elif 2 in E:
|
||||||
|
return 2
|
||||||
|
else: # high card
|
||||||
|
return 1
|
||||||
|
|
||||||
|
H = list(reversed('AKQJT98765432'))
|
||||||
|
|
||||||
|
def compareH(h1, h2):
|
||||||
|
for a,b in zip(h1,h2):
|
||||||
|
if H.index(a) < H.index(b):
|
||||||
|
return 1
|
||||||
|
elif H.index(a) > H.index(b):
|
||||||
|
return -1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def compare(T1, T2): # return >:-1, ==:0, <:1
|
||||||
|
h1, s1, *_ = T1
|
||||||
|
h2, s2, *_ = T2
|
||||||
|
s1 = score(h1)
|
||||||
|
s2 = score(h2)
|
||||||
|
if s1 < s2:
|
||||||
|
return 1
|
||||||
|
elif s2 < s1:
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
return compareH(h1,h2)
|
||||||
|
|
||||||
|
L = [ l.split() for l in sys.stdin.read().splitlines()]
|
||||||
|
L = [[h,int(b)] for [h,b] in L]
|
||||||
|
|
||||||
|
for h,b in L:
|
||||||
|
print(h, score(h))
|
||||||
|
pass
|
||||||
|
|
||||||
|
L.sort(key=ctk(compare))
|
||||||
|
|
||||||
|
print(
|
||||||
|
sum((i+1)*b for i,(h,b) in enumerate(reversed(L)))
|
||||||
|
)
|
42
d07/part2.py
Normal file
42
d07/part2.py
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import sys
|
||||||
|
from collections import Counter as C
|
||||||
|
from functools import cmp_to_key as ctk
|
||||||
|
|
||||||
|
H = list(reversed('AKQT98765432J'))
|
||||||
|
|
||||||
|
def score(h:str) -> int:
|
||||||
|
D = C(h)
|
||||||
|
j = D['J']
|
||||||
|
del D['J']
|
||||||
|
if j<5:
|
||||||
|
m = max(D.values())
|
||||||
|
for k,v in D.items():
|
||||||
|
if v == m:
|
||||||
|
D[k] = v+j
|
||||||
|
break
|
||||||
|
E = C(v for k,v in D.items()) if j<5 else {5:1}
|
||||||
|
r = 0
|
||||||
|
if 5 in E: # five of a kind
|
||||||
|
r = 7
|
||||||
|
elif 4 in E: # four of a kind
|
||||||
|
r = 6
|
||||||
|
elif 3 in E and 2 in E: # full house
|
||||||
|
r = 5
|
||||||
|
elif 3 in E: # three of a kind
|
||||||
|
r = 4
|
||||||
|
elif 2 in E and E[2] == 2: # two pairs
|
||||||
|
r = 3
|
||||||
|
elif 2 in E: # one pair
|
||||||
|
r = 2
|
||||||
|
else: # high card
|
||||||
|
r = 1
|
||||||
|
return (r, *[H.index(c) for c in h])
|
||||||
|
|
||||||
|
L = [ l.split() for l in sys.stdin.read().splitlines()]
|
||||||
|
L = [(score(h),int(b)) for [h,b] in L]
|
||||||
|
|
||||||
|
sorted(L)
|
||||||
|
|
||||||
|
print(
|
||||||
|
sum((i+1)*b for i,(h,b) in enumerate(reversed(L)))
|
||||||
|
)
|
18
d07/terse.py
Normal file
18
d07/terse.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
from collections import Counter
|
||||||
|
lines = [i for i in open('input').read().split('\n') if i.strip()]
|
||||||
|
def hand(h,part1):
|
||||||
|
if part1: h = h.replace('J', 'X')
|
||||||
|
h2 = ['J23456789TXQKA'.index(i)for i in h]
|
||||||
|
ts = []
|
||||||
|
for r in '23456789TQKA':
|
||||||
|
c = Counter(h.replace('J', r))
|
||||||
|
p = tuple(sorted(c.values()))
|
||||||
|
t = [(1,1,1,1,1),(1,1,1,2),(1,2,2),(1,1,3),(2,3),(1,4),(5,)].index(p)
|
||||||
|
ts.append(t)
|
||||||
|
return (max(ts), *h2)
|
||||||
|
for part1 in (True, False):
|
||||||
|
h = sorted((hand(h,part1), int(b)) for h, b in (l.split() for l in lines))
|
||||||
|
t = 0
|
||||||
|
for i,(_,b) in enumerate(h):
|
||||||
|
t+=i*b+b
|
||||||
|
print('Part', 2-part1, ':', t)
|
Reference in New Issue
Block a user