lines = [] with open("input") as f: for line in f: lines.append(line.strip()) antennas: dict[str, list[tuple[int, int]]] = {} for row_idx, line in enumerate(lines): for col_idx, char in enumerate(line): if char != ".": if char not in antennas: antennas[char] = [] antennas[char].append((row_idx, col_idx)) row_count = len(lines) col_count = len(lines[0]) antinodes: set[tuple[int, int]] = set() for antenna_list in antennas.values(): for idx, antenna1 in enumerate(antenna_list): for antenna2 in antenna_list[idx + 1:]: row_diff = antenna2[0] - antenna1[0] col_diff = antenna2[1] - antenna1[1] pos = antenna1 while 0 <= pos[0] < row_count and 0 <= pos[1] < col_count: antinodes.add(pos) pos = (pos[0] - row_diff, pos[1] - col_diff) pos = antenna2 while 0 <= pos[0] < row_count and 0 <= pos[1] < col_count: antinodes.add(pos) pos = (pos[0] + row_diff, pos[1] + col_diff) print(len(antinodes))