from tools.aoc import AOCDay from typing import Any class Day(AOCDay): inputs = [ [ (3, "input20_test"), (31053880, "input20"), ], [ (117, "input20"), ], ] def parse_input(self) -> list[tuple[int, int]]: rules = [] for line in self.getInput(): x, y = map(int, line.split("-")) rules.append((x, y)) return rules def condensed_rules(self) -> list[tuple[int, int]]: rules = self.parse_input() found_something = True while found_something: found_something = False new_rules = [] checked = set() for rule in rules: if rule in checked: continue for sub_rule in rules: if rule == sub_rule or sub_rule in checked: continue if ( rule[0] <= sub_rule[1] <= rule[1] or sub_rule[0] <= rule[1] <= sub_rule[1] or rule[1] + 1 == sub_rule[0] or sub_rule[1] + 1 == rule[0] ): new_rules.append((min(sub_rule[0], rule[0]), max(sub_rule[1], rule[1]))) checked.add(sub_rule) checked.add(rule) found_something = True break else: new_rules.append(rule) rules = new_rules return list(sorted(rules)) def part1(self) -> Any: rules = self.condensed_rules() return rules[0][1] + 1 def part2(self) -> Any: ans = 0 rules = self.condensed_rules() for i in range(len(rules) - 1): ans += rules[i + 1][0] - rules[i][1] - 1 return ans if __name__ == "__main__": day = Day(2016, 20) day.run(verbose=True)