AdventOfCode/Python/2023/18/main.py
2024-12-12 14:30:05 -08:00

56 lines
1 KiB
Python

input = open("input", 'r')
d = [((p:= line.split(" "))[0], int(p[1]), p[2][2:-2])
for line in input]
def drToC(dr):
match dr:
case "U" | "3":
return 1
case "D" | "1":
return -1
case "R" | "0":
return 1j
case "L" | "2":
return -1j
return 0
def fill(pos,s):
q = {pos}
while q:
c = q.pop()
if c in s: continue
s.add(c)
for dr in {1,-1,1j,-1j}:
q.add(c+dr)
def run():
cr = 0
s = {0}
for dr,ln,_ in d:
drC = drToC(dr)
for _ in range(ln):
cr = cr + drC
s.add(cr)
fill(-1+1j,s)
return len(s)
def run2():
v = [0]
cr = 0
prev = 0
area = 1
for _,_,color in d:
ln,dr = int(color[:-1],16), drToC(color[-1])
area += ln
prev += dr * ln
v.append(prev)
for v1,v2 in zip(v,(v[1:] + [v[0]])):
area += (v1.real * v2.imag) - (v1.imag * v2.real)
return int(area // 2)
print(run())
print(run2())