Created
December 6, 2024 22:38
-
-
Save UmerHA/c16079dfad62174f2c5c4060bc6956c2 to your computer and use it in GitHub Desktop.
aoc_2024_6b
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is a faster version of https://gist.github.com/UmerHA/3b0d52fbd345f75ba634529d0e7c150e, which doesn't use dicts and classes so heavily.