diff --git a/day08.py b/day08.py new file mode 100644 index 0000000..1b7ad2a --- /dev/null +++ b/day08.py @@ -0,0 +1,64 @@ +from itertools import combinations +from tools.aoc import AOCDay +from typing import Any +from tools.grid import Grid + + +def get_antinode_count(grid: Grid, repeat: bool = False) -> int: + antinodes = set() + frequencies = set(grid.get(x) for x in grid.getActiveCells()) + for frequency in frequencies: + antennas = set(x for x in grid.getActiveCells() if grid.get(x) == frequency) + if len(antennas) < 2: + continue + if repeat: + antinodes |= antennas + + for pair in combinations(antennas, 2): + a, b = (pair[0], pair[1]) if pair[0] < pair[1] else (pair[1], pair[0]) + diff = b - a + + while grid.isWithinBoundaries(a - diff): + antinodes.add(a - diff) + if not repeat: + break + a -= diff + + while grid.isWithinBoundaries(b + diff): + antinodes.add(b + diff) + if not repeat: + break + b += diff + + return len(antinodes) + + +class Day(AOCDay): + inputs = [ + [ + (14, "input8_test"), + (413, "input8"), + ], + [ + (34, "input8_test"), + (1417, "input8"), + ], + ] + + def parse_input(self) -> Grid: + grid = Grid.from_data(self.getInput(), default=False, translate={".": False}) + grid.minX, grid.minY, grid.maxX, grid.maxY = 0, 0, len(self.getInput()[0]) - 1, len(self.getInput()) - 1 + return grid + + def part1(self) -> Any: + grid = self.parse_input() + return get_antinode_count(grid, repeat=False) + + def part2(self) -> Any: + grid = self.parse_input() + return get_antinode_count(grid, repeat=True) + + +if __name__ == "__main__": + day = Day(2024, 8) + day.run(verbose=True) diff --git a/inputs/input8 b/inputs/input8 new file mode 100644 index 0000000..e6d162d --- /dev/null +++ b/inputs/input8 @@ -0,0 +1,50 @@ +.....E........................s.......n.........g. +.............................c............4....... +........................................4......... +....................................5.....e....... +...............p...........c...................... +....h................s...................e........ +h..................1...........s..Ke............C. +.......................1...............g.....KC... +........8.......B.....p..kc................K..e.X. +...b.........pI...k..................r.........C.X +...........................5.n............R.r..... +j......Z....tApE..............c....5..g.X......... +............E..L......5............X.............. +b...................D...................K.....R..4 +..k..D.....h..A...........L.1..................... +.j...........h......B.......A..................... +.........I......b..................4.......r....0. +.................B.n..........G................... +..........9.I...............U...................2. +.........Doy........s...............U....R........ +..........................G.....V............R.... +...z.o.......I..E....t.....G..n....3.............. +.Z.........Aj..................W.......M.U........ +..Z......k......O....W.....U........M.......0..... +.....z......o.O..........a....ZG.................. +........L..........Y............a................. +......D8t...S.......WO............................ +......1P..........WO.9..F.w........Q..d....0...... +..........y............................x.......... +............z..........w.........J................ +.o...t..P.........w..B......F....v........x....2.. +y..8...........v.......M.................x.......2 +.....y..........z..N...H.......6........a......... +....N.S............H...................a.......... +N........S..........v........m.................... +......8...........H........7x....6.l.............. +.............q.P...............w..m............... +.....S......................7.6.......T........... +...............................0....3.6....J...... +...N..........v.................m.......3.l.J..... +...........................F..d....7.3............ +...............u.................................. +.V....Y..u..........H.......J.............T....... +.......V...q...................d..fF.............T +..u................................f.....T......l. +..................................i............... +...Y......M.........................7............. +............Y...........9............f2..m..Q..... +.....................i.9........fd.......l....Q... +V.........q................i...................... diff --git a/inputs/input8_test b/inputs/input8_test new file mode 100644 index 0000000..de0f909 --- /dev/null +++ b/inputs/input8_test @@ -0,0 +1,12 @@ +............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............ \ No newline at end of file