diff --git a/Python/2023/18/main.py b/Python/2023/18/main.py new file mode 100644 index 0000000..60f7a4c --- /dev/null +++ b/Python/2023/18/main.py @@ -0,0 +1,56 @@ +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())