generated from public/aoc_template
day6 - use internal seen
This commit is contained in:
parent
89e37bc290
commit
2c92e9bbac
44
day06.py
44
day06.py
@ -6,25 +6,6 @@ from tools.grid import Grid
|
|||||||
DIRECTIONS = [(0, -1), (1, 0), (0, 1), (-1, 0)]
|
DIRECTIONS = [(0, -1), (1, 0), (0, 1), (-1, 0)]
|
||||||
|
|
||||||
|
|
||||||
def walk_room(grid: Grid, start: Coordinate) -> tuple[set, bool]:
|
|
||||||
cur_pos = start
|
|
||||||
dir_index = 0
|
|
||||||
visited = set()
|
|
||||||
while grid.isWithinBoundaries(cur_pos):
|
|
||||||
if (cur_pos, dir_index) in visited:
|
|
||||||
return set(x[0] for x in visited), True
|
|
||||||
|
|
||||||
visited.add((cur_pos, dir_index))
|
|
||||||
next_pos = cur_pos + DIRECTIONS[dir_index]
|
|
||||||
while grid.get(next_pos):
|
|
||||||
dir_index = (dir_index + 1) % len(DIRECTIONS)
|
|
||||||
next_pos = cur_pos + DIRECTIONS[dir_index]
|
|
||||||
|
|
||||||
cur_pos = next_pos
|
|
||||||
|
|
||||||
return visited, False
|
|
||||||
|
|
||||||
|
|
||||||
class Day(AOCDay):
|
class Day(AOCDay):
|
||||||
inputs = [
|
inputs = [
|
||||||
[
|
[
|
||||||
@ -44,13 +25,32 @@ class Day(AOCDay):
|
|||||||
|
|
||||||
return grid, start
|
return grid, start
|
||||||
|
|
||||||
|
def walk_room(self, grid: Grid, start: Coordinate) -> bool:
|
||||||
|
cur_pos = start
|
||||||
|
dir_index = 0
|
||||||
|
self.seen_reset()
|
||||||
|
while grid.isWithinBoundaries(cur_pos):
|
||||||
|
if self.seen((cur_pos, dir_index)):
|
||||||
|
return True
|
||||||
|
|
||||||
|
next_pos = cur_pos + DIRECTIONS[dir_index]
|
||||||
|
while grid.get(next_pos):
|
||||||
|
dir_index = (dir_index + 1) % len(DIRECTIONS)
|
||||||
|
next_pos = cur_pos + DIRECTIONS[dir_index]
|
||||||
|
|
||||||
|
cur_pos = next_pos
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
def part1(self) -> Any:
|
def part1(self) -> Any:
|
||||||
grid, cur_pos = self.parse_input()
|
grid, cur_pos = self.parse_input()
|
||||||
return len(set(x[0] for x in walk_room(grid, cur_pos)[0]))
|
self.walk_room(grid, cur_pos)
|
||||||
|
return len(set(x[0] for x in self.SEEN))
|
||||||
|
|
||||||
def part2(self) -> Any:
|
def part2(self) -> Any:
|
||||||
grid, start = self.parse_input()
|
grid, start = self.parse_input()
|
||||||
visits = set(x[0] for x in walk_room(grid, start)[0])
|
self.walk_room(grid, start)
|
||||||
|
visits = set(x[0] for x in self.SEEN)
|
||||||
|
|
||||||
loops = 0
|
loops = 0
|
||||||
for obs_pos in visits:
|
for obs_pos in visits:
|
||||||
@ -58,7 +58,7 @@ class Day(AOCDay):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
grid.set(obs_pos, True)
|
grid.set(obs_pos, True)
|
||||||
loops += walk_room(grid, start)[1]
|
loops += self.walk_room(grid, start)
|
||||||
grid.set(obs_pos, False)
|
grid.set(obs_pos, False)
|
||||||
|
|
||||||
return loops
|
return loops
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user