advent-of-code/2021-python/solutions/day_12.py

55 lines
1.5 KiB
Python
Raw Normal View History

from solutions import BaseSolution
from collections import defaultdict, deque, Counter
class Solution(BaseSolution):
input_file = "12.txt"
def __str__(self):
return "Day 12: Passage Pathing"
def parse_input(self, data):
return [l.split("-") for l in data.split()]
def solve(self, puzzle_input):
return self._solve(puzzle_input, lambda seen: True)
def solve_again(self, puzzle_input):
return self._solve(
puzzle_input,
lambda seen: any(
[
k.islower() and k != "start" and v > 1
for k, v in Counter(seen).items()
]
),
)
def _solve(self, puzzle_input, isdup):
ft = defaultdict(lambda: [])
for f, t in puzzle_input:
ft[f].append(t)
for f, t in puzzle_input:
ft[t].append(f)
queue = deque([("start", list(), False)])
s2e = 0
while queue:
pos, seen, dup = queue.pop()
seen.append(pos)
dup = isdup(seen)
for t in ft[pos]:
if t == "end":
s2e += 1
continue
elif t == "start":
continue
elif dup and t.islower() and t in seen:
continue
queue.append((t, seen + [], dup))
return s2e
if __name__ == "__main__":
solution = Solution()
solution.show_results()