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