Day 15 (speedup)

This commit is contained in:
Sebastian Seedorf
2021-12-16 10:03:16 +01:00
parent 93e009c5a8
commit 18c76f694b
2 changed files with 39 additions and 32 deletions

View File

@@ -4,22 +4,25 @@ import heapq
import numpy as np import numpy as np
arr = np.array([[int(n) for n in line.strip()] for line in open("input.txt")]) arr = np.array([[int(n) for n in line.strip()] for line in open("input.txt")])
arr = np.pad(arr, (1, 1), 'constant', constant_values=(9999,))
open_list = [(arr[1, 1], (1, 1))] open_list = [(arr[0, 0], (0, 0))]
closed_list = np.zeros_like(arr) closed_list = set()
target = arr[:-2, :-2].shape target = ty, tx = arr[:-1, :-1].shape
while len(open_list): while len(open_list):
val, (y, x) = heapq.heappop(open_list) val, curr = heapq.heappop(open_list)
if (y, x) == target: if curr in closed_list:
print(val - arr[1, 1])
break
if closed_list[y, x] != 0:
continue continue
closed_list[y, x] = val if curr == target:
for yn, xn in [(1, 0), (-1, 0), (0, 1), (0, -1)]: print(val - arr[0, 0])
if closed_list[y+yn, x+xn] == 0: break
heapq.heappush(open_list, (arr[y+yn, x+xn]+val, (y+yn, x+xn))) y, x = curr
closed_list.add(curr)
print(np.sum(closed_list[1:-1, 1:-1] != 0), arr[1:-1, 1:-1].shape[0]*arr[1:-1, 1:-1].shape[1]) if 0 < y and (nxt := (y-1, x)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if 0 < x and (nxt := (y, x-1)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if ty > y and (nxt := (y+1, x)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if tx > x and (nxt := (y, x+1)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))

View File

@@ -3,25 +3,29 @@ import heapq
import numpy as np import numpy as np
arr = np.array([[int(n) for n in line.strip()] for line in open("input.txt")]) arr = np.array([[int(n) for n in line.strip()] for line in open("input.txt")], dtype='int16')
add = np.repeat(np.repeat([list(range(i, i+5)) for i in range(5)], arr.shape[0], axis=0), arr.shape[1], axis=1) add = np.array([list(range(i, i+5)) for i in range(5)], dtype='int16')
add = np.repeat(np.repeat(add, arr.shape[0], axis=0), arr.shape[1], axis=1)
arr = (np.tile(arr, (5, 5)) + add - 1) % 9 + 1 arr = (np.tile(arr, (5, 5)) + add - 1) % 9 + 1
arr = np.pad(arr, (1, 1), 'constant', constant_values=(9999,))
open_list = [(arr[1, 1], (1, 1))] open_list = [(arr[0, 0], (0, 0))]
closed_list = np.zeros_like(arr) closed_list = set()
target = arr[:-2, :-2].shape target = ty, tx = arr[:-1, :-1].shape
while len(open_list): while len(open_list):
val, (y, x) = heapq.heappop(open_list) val, curr = heapq.heappop(open_list)
if (y, x) == target: if curr in closed_list:
print(val - arr[1, 1])
break
if closed_list[y, x] != 0:
continue continue
closed_list[y, x] = val if curr == target:
for yn, xn in [(1, 0), (-1, 0), (0, 1), (0, -1)]: print(val - arr[0, 0])
if closed_list[y+yn, x+xn] == 0: break
heapq.heappush(open_list, (arr[y+yn, x+xn]+val, (y+yn, x+xn))) y, x = curr
closed_list.add(curr)
print(np.sum(closed_list[1:-1, 1:-1] != 0), arr[1:-1, 1:-1].shape[0]*arr[1:-1, 1:-1].shape[1]) if 0 < y and (nxt := (y-1, x)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if 0 < x and (nxt := (y, x-1)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if ty > y and (nxt := (y+1, x)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))
if tx > x and (nxt := (y, x+1)) not in closed_list:
heapq.heappush(open_list, (arr[nxt] + val, nxt))