56 lines
1 KiB
Python
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())
|