Spaces:
Running
Running
def parse_input(file): | |
with open(file, 'r') as f: | |
grid = [list(line.strip()) for line in f.readlines()] | |
return grid | |
def find_guard_start(grid): | |
directions = {'^': (0, -1), '>': (1, 0), 'v': (0, 1), '<': (-1, 0)} | |
for y, row in enumerate(grid): | |
for x, cell in enumerate(row): | |
if cell in directions: | |
return (x, y), directions[cell] | |
return None, None | |
def turn_right(direction): | |
right_turns = {(0, -1): (1, 0), (1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1)} | |
return right_turns[direction] | |
def move(position, direction): | |
return position[0] + direction[0], position[1] + direction[1] | |
def is_within_bounds(position, grid): | |
x, y = position | |
return 0 <= x < len(grid[0]) and 0 <= y < len(grid) | |
def simulate_guard(grid): | |
start_pos, direction = find_guard_start(grid) | |
visited = set() | |
position = start_pos | |
while is_within_bounds(position, grid): | |
visited.add(position) | |
next_position = move(position, direction) | |
if is_within_bounds(next_position, grid) and grid[next_position[1]][next_position[0]] == '#': | |
direction = turn_right(direction) | |
else: | |
position = next_position | |
return visited | |
def simulate_with_obstruction(grid, obstruction_pos): | |
start_pos, direction = find_guard_start(grid) | |
visited = set() | |
position = start_pos | |
direction_map = {(-1, 0): '<', (0, -1): '^', (1, 0): '>', (0, 1): 'v'} | |
while is_within_bounds(position, grid): | |
if position == obstruction_pos: | |
return False # Obstruction is here, can't move | |
if (position, direction) in visited: | |
return True # Loop detected | |
visited.add((position, direction)) | |
next_position = move(position, direction) | |
if is_within_bounds(next_position, grid) and (grid[next_position[1]][next_position[0]] == '#' or next_position == obstruction_pos): | |
direction = turn_right(direction) | |
else: | |
position = next_position | |
return False | |
def find_loop_positions(grid): | |
loop_positions = 0 | |
for y, row in enumerate(grid): | |
for x, cell in enumerate(row): | |
if cell == '.' and (x, y) != find_guard_start(grid)[0]: | |
if simulate_with_obstruction(grid, (x, y)): | |
loop_positions += 1 | |
return loop_positions | |
file = "input.txt" | |
grid = parse_input(file) | |
# Part 1 | |
visited_positions = simulate_guard(grid) | |
print(len(visited_positions)) | |
# Part 2 | |
loop_positions = find_loop_positions(grid) | |
print(loop_positions) |