Day 10
This commit is contained in:
parent
b5bca3b9c7
commit
6669ebfb4c
1 changed files with 81 additions and 0 deletions
81
day10.py
Normal file
81
day10.py
Normal file
|
@ -0,0 +1,81 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
trail_map = []
|
||||
|
||||
with open("day10") as f:
|
||||
for l in f:
|
||||
trail_map.append(list(map(int, l.strip())))
|
||||
|
||||
def trail_heads(trail_map):
|
||||
heads = []
|
||||
for y,_ in enumerate(trail_map):
|
||||
for x,_ in enumerate(trail_map[y]):
|
||||
if trail_map[y][x] == 0:
|
||||
heads.append((y,x))
|
||||
return heads
|
||||
|
||||
from copy import copy
|
||||
|
||||
def check_path_dfs(head, trail_map, part2):
|
||||
visited = set()
|
||||
stack = [(head, [head])]
|
||||
|
||||
def is_height(y,x,h):
|
||||
if x<0 or x>=len(trail_map[0]):
|
||||
return False
|
||||
if y<0 or y>=len(trail_map[0]):
|
||||
return False
|
||||
else:
|
||||
return trail_map[y][x] == h
|
||||
|
||||
trails = []
|
||||
visited_trails = []
|
||||
while stack:
|
||||
el_tr = stack.pop()
|
||||
el = el_tr[0]
|
||||
tr = el_tr[1]
|
||||
|
||||
if part2 and tr in visited_trails:
|
||||
continue
|
||||
|
||||
if part2: visited_trails.append(tr)
|
||||
if not part2: visited.add(el)
|
||||
|
||||
el_height = trail_map[el[0]][el[1]]
|
||||
|
||||
if el_height == 9:
|
||||
trails.append(tr)
|
||||
continue
|
||||
|
||||
up = (el[0]-1 , el[1])
|
||||
down = (el[0]+1 , el[1])
|
||||
left = (el[0] , el[1]-1)
|
||||
right = (el[0] , el[1]+1)
|
||||
|
||||
up_ok = up not in visited and is_height(*up, el_height+1)
|
||||
down_ok = down not in visited and is_height(*down, el_height+1)
|
||||
left_ok = left not in visited and is_height(*left, el_height+1)
|
||||
right_ok = right not in visited and is_height(*right, el_height+1)
|
||||
|
||||
if up_ok: stack.append( (up, copy(tr)+[up]) )
|
||||
if down_ok: stack.append( (down, copy(tr)+[down]) )
|
||||
if left_ok: stack.append( (left, copy(tr)+[left]) )
|
||||
if right_ok: stack.append( (right, copy(tr)+[right]) )
|
||||
|
||||
return trails
|
||||
|
||||
|
||||
heads = trail_heads(trail_map)
|
||||
|
||||
res = 0
|
||||
for head in heads:
|
||||
paths = check_path_dfs(head, trail_map, part2=False)
|
||||
res += len(paths)
|
||||
print(res)
|
||||
|
||||
res = 0
|
||||
for head in heads:
|
||||
paths = check_path_dfs(head, trail_map, part2=True)
|
||||
res += len(paths)
|
||||
print(res)
|
||||
|
Loading…
Add table
Reference in a new issue