Last active
December 11, 2021 18:56
-
-
Save rak1507/80274509931a28e3f4da25237a9c4564 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#day 1 | |
*a,=map(int,open(0)) | |
print(sum(i<j for i,j in zip(a,a[1:]))) | |
print(sum(i<j for i,j in zip(a,a[3:]))) | |
#day 2 | |
from itertools import accumulate | |
print(sum(d:=[1j**'fd'.find(i[0])*int(i.split()[1]) for i in open(0)]).real*sum(d).imag) | |
print(sum(i.real*j.imag for i,j in zip(d, accumulate(d)))*sum(d).real) | |
#day 3 | |
from operator import lt, ge | |
x=[[j=='1' for j in i.strip()] for i in open(0)] | |
dec=lambda x:int(''.join('01'[i] for i in x), 2) | |
bits=[2*sum(i)<len(i) for i in zip(*x)] | |
print(dec(bits) * dec(1-i for i in bits)) | |
find=lambda op,i=0,x=x:x if len(x)==1 else find(op, i+1, [row for row in x if row[i] == op(2 * sum([*zip(*x)][i]), len(x))]) | |
print(dec(*find(lt)) * dec(*find(ge))) | |
#day 4 | |
n,*b=open(0).read().split('\n\n') | |
n=list(map(int, n.split(','))) | |
b=[[list(map(int, x.split())) for x in i.strip().split('\n')] for i in b] | |
s=[[[n.index(k) for k in j] for j in i] for i in b] | |
m=[min([*map(max, i), *map(max, zip(*i))]) for i in s] | |
for f in [min, max]: | |
idx = m.index(f(m)) | |
print(sum((m[idx] < j) * k for i in zip(s[idx], b[idx]) for j, k in zip(*i)) * n[m[idx]]) | |
#day 5 | |
from itertools import zip_longest, chain | |
from collections import Counter | |
data = [list(map(int, i.replace('->',',').split(','))) for i in open(0)] | |
fill = lambda a,b,c,d: [(a+i*[1,-1][a>c],b+j*[1,-1][b>d]) for i, j in zip_longest(range(abs(a-c)+1), range(abs(b-d)+1), fillvalue=0)] | |
count = lambda x: sum(i > 1 for i in Counter(chain.from_iterable(fill(*i) for i in x)).values()) | |
print(count([a,b,c,d] for a,b,c,d in data if a==c or b==d)) | |
print(count(data)) | |
#day 6 | |
x=eval(input()) | |
x=[x.count(i) for i in range(9)] | |
f=lambda a,b,c,d,e,f,g,h,i:[b,c,d,e,f,g,a+h,i,a] | |
for _ in range(80): x = f(*x) | |
print(sum(x)) | |
for _ in range(256-80): x = f(*x) | |
print(sum(x)) | |
#day 7 | |
x=eval(input()) | |
print(min(sum(abs(i-n) for i in x) for n in range(max(x)))) | |
print(min(sum(abs(i-n)*(1+abs(i-n))//2 for i in x) for n in range(max(x)))) | |
#day 8 | |
from collections import Counter | |
data = [[j.strip().split(' ') for j in i.split('|')] for i in open(0)] | |
print(sum(len(j) in {2,3,4,7} for _, i in data for j in i)) | |
count = lambda a,b: [sum(map(Counter(''.join(a)).get, i)) for i in b] | |
ids = count(s := ["abcefg","cf","acdeg","acdfg","bcdf","abdfg","abdefg","acf","abcdefg","abcdfg"], s) | |
print(sum(sum(10**(3-i)*v for i,v in enumerate(map(ids.index, count(*i)))) for i in data)) | |
# thanks to https://github.com/shadowninja55 for the cool method :) | |
#day 9 | |
from collections import Counter | |
grid=[list(map(int, i.strip())) for i in open(0)] | |
shifts=lambda a,x:[x, [[a]*len(x[0]), *x[:-1]], [*x[1:], [a]*len(x[0])], [[a,*i[:-1]] for i in x], [[*i[1:],a] for i in x]] | |
print(sum(min(x[1:])>x[0] and x[0]+1 for i in zip(*shifts(100, grid)) for x in zip(*i))) | |
n=0; basins = [[(n := n + 1) if j != 9 else 0 for j in i] for i in grid] | |
while basins != (basins := [[x[0] and max(x) for x in zip(*i)] for i in zip(*shifts(0, basins))]): pass | |
*_,a,b,c=sorted(Counter(j for i in basins for j in i if j != 0).values()) | |
print(a*b*c) | |
#day 10 | |
rplc=lambda x,a:rplc(x.replace(a[0],''),a[1:]) if a else x | |
f=lambda x: x if x == (n := rplc(x.strip(), ['()','<>','{}','[]'])) else f(n) | |
data=list(map(f,open(0))) | |
print(sum([3,57,1197,25137][')]}>'.index(x[0])] for i in data if (x := rplc(i,'([{<')))) | |
r=sorted([int(''.join(str('([{<'.index(x)+1) for x in i[::-1]),5) for i in data if not rplc(i,'([{<')]) | |
print(r[len(r)//2]) | |
#day 11 | |
data=[list(map(int,i.strip())) for i in open(0)] | |
padded=lambda x:[z:=[0]*(2+len(x[0])),*[[0,*i,0] for i in x],z] | |
grids=lambda x:[[[x[i+X][j+Y] for Y in [-1,0,1] for X in [-1,0,1]] for j in range(1, len(x[0])-1)] for i in range(1, len(x)-1)] | |
def step(n, f, o): | |
o=[[i+1 for i in x] for x in o] | |
b=[[1 for _ in o[0]] for _ in o] | |
while (b, o) != (i := flash(b, o)): b,o=i | |
return n+1, [*f,b], [[a*b for a, b in zip(*i)] for i in zip(b, o)] | |
def flash(b, o): | |
f = [[a and 9<b for a, b in zip(*i)] for i in zip(b, o)] | |
return [[a and not b for a, b in zip(*i)] for i in zip(b, f)], [[sum(a) + b for a, b in zip(*i)] for i in zip(grids(padded(f)), o)] | |
until = lambda f,cond,*x: x if cond(*x) else until(f, cond, *f(*x)) | |
print(sum(1-c for a in until(step, lambda n,f,o:n==100, 0, [], data)[1] for b in a for c in b)) | |
print(until(step,lambda n,f,o:f and sum(j for i in f[-1] for j in i) == 0, 0, [], data)[0]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment