From ad6279089f1e928e58b0dad030d5c3721bbf8437 Mon Sep 17 00:00:00 2001 From: Andrew Ekstedt Date: Tue, 10 Dec 2024 05:49:48 +0000 Subject: [PATCH] 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. :shrug: --- day10/sol.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/day10/sol.py b/day10/sol.py index 9439fdc..63a5331 100644 --- a/day10/sol.py +++ b/day10/sol.py @@ -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]