diff --git a/day_08/program.py b/day_08/program.py index 47ec568..2daf652 100755 --- a/day_08/program.py +++ b/day_08/program.py @@ -2,14 +2,89 @@ # https://adventofcode.com/2024/day/8 +from itertools import combinations + + def get_lines(filename: str) -> list: with open(filename, "r") as file: return [line.strip() for line in file.readlines()] +def get_antenna_groups(lines: list) -> dict: + antenna_groups = {} + for row, line in enumerate(lines): + for col, char in enumerate(line): + if char != ".": + if char not in antenna_groups: + antenna_groups[char] = [(row, col)] + else: + antenna_groups[char].append((row, col)) + return antenna_groups + + +def get_anti_nodes(pair: tuple, max_row: int, max_col: int) -> set: + anti_nodes = set() + a, b = pair + a_row, a_col = a + b_row, b_col = b + vektor_row = b_row - a_row + vektor_col = b_col - a_col + anti_a_row = a_row - vektor_row + anti_a_col = a_col - vektor_col + if 0 <= anti_a_row <= max_row and 0 <= anti_a_col <= max_col: + anti_nodes.add((anti_a_row, anti_a_col)) + anti_b_row = b_row + vektor_row + anti_b_col = b_col + vektor_col + if 0 <= anti_b_row <= max_row and 0 <= anti_b_col <= max_col: + anti_nodes.add((anti_b_row, anti_b_col)) + return anti_nodes + + +def print_field(antennas: list, new_anti_nodes: set, max_row: int, max_col: int) -> None: + field = [] + for i in range(max_row + 1): + row = [] + for j in range(max_col + 1): + row.append(".") + field.append(row) + for antenna in antennas: + row, col = antenna + field[row][col] = "A" + for anti_node in new_anti_nodes: + row, col = anti_node + if field[row][col] == "A": + field[row][col] = "@" + else: + field[row][col] = "#" + for row in field: + for char in row: + print(char, end="") + print() + print() + + +def get_all_anti_nodes(antenna_groups: dict, max_row: int, max_col: int) -> set: + anti_nodes = set() + for antenna_group in antenna_groups: + antennas = antenna_groups[antenna_group] + antenna_pairs = combinations(antennas, 2) + for pair in antenna_pairs: + new_anti_nodes = get_anti_nodes(pair, max_row, max_col) + anti_nodes.update(new_anti_nodes) + # print_field(antennas, anti_nodes, max_row, max_col) + return anti_nodes + + def main(): - lines = get_lines("sample-input.txt") - # lines = get_lines("input.txt") + # lines = get_lines("sample-input.txt") + # lines = get_lines("sample-input2.txt") + lines = get_lines("input.txt") + + antenna_groups = get_antenna_groups(lines) + max_row = len(lines) - 1 + max_col = len(lines[0]) - 1 + anti_nodes = get_all_anti_nodes(antenna_groups, max_row, max_col) + print(f"Part 1: There are {len(anti_nodes)} anti-nodes on the map.") if __name__ == '__main__': diff --git a/day_08/sample-input2.txt b/day_08/sample-input2.txt new file mode 100644 index 0000000..86a4982 --- /dev/null +++ b/day_08/sample-input2.txt @@ -0,0 +1,10 @@ +.......... +.......... +.......... +....a..... +.......... +.....a.... +.......... +.......... +.......... +..........