Spaces:
Running
Running
def solve(): | |
file = "input.txt" | |
grid = [] | |
with open(file, 'r') as f: | |
for line in f: | |
grid.append(list(line.strip())) | |
rows = len(grid) | |
cols = len(grid[0]) | |
def find_guard(): | |
for r in range(rows): | |
for c in range(cols): | |
if grid[r][c] == '^': | |
return r, c, 0 # row, col, direction (0: up, 1: right, 2: down, 3: left) | |
def is_valid(r, c): | |
return 0 <= r < rows and 0 <= c < cols | |
def move_guard(r, c, direction): | |
dr = [-1, 0, 1, 0] | |
dc = [0, 1, 0, -1] | |
nr, nc = r + dr[direction], c + dc[direction] | |
if is_valid(nr, nc) and grid[nr][nc] != '#': | |
return nr, nc, direction | |
else: | |
return r, c, (direction + 1) % 4 | |
# Part 1 | |
visited = set() | |
r, c, direction = find_guard() | |
while is_valid(r, c): | |
visited.add((r, c)) | |
r, c, direction = move_guard(r, c, direction) | |
print(len(visited)) | |
# Part 2 | |
def simulate_with_obstacle(obstacle_r, obstacle_c): | |
temp_grid = [row[:] for row in grid] | |
temp_grid[obstacle_r][obstacle_c] = '#' | |
visited = set() | |
r, c, direction = find_guard() | |
while (r,c) not in visited and is_valid(r,c): | |
visited.add((r,c)) | |
dr = [-1, 0, 1, 0] | |
dc = [0, 1, 0, -1] | |
nr, nc = r + dr[direction], c + dc[direction] | |
if is_valid(nr, nc) and temp_grid[nr][nc] != '#': | |
r,c = nr,nc | |
else: | |
direction = (direction + 1) % 4 | |
return (r,c) in visited | |
loop_count = 0 | |
start_r, start_c, _ = find_guard() | |
for r in range(rows): | |
for c in range(cols): | |
if grid[r][c] == '.' and (r, c) != (start_r, start_c): | |
if simulate_with_obstacle(r, c): | |
loop_count += 1 | |
print(loop_count) | |
solve() |