aoc2016/day20.py
2024-12-31 14:46:11 +01:00

69 lines
1.9 KiB
Python

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)