diff --git a/2023/day16/input b/2023/day16/input new file mode 100644 index 0000000..ff15ef9 --- /dev/null +++ b/2023/day16/input @@ -0,0 +1,110 @@ +\..|.....................|.-........\.............-................|./....|.....-...-......................... +.......\.........|..............-...||..............-...........--.|...............||..........\............|. +........../.....................\.........\..................\....|.....-.................../..-.\............ +................/..../........../..-....|\.|...-...................\....|/........|........................... +.....|../-\.|....|................................--.-./..........|.........../..-....-................-....|. +.../..........\................-.......\................|/..\.................\.....\...|....../............./ +..-../.../......-.....\........//.............|.........../...|.........../.......-........................... +......\....../......./..|\............/..........................\..............\.....\.........|......-...|.. +.|/.......\.........|...../..//...................................-....-...........././-...............-...... +........-....../......./..\.............|.....................\........../-....../........-................... +......-........./\..................../..\|..-//....|.\--................|.....|.../............-............\ +........................|...-........|..............|..............|................./........................ +...................|................|..../...-...................../...|......\..................|...|\....... +....-......../.\...............\-...\...........................................................|............. +.............../.|.......|.........\.\.........................-|.............\........-.../...-...||......... +....-...-\.-............/...../...../..\........\|....\...............\.............-........................\ +........././.......//......-...|...........-...|..|....-......-.......|............................|../....... +\.................|..../.....-..|......./.....................\....../...|./\.\...............-............./. +.....-\............../...................................../....\.....-|...........-.\...../............\..... +......................./..\..................|...............-.........-..../......../..|..................... +....\...................../...../......|...........................\......||.\...-..............-...........|. +..........................|........../...........|....-.......\........................-|..\............/..|.. +-./...|..............................................|./../.........-|.\.|..........\........../.........\.... +...........|......................-............................|.........................\....-........../.... +........................|/....\......../.|.......\.........../..................\........................-.... +...../.................-............................-.\......|...............\...........\.....-.............- +....|-.............-.../....\...........-...........|\.............-.............../-....../.................. +...............\/.............../.|............................/.|...................-............-........... +.................\.....\........./......../.....\.....|........-..\..........................|................ +...............-..-........-........../...../...\.................\..-.-.....|..........\..............\...... +.............-....../....|.\\............|......|.........-.......|................/.......|./............\... +.................................................\.......\-....\.........|.....-..|.........-................/ +.............../..............\..........................\.................-\............-............-....... +/....|...../.....................................................-....\.....-................../..........-..\ +.....\.....................-...........|...\.....-...../.......-.|.................|.......................... +.............-..........-....-....-.-../....|.......-.\.........................-........../..../.....\....... +..........\\.........................../...-........./........\............|.........../...................... +............-......|..................................................................-......./...-........... +........\............-......|....\............................\.\........|......................../......\...- +......../...|........|..-.-.../..../..........|........|....../....../../...........\.............\....../.... +......|.........-........//........-../....\........./..........|.-......-...-......-.............\..|........ +./......................../................-..........................................-.....--....|........... +....../............\\..../\............|..-.|.|.-.............-........|................................./.../ +..-......../.......|.......|........................-....-..............................-..................... +.........||............|.\................|......................./.\...............-..........|..../..-..\... +\|.......|..\..........-.................../|.....-.............\............./....................../........ +.....................|....-.../...............\.\............................................................. +............|.......................\...........-......|...././.-...../................|........-..........\.\ +..........|../\.|.......|\..-............\.-..............-....../...\......||..\........-.\..../...\......./| +..|.....................................-\............//.......|..\..............\.........|....|............. +.....\...............................-........./..........\.........-....|..........-./../...\................ +.....\./....-...\....................\|.........\.............-...\..........-...............|............./.. +/./\......\.........\........-../......../.....|/..................../.././..-......................|\........ +.|\...-.\\.......................|........-\.....|......|......./|..........-..../...................|.|...... +...........\.............\./....|./.............................|............................................. +.../...../.|.................\...../.....-..............|.\.\../.................../.............\............ +..............\............-........-........\....../............|....|...\....\...|.....-..../............... +/.\.\........-....\.|....-....\..../...-./...............-.......\../........./..../........./.......\........ +|..............................-..\............................\......//........\../...-../..\......../....... +.............\.../.\............\--............|................-|............|......../...................... +...../....|................................-.....................................|./..........|.........\.\\.. +........./......-.....|............/.-.......\..-.......................................|..................\.. +.......\.\.....................-|...../.....|........|............-..............-....../\..\....../.......... +|..\.|........../|..\..|\..-...................\.................../.....-/...............|................../ +...........|..-..............|........................-..............-...............-.............\.........\ +...\./.....-...|.-.......-................/.\.....-..-...|......-.......................................--...| +...............-.........|............-............|./.......\...../.....\............-.\..................... +..................|......|..........-..............................-....|............|.\........./..-......... +|......................../.....-../|.....\./..\....|......................./........................./...\.... +....|............-........\..-...............-................/\..........................|........|.......\-. +|......./.....\.......\..................-.\..../....|............|.../..................../|.../........../.. +...-|..................||......--......\......|.............|\........./.................\......\........\.... +./........./........-...................................\......-......................................-.....-. +.....\..-\-....\........................|........../.......|.........-.............................///........ +./.............\........./.................|.....................|..\.........../...|...|..\.|............-... +.................................\.................................\...........................-.........-.... +...................\....|...............|...............\..../.....-.....................................\.... +.../.......-.......|...........|.....\..................../......................|../.............\........... +......-....................../..../.....-..............\............./...........-.....\....|...............|. +......-.......-.......|..................\................-...|./.......--............../.......|.-.|......... +-..................\........../..........................-...-.............../..............................|. +............/.........-..../\..-.....\....\........./.........\.........../.........|/.../.................... +...................................../.....|..\.............\..........-.......\............../.............|. +..../........./.........................-.......\..|..|.....--|...../.............../..-/./.......|..../|..... +.........\.|...|..|-...................................\../..-.....|....\....................-................ +..../..-......|..............\../............./..........-.|......../..........|.\........|..................- +......|.................\..........\|...................-.../.\.........../.|............../................./ +.........................\.................................../-./............................-..-.........|... +\...........-................/....-.-....................................../...../..............\.......-\.../ +-....................................\.........................../.............................|.............. +......................\............\.......\..\.............\.................-....\....-.|................... +.|-.-...../......./............./........|.................../.........-..\........./.\|...........-.......... +.......\..............\.....-..........\.|.\...|.........\/..........\......|.\...................-........... +../.-..................../..................|.....-...-....-............................-.-..-../..\.......... +.................................-.......|...../.\.................\..../................................-.... +.-..|.....|.........-........|....-.........../...........\......-..........................\................. +..-.................../...|..-..|...................../...-...|........................................./|.... +.........................-\............................./....................../.......-................|..... +........../.......\.........|...-/........./............./......................../...........-../..\.-\...-.. +..........|....\-........\...................-.|....-.........\................../.......\.................... +/...-..........\......\.........|.............|...........-....../.|..|..-............................|....... +.........\.|........\......\....|.........................................../........-........................ +....\.....|.......\....................................-............|.....-........./..\...\.....-..-......... +.|../...../.......|\......\............../....\..|..-...-..............|-.................................-... +.|.\......./........../........|..\.../|......\....|.........-.|.................-.........|............./..-. +...............-.................|...-../\..../.......-.....|..\./............................................ +....-.|.........-........................../...................|...............\........................../... +..|/...-..../../...-........-...-.....................................\....................................... +............../....|.....-\.....-................................../\.....................\....-........-..... +......../.|.................|......|.|.-....|...................../....................................\...... diff --git a/2023/day16/solutions.py b/2023/day16/solutions.py new file mode 100644 index 0000000..5fd4eb0 --- /dev/null +++ b/2023/day16/solutions.py @@ -0,0 +1,60 @@ +from math import inf + + +with open("input") as f: + ls = f.read().strip().split("\n") + +board = {i + 1j * j: x for i, l in enumerate(ls) for j, x in enumerate(l)} + + +def energized(entry, d): + q = [(entry - d, d)] + seen = set() + seen_loc = set() + while q: + here, d = q.pop() + if (here, d) in seen: + continue + seen.add((here, d)) + newhere = here + d + if newhere not in board: + continue + seen_loc.add(newhere) + match board[newhere]: + case "|": + if d in (-1j, 1j): + q.append((newhere, 1)) + q.append((newhere, -1)) + else: + q.append((newhere, d)) + case "-": + if d in (1, -1): + q.append((newhere, 1j)) + q.append((newhere, -1j)) + else: + q.append((newhere, d)) + case ".": + q.append((newhere, d)) + case "/": + q.append((newhere, (d * 1j).conjugate())) + case "\\": + q.append((newhere, d.conjugate() * 1j)) + return len(seen_loc) + + +# Part 1 +print(energized(0, 1j)) + +# Part 2 +m = -inf +N, M = len(ls), len(ls[0]) +for i in range(N): + m = max(energized(i, 1j), m) +for i in range(N): + m = max(energized((M - 1) * 1j + i, -1j), m) +for i in range(M): + m = max(energized(i * 1j, 1), m) +for i in range(M): + m = max(energized(N - 1 + i * 1j, -1), m) + +print(m)