From bf17996052614ab0b8fc44535ff805262eeec58a Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Mon, 1 Jan 2024 01:14:09 -0800 Subject: [PATCH] 2023 dec 16th --- Python/2023/16/main.py | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Python/2023/16/main.py diff --git a/Python/2023/16/main.py b/Python/2023/16/main.py new file mode 100644 index 0000000..5d083ae --- /dev/null +++ b/Python/2023/16/main.py @@ -0,0 +1,72 @@ +# y, x +# j, i + +input = open("input", 'r')#.read().rstrip() + +data = [] + +for line in input: + data.append(list(line.rstrip())) + + +def printenergized(pos, energized): + for j, row in enumerate(data): + for i, char in enumerate(row): + if pos == (j,i): + print("*", end="") + elif (j, i) in energized: + print("#", end="") + else: + print(char, end="") + print() + print() + +def beam(split_stack): + assert(len(data) == len(data[0])) + energized = set() + prevpos = set() + while len(split_stack) > 0: + pos, dr = split_stack.pop() + while min(pos) >= 0 and max(pos) < len(data): + energized.add(pos) + if pos+dr in prevpos: + break + else: + prevpos.add(pos+dr) + # printenergized(pos, energized) + curr_space = data[pos[0]][pos[1]] + if curr_space == "/": + dr = (-dr[1], -dr[0]) + elif curr_space == "\\": + dr = (dr[1], dr[0]) + elif curr_space == "-" and dr[0] != 0: + split_stack.append(((pos[0], pos[1]+1),(0, 1))) + split_stack.append(((pos[0], pos[1]-1),(0,-1))) + break + elif curr_space == "|" and dr[1] != 0: + split_stack.append(((pos[0]+1, pos[1]),( 1,0))) + split_stack.append(((pos[0]-1, pos[1]),(-1,0))) + break + pos = tuple(sum(elems) for elems in zip(pos,dr)) + return energized + +split_stack = [((0,0),(0,1))] +energized = beam(split_stack) +print(len(energized)) + +energizes = [] + +# Left & Right +for dr, x in zip([1, -1], [0, len(data[0])-1]): + for j in range(len(data)): + split_stack = [((j,x),(0,dr))] + energizes.append(len(beam(split_stack))) + +# Top & Bottom +for dr, y in zip([1, -1], [0, len(data)-1]): + assert(len(data[-1]) == len(data[0])) + for i in range(len(data[0])): + split_stack = [((y,i),(dr,0))] + energizes.append(len(beam(split_stack))) + +print(max(energizes))