55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
|
|
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()
|