day20
This commit is contained in:
parent
b672c7cee2
commit
9f4981fced
68
day20.py
Normal file
68
day20.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
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)
|
||||||
1029
inputs/input20
Normal file
1029
inputs/input20
Normal file
File diff suppressed because it is too large
Load Diff
3
inputs/input20_test
Normal file
3
inputs/input20_test
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
5-8
|
||||||
|
0-2
|
||||||
|
4-7
|
||||||
Loading…
Reference in New Issue
Block a user