Advent Of Code 2022 Solution
\(\texttt{Intro}\)
这是一个从每年 12 月 1 日开始的为期 25 天的编程挑战,每天中午 1 pm 会公布一道题。
每道题会有两个部分,你需要用编程解决每一个部分。
本文会使用 C++
,Python
进行编程。
网址:https://adventofcode.com/2022
\(\texttt{Day 1}\)
\(\texttt{Part 1}\)
a=list(map(lambda it:sum(map(int,it.split('\n'))),''.join(open(0).readlines()).split('\n\n')))
print(max(a))
\(\texttt{Part 2}\)
a=list(map(lambda it:sum(map(int,it.split('\n'))),''.join(open(0).readlines()).split('\n\n')))
a.sort()
print(sum(a[-3:]))
\(\texttt{Day 2}\)
\(\texttt{Part 1}\)
win,draw=["AY","BZ","CX"],["AX","BY","CZ"]
a=list(map(lambda it:it[0]+it[2],open(0).readlines()))
tar=sum(win.count(i)*6+draw.count(i)*3 for i in a)
tar+=sum("XYZ".index(i[1])+1 for i in a)
print(tar)
\(\texttt{Part 2}\)
a=list(map(lambda it:it[0]+it[2],open(0).readlines()))
tar=sum(("ABC".index(i[0])+(i[1]=="Z")-(i[1]=="X")+3)%3+1 for i in a)
tar+=sum((i[1]=="Z")*6+(i[1]=="Y")*3 for i in a)
print(tar)
\(\texttt{Day 3}\)
\(\texttt{Part 1}\)
def val(x): return (ord(x)-96 if ord(x)>96 else ord(x)-38)
a=list(map(lambda it:it.strip(),open(0).readlines()))
print(sum(val(str(set(it[:len(it)//2])&set(it[len(it)//2:]))[2]) for it in a))
\(\texttt{Part 2}\)
def val(x): return (ord(x)-96 if ord(x)>96 else ord(x)-38)
a=list(map(lambda it:it.strip(),open(0).readlines()))
print(sum(val(str(set(a[it])&set(a[it+1])&set(a[it+2]))[2]) for it in range(0,len(a),3)))
\(\texttt{Day 4}\)
\(\texttt{Part 1}\)
tar,a=0,list(map(lambda it:list(map(lambda it:list(map(int,it.split('-'))),it.strip().split(','))),open(0).readlines()))
tar+=sum(i[0][0]<=i[1][0] and i[0][1]>=i[1][1] for i in a)
tar+=sum(i[0][0]>=i[1][0] and i[0][1]<=i[1][1] for i in a)
tar-=sum(i[0][0]==i[1][0] and i[0][1]==i[1][1] for i in a)
print(tar)
\(\texttt{Part 2}\)
tar,a=0,list(map(lambda it:list(map(lambda it:list(map(int,it.split('-'))),it.strip().split(','))),open(0).readlines()))
a=map(lambda it:(max(it[0][0],it[1][0]),min(it[0][1],it[1][1])),a)
print(sum(it[0]<=it[1] for it in a))
\(\texttt{Day 5}\)
\(\texttt{Part 1}\)
import re
a,b=''.join(open(0).readlines()).split('\n\n')
a,b=a.split('\n'),list(map(lambda it:list(map(int,re.findall(r'\d+',it))),b.split('\n')))
n=len(re.findall(r'\d',a[-1]))
a,c=a[:-1][::-1],[]
for i in ' '*n: c.append([])
for l in a:
for i in range(n):
if l[4*i+1]!=' ':
c[i].append(l[4*i+1])
for cnt,f,t in b:
for _ in ' '*cnt:
c[t-1].append(c[f-1][-1])
c[f-1]=c[f-1][:-1]
print(''.join(map(lambda it:it[-1],c)))
\(\texttt{Part 2}\)
import re
a,b=''.join(open(0).readlines()).split('\n\n')
a,b=a.split('\n'),list(map(lambda it:list(map(int,re.findall(r'\d+',it))),b.split('\n')))
n=len(re.findall(r'\d',a[-1]))
a,c=a[:-1][::-1],[]
for i in ' '*n: c.append([])
for l in a:
for i in range(n):
if l[4*i+1]!=' ':
c[i].append(l[4*i+1])
for cnt,f,t in b:
c[t-1]+=c[f-1][len(c[f-1])-cnt:]
c[f-1]=c[f-1][:len(c[f-1])-cnt]
print(''.join(map(lambda it:it[-1],c)))
\(\texttt{Day 6}\)
\(\texttt{Part 1}\)
a=input()
flag=True
for i in range(3,len(a)):
fl=True
for l in range(i-3,i+1):
for r in range(l+1,i+1):
if a[l]==a[r]: fl=False
if fl and flag:
print(i+1)
flag=False
\(\texttt{Part 2}\)
a=input()
flag=True
for i in range(13,len(a)):
fl=True
for l in range(i-13,i+1):
for r in range(l+1,i+1):
if a[l]==a[r]: fl=False
if fl and flag:
print(i+1)
flag=False
\(\texttt{Day 7}\)
\(\texttt{Part 1}\)
a=list(map(lambda it:it.strip().split(),open(0).readlines()))
dir,road,lines,tar=[],{},[],0
for it in a:
if it[0]=='$':
if it[1]=='cd':
if it[2]=='..': dir=dir[:-1]
elif it[2]=='/': dir=['/']
else:
if (str(dir),str(dir+[it[2]])) not in lines:
lines.append((str(dir),str(dir+[it[2]])))
dir.append(it[2])
elif it[1]=='ls':
pass
else:
if it[0]=='dir':
if (str(dir),str(dir+[it[1]])) not in lines:
lines.append((str(dir),str(dir+[it[1]])))
else:
lines.append((str(dir),it[0]))
def dfs(root):
global tar
siz=0
for f,t in lines:
if f!=root: continue
if t[0]!='[': siz+=int(t)
else: siz+=dfs(t)
if siz<=100000: tar+=siz
return siz
dfs(str(['/']))
print(tar)
\(\texttt{Part 2}\)
a=list(map(lambda it:it.strip().split(),open(0).readlines()))
dir,road,lines,tar,lim=[],{},[],0,-1
for it in a:
if it[0]=='$':
if it[1]=='cd':
if it[2]=='..': dir=dir[:-1]
elif it[2]=='/': dir=['/']
else:
if (str(dir),str(dir+[it[2]])) not in lines:
lines.append((str(dir),str(dir+[it[2]])))
dir.append(it[2])
elif it[1]=='ls':
pass
else:
if it[0]=='dir':
if (str(dir),str(dir+[it[1]])) not in lines:
lines.append((str(dir),str(dir+[it[1]])))
else:
lines.append((str(dir),it[0]))
def dfs(root):
global tar,lim
siz=0
for f,t in lines:
if f!=root: continue
if t[0]!='[': siz+=int(t)
else: siz+=dfs(t)
if lim==-1:
if siz<=100000: tar+=siz
else:
if siz>=lim: tar=min(tar,siz)
return siz
tot=dfs(str(['/']))
tar,lim=1e18,30000000-(70000000-tot)
dfs(str(['/']))
print(tar)
\(\texttt{Day 8}\)
\(\texttt{Part 1}\)
a=list(map(lambda it:[int(i) for i in it.strip()],open(0).readlines()))
vis=[[False for _ in i] for i in a]
n,m=len(a),len(a[0])
for i in range(0,n):
mx=-1
for j in range(0,m):
if a[i][j]>mx: mx,vis[i][j]=a[i][j],True
mx=-1
for j in range(m-1,-1,-1):
if a[i][j]>mx: mx,vis[i][j]=a[i][j],True
for j in range(0,m):
mx=-1
for i in range(0,n):
if a[i][j]>mx: mx,vis[i][j]=a[i][j],True
mx=-1
for i in range(n-1,-1,-1):
if a[i][j]>mx: mx,vis[i][j]=a[i][j],True
print(sum(sum(i) for i in vis))
\(\texttt{Part 2}\)
def calc(x:int,y:int):
tar=1
mx,sum=a[x][y],0
for j in range(y+1,m):
if a[x][j]<mx: sum+=1
else:
sum+=1
break
tar*=sum
mx,sum=a[x][y],0
for j in range(y-1,-1,-1):
if a[x][j]<mx: sum+=1
else:
sum+=1
break
tar*=sum
mx,sum=a[x][y],0
for i in range(x+1,n):
if a[i][y]<mx: sum+=1
else:
sum+=1
break
tar*=sum
mx,sum=a[x][y],0
for i in range(x-1,-1,-1):
if a[i][y]<mx: sum+=1
else:
sum+=1
break
tar*=sum
return tar
a=list(map(lambda it:[int(i) for i in it.strip()],open(0).readlines()))
n,m=len(a),len(a[0])
print(max(max(calc(i,j) for j in range(len(a[i]))) for i in range(len(a))))
# print('\n'.join([str([calc(i,j) for j in range(len(a[i]))]) for i in range(len(a))]))
\(\texttt{Day 9}\)
\(\texttt{Part 1}\)
a=[(i[0],int(i[1])) for i in [i.strip().split(' ') for i in open(0).readlines()]]
dx,dy=[1,-1,0,0],[0,0,-1,1] # UDLR
s,t,route=(0,0),(0,0),set([(0,0)])
for p,q in a:
for _ in ' '*q:
lst,s=s,(s[0]+dx["UDLR".index(p)],s[1]+dy["UDLR".index(p)])
if max(abs(s[0]-t[0]),abs(s[1]-t[1]))>1: t=lst
route.add(t)
print(len(route))
\(\texttt{Part 2}\)
def sgn(x): return (0 if not x else (-1 if x<0 else 1))
def nxt(s,t):
dis=max(abs(s[0]-t[0]),abs(s[1]-t[1]))
return (t[0]+sgn(s[0]-t[0])*(dis>1),t[1]+sgn(s[1]-t[1])*(dis>1))
a=[(i[0],int(i[1])) for i in [i.strip().split(' ') for i in open(0).readlines()]]
dx,dy=[1,-1,0,0],[0,0,-1,1] # UDLR
s,route=[(0,0)]*10,set([(0,0)])
for p,q in a:
for _ in ' '*q:
s[0]=(s[0][0]+dx["UDLR".index(p)],s[0][1]+dy["UDLR".index(p)])
for i in range(1,10): s[i]=nxt(s[i-1],s[i])
route.add(s[9])
print(len(route))
\(\texttt{Day 10}\)
\(\texttt{Part 1}\)
a=[i.strip().split() for i in open(0).readlines()]
r,v,tar,dt=0,1,0,0
for it in a:
l1,l2=r,v
if it[0]=='noop': r+=1
else: r+=2
if l1%40<20 and r%40>=20: tar+=l2*(l1//40*40+20)
if it[0]!='noop': v+=int(it[1])
print(tar)
\(\texttt{Part 2}\)
def work():
global t
print(("#" if l<=t%40 and t%40<l+3 else '.'),end=('\n' if t%40==39 else ''))
t+=1
a=[i.strip().split() for i in open(0).readlines()]
t,l=0,0
for it in a:
if it[0]=='noop': work()
else: work(),work()
if it[0]!='noop': l+=int(it[1])
\(\texttt{Day 11}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 12}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 13}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 14}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 15}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 16}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 17}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 18}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 19}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 20}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 21}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 22}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 23}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 24}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)
\(\texttt{Day 25}\)
\(\texttt{Part 1}\)
\(\texttt{Part 2}\)