Advent Of Code 2022 Solution

\[\Large\texttt{Advent Of Code 2022} \]


\(\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}\)

posted @ 2024-12-05 18:23  静谧幽蓝  阅读(49)  评论(0)    收藏  举报