69 lines
1.9 KiB
Python
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)
|