Skip to content

Instantly share code, notes, and snippets.

@rak1507
Last active December 11, 2021 18:56
Show Gist options
  • Save rak1507/80274509931a28e3f4da25237a9c4564 to your computer and use it in GitHub Desktop.
Save rak1507/80274509931a28e3f4da25237a9c4564 to your computer and use it in GitHub Desktop.
#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