day 10 optimizations

- reduce duplicate queue entries by not appending to the queue if a
  point has a nonzero count. (if there's a count then it must have
  already been queued.)

- use the correct data structure for a double-ended queue so pop(0) has
  less work to do

- factor out the list of summits

of these three changes, only the last one has any noticable effect
on the run time. 🤷
main
magical 2024-12-10 05:49:48 +00:00
parent 4634b831ea
commit ad6279089f
1 changed files with 8 additions and 6 deletions

View File

@ -1,5 +1,5 @@
import itertools
from collections import Counter
from collections import Counter, deque
def read(file):
return [line.strip() for line in file]
@ -18,20 +18,22 @@ def solve(file):
c = get(x,y)
if c == h:
assert (x,y) not in done
queue.append((x,y))
if (x,y) not in count:
queue.append((x,y))
count[x,y] += n
trailheads = [(x,y) for x,y in points() if get(x,y) == '0']
summits = [(x,y) for x,y in points() if get(x,y) == '9']
t1 = 0
t2 = 0
for p in trailheads:
queue = [p]
queue = deque([p])
done = set()
count = Counter()
count[p] = 1
while queue:
x,y = queue.pop(0)
x,y = queue.popleft()
#print(x,y,queue)
if (x,y) in done:
continue
@ -44,8 +46,8 @@ def solve(file):
visit(x-1,y,h,n)
visit(x,y+1,h,n)
visit(x,y-1,h,n)
for x,y in points():
if get(x,y) == '9' and (x,y) in done:
for x,y in summits:
if (x,y) in done:
t1 += 1
t2 += count[x,y]