diff --git a/day06.py b/day06.py new file mode 100644 index 0000000..e7059ef --- /dev/null +++ b/day06.py @@ -0,0 +1,69 @@ +from tools.aoc import AOCDay +from typing import Any +from tools.coordinate import Coordinate +from tools.grid import Grid + +DIRECTIONS = [(0, -1), (1, 0), (0, 1), (-1, 0)] + + +def walk_room(grid: Grid, start: Coordinate) -> tuple[set, bool]: + cur_pos = start + dir_index = 0 + visited = set() + while grid.isWithinBoundaries(cur_pos): + if (cur_pos, dir_index) in visited: + return set(x[0] for x in visited), True + + visited.add((cur_pos, dir_index)) + next_pos = cur_pos + DIRECTIONS[dir_index] + while grid.get(next_pos): + dir_index = (dir_index + 1) % len(DIRECTIONS) + next_pos = cur_pos + DIRECTIONS[dir_index] + + cur_pos = next_pos + + return visited, False + + +class Day(AOCDay): + inputs = [ + [ + (41, "input6_test"), + (5208, "input6"), + ], + [ + (6, "input6_test"), + (1972, "input6"), + ], + ] + + def parse_input(self) -> tuple[Grid, Coordinate]: + grid = Grid.from_data(self.getInput(), translate={".": False, "#": True}) + start = list(grid.find("^"))[0] + grid.set(start, False) + + return grid, start + + def part1(self) -> Any: + grid, cur_pos = self.parse_input() + return len(set(x[0] for x in walk_room(grid, cur_pos)[0])) + + def part2(self) -> Any: + grid, start = self.parse_input() + visits = set(x[0] for x in walk_room(grid, start)[0]) + + loops = 0 + for obs_pos in visits: + if obs_pos == start: + continue + + grid.set(obs_pos, True) + loops += walk_room(grid, start)[1] + grid.set(obs_pos, False) + + return loops + + +if __name__ == "__main__": + day = Day(2024, 6) + day.run(verbose=True) diff --git a/inputs/input6 b/inputs/input6 new file mode 100644 index 0000000..8ec1ac6 --- /dev/null +++ b/inputs/input6 @@ -0,0 +1,130 @@ +...............................#.........#............#...#.............................#....................#.....#........##.... +..##..##.#.#....................##....#..#.....#...............#..#.....#.....................#...#.............#...#...#......... +...................#............#..................................................#............................#..#.............. +............#...................................................#.........................#..#....#....................#.......... +.#...........#...............................#..#....................................#............#.#............#................ +.........................#..........................................#.................#...#.....#.#............................... +..#..................#......................................#......#........#.......#..........#.........#..#.........#........... +..........#..............#....................................#................................................#........#........# +..#...............................................................................................................#.#..#.......... +....#....................##...................#..#....#....#.........#.......#.....................................#.............. +........#...................#.......#.........................................#.........#........#....................#........... +................................................................#.......#......#...........#................#..................... +...........................................#.............#...........##.#................................#...................#.... +............................#......#........#...#................................................................................. +.......#.............#...............................#.............................................#.............#.........#...... +......................................................#.........................#....#................................#........... +...............#...........................................#..........#.........#..#..................#........................... +.....................................##...#................................#..#......................#.......#..........#......... +..............#.......#....................#.....................................................#.......#...................##..# +...............................................#.............#..#...#.....#..................................................#.... +.....................................#........#...........................................................#......#................ +........##............#...............................#....#...................................................................... +.....#............#...................................................................#.............................#............. +........#...............#......#..........#........#.....#........#..........#...............................................#..#. +..................#.............#........#......#.................................................#..........................#.... +.................................#............#...............................................................#..##............... +......................................#.#...........#........#.................................................................#.. +...........#...........#..............#..#.#...........#............................................#...#.....................#... +....##......................#..........#..............#.............#.....#............................#....................#..... +..................#...................#..........#............................................#...#.....................#......... +.....................#...........#.........................................................#...................................... +.#..............#....#..#.#...##.........#....#.............#..........#.......#...#.............................#.........#...#.. +..................#...............#.....................#..#.....................#........#....................................... +......#..#......#...#..................##.............#...................#.....#.....#................................#........#. +....................#.#................#....#..................................................#............#................#.... +...........................#..#.#......#........................#......#.......................................................... +..#.#...............................................................#.#........................#.....................#..#......... +...#..............................#......................................................#...#....................#.#............. +....................#.......#...........#.....#.......................#........#...........................##..................... +............#.........................................................#..............................................#.........#.. +..................#.#..............................#......#..................................#..........#......#..#............... +....##................#.#..................#.....#...........................................#.......................##........... +......#...........................#......#.......#..........#................#..#......#..........#..............#..#............. +........#.................#...#.........................................#..........#.........#...................................# +.#..........#....#.....#.............#...........#..................#.................#...#....................................... +...........................................................#......#...#...........................................##........#....# +............#.............................................................................#..........................#............ +.........#..............................................................................................#.........#.....#......#.. +.........#.......................................................................#........................#..#.....#.#............ +............................#.............#..........#..#...........#......#..............#..........................#............ +..#.#............#.........#.........#..................#.......................#............................................#.... +...#......................#......................................................#...........#..........................#......... +.#....#...............................................................................................................#........... +.#..#................#................................................................#....^.................#.............#...... +........................................................................................#.....................#................... +........##................#.............................#......................................................................... +.#.#.................#.....................#.....................#..........................#.................#...............#... +........#....................................................................................................#.................... +##......#.............................#.......#........................................................................#.....##... +..........#..........................................#.................#.....#............................................#....... +......................#........................#.......................................#............#............................. +.............................#.#.......................................................................................#.......... +...#.........#.....#........................#.................#...........#.....................#................................. +.........#...........................................................................#...........................#................ +......#...#............#..........#........................#...................#...........#................................#..... +.....#...#....#..........................................................#......................#.....................#..........# +#.............#....................#...............................#.......#.#.............#.....................#.............#.. +............................................................#.......#...................#.................................#......# +...#..#......................................#.........................................#..#.#.......##.......#............#..#.... +.....#.#...#...#.#................................................................................................................ +...............................................................................#........#...................#..#.........#....#... +......#.........#.............#........................................................................................#.##....... +.......................#...................................................................................................#...... +.........................................................#....................................#...................##.........#.... +.#..............#.#.#.............................#........................#........................#...................#.#....... +.........#.....#..........................................................................#.................#.................#... +.........#..............#...............................#.........#......#.#...................................................... +......................................................................................................#....#............#.......#. +.....#.................#.......#.....#..................................#...............................................#......... +...............................................................#.............#.................................................#.. +...#.....................................................................#...#.......#......#..................................... +.................................#...#.#............................................................#...#......................... +...........#..#.................................#....#...................#.............#.........#................................ +..................................................#..#...........#...........................#.................................... +.....#.....................................#......#......#...........................................................#............ +..............#..........................................#.........#.............#..#............................#................ +..........................................................................#..........#.......................#.................... +.......##................#................................................................................................#....... +.#.....#.....#..................#............#......#............................#.........#...................................... +..##....#..................................................................................................................#...... +.......#......................#..................#...#.....................................#............#..............#.......... +...............................#................#...#.................................##......................#................... +...............#..............................................................................................#.....##.......#.... +................................#..........#........................................#..#.......................................... +..................................................#.................................................................#............. +....................#....#.....................#.................................#.........#.....#......#......................#.. +................#.............#............#................#........................................................#..........#. +.#.......#......##...................#....#..............................................................#.................#...... +.........#.#............................................................................#........................#................ +...............#........##.....#.....................................#..#...........#......#...................................... +......#.............................................###..#.........#..............#...........................#.......#........... +.....................................#.........#...........................................................##..................... +.#....#.......................#.........#................................................................................#..#..... +....#..#.......................................................................................................##............#.... +..#...................................#....#......#....................#...............................#.......................... +...................#....##........................................##..........................................#................... +..........#.........#.............................................................#..#.........#...#............#.......#..#...... +....#...........#...##.........................#......................#.........#..#.............................................. +....................#.....#.....................................#...............................................................#. +.........#.......................#.................#...#....................................................#.#......#........#... +.................#.................................#..#..............#..........#...#.........#........#.##....##................. +.............#...........................#......................#.......................#......................................... +...............#.....#......#........#....#.......................................#.............................#................. +.............#.....##.........#...#............................................................................................... +.................................................................................#.............#.....#...#..#..................... +.................................#......#.#...#.......#......................................#......#..........................#.. +#..#....................................#..#...................................................................................... +...#......#.......................#..........................#...........#.#................#.#.......#........................... +#....#...............#..........................#....................#....#................................#............##........ +...........#........................#..........#......................................#...................................#.....#. +......#................................#................#.............................#.........#...#........#.................... +.............#................#...........#.#...........#.......................................#...........#.#................... +.....#......................#..........................#.................................#.............#............#....#........ +.....#.........#.#..............................................................................#...................##............ +......#.....#..#.............#...............#......#..#.#.................................#...............#...#.................. +....................#.......................#...................#........................#...................#..#.....##.......... +...............#...........#..#...........................................#........................#....#......................... +.....................................#...................#.#............#......................................#.................. +.....#......................#.#....................#.............................................#...........................#..#. +..........#........#................#.........#...........................................#....#..#...........#..####..........#.. diff --git a/inputs/input6_test b/inputs/input6_test new file mode 100644 index 0000000..b60e466 --- /dev/null +++ b/inputs/input6_test @@ -0,0 +1,10 @@ +....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#... \ No newline at end of file