64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
|
|
from solutions import BaseSolution
|
||
|
|
|
||
|
|
|
||
|
|
class Solution(BaseSolution):
|
||
|
|
input_file = '19.txt'
|
||
|
|
trim_input = False
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return 'Day 19: A Series of Tubes'
|
||
|
|
|
||
|
|
def _walk_maze(self, puzzle_input):
|
||
|
|
DIRECTIONS = {
|
||
|
|
'D': (1, 0),
|
||
|
|
'U': (-1, 0),
|
||
|
|
'R': (0, 1),
|
||
|
|
'L': (0, -1),
|
||
|
|
}
|
||
|
|
maze = puzzle_input.splitlines()
|
||
|
|
pos = (0, list(maze[0]).index('|'))
|
||
|
|
d = DIRECTIONS['D']
|
||
|
|
paths = '-|'
|
||
|
|
steps = 0
|
||
|
|
seen = ''
|
||
|
|
|
||
|
|
def _nc(nu):
|
||
|
|
np = (pos[0] + nu[0], pos[1] + nu[1])
|
||
|
|
if np[0] < len(maze) and np[1] < len(maze[np[0]]):
|
||
|
|
return maze[np[0]][np[1]]
|
||
|
|
else:
|
||
|
|
return ' '
|
||
|
|
|
||
|
|
while True:
|
||
|
|
pos = (pos[0] + d[0], pos[1] + d[1])
|
||
|
|
c = _nc((0, 0))
|
||
|
|
steps += 1
|
||
|
|
if c == '+':
|
||
|
|
nc = _nc(d)
|
||
|
|
if nc == ' ':
|
||
|
|
for v in DIRECTIONS.values():
|
||
|
|
if -v[0] == d[0] and -v[1] == d[1]:
|
||
|
|
continue
|
||
|
|
nc = _nc(v)
|
||
|
|
if nc != ' ':
|
||
|
|
d = v
|
||
|
|
break
|
||
|
|
elif c == ' ':
|
||
|
|
break
|
||
|
|
elif c not in paths:
|
||
|
|
seen += c
|
||
|
|
return seen, steps
|
||
|
|
|
||
|
|
def solve(self, puzzle_input):
|
||
|
|
seen, _ = self._walk_maze(puzzle_input)
|
||
|
|
return seen
|
||
|
|
|
||
|
|
def solve_again(self, puzzle_input):
|
||
|
|
_, steps = self._walk_maze(puzzle_input)
|
||
|
|
return steps
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
solution = Solution()
|
||
|
|
solution.show_results()
|