Skip to content

Instantly share code, notes, and snippets.

@UmerHA
Created December 6, 2024 22:38
Show Gist options
  • Save UmerHA/c16079dfad62174f2c5c4060bc6956c2 to your computer and use it in GitHub Desktop.
Save UmerHA/c16079dfad62174f2c5c4060bc6956c2 to your computer and use it in GitHub Desktop.
aoc_2024_6b
dirs = ['^','>','v','<']
dir_map = {'^':0,'>':1,'v':2,'<':3}
delta = [(-1,0),(0,1),(1,0),(0,-1)]
def parse_grid(grid_str):
grid = [list(line) for line in grid_str.split('\n')]
rows, cols = len(grid), len(grid[0])
gpos, gdir = None, None
for r in range(rows):
for c in range(cols):
if grid[r][c] in dir_map:
gpos = (r,c)
gdir = dir_map[grid[r][c]]
grid[r][c] = '.'
break
if gpos is not None:
break
return grid, gpos[0], gpos[1], gdir, rows, cols
def can_move(r,c,d,grid,rows,cols):
nr, nc = r+delta[d][0], c+delta[d][1]
if not (0<=nr<rows and 0<=nc<cols): return True # allow moving outside
return grid[nr][nc] != '#'
def rotate(d): return (d+1)%4
def check_timeloop(grid, gr, gc, gd, rows, cols):
max_iter = rows*cols*4+1
visited = set()
visited.add((gr,gc,gd))
for _ in range(max_iter):
if can_move(gr,gc,gd,grid,rows,cols): gr, gc = gr+delta[gd][0], gc+delta[gd][1]
else: gd = rotate(gd)
if not (0<=gr<rows and 0<=gc<cols): return False
state = (gr,gc,gd)
if state in visited: return True
visited.add(state)
return False # Should never reach here
def solve_1b(grid_str):
grid, gr, gc, gd, rows, cols = parse_grid(grid_str)
empties = [(r,c) for r in range(rows) for c in range(cols) if grid[r][c]=='.' and (r,c)!=(gr,gc)]
count = 0
for (er,ec) in empties:
grid[er][ec] = '#'
if check_timeloop(grid, gr, gc, gd, rows, cols):
count += 1
grid[er][ec] = '.'
return count
from aocd import get_data
inp = get_data(year=2024, day=6)
solve_1b(inp)
@UmerHA
Copy link
Author

UmerHA commented Dec 6, 2024

This is a faster version of https://gist.github.com/UmerHA/3b0d52fbd345f75ba634529d0e7c150e, which doesn't use dicts and classes so heavily.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment