day 18 part 2
parent
16637ab722
commit
cc853a4dcd
|
@ -28,8 +28,8 @@ def search(start, is_goal, neighbors, heuristic=None, worst=None):
|
||||||
done[this] = (cost_so_far, prev)
|
done[this] = (cost_so_far, prev)
|
||||||
|
|
||||||
if is_goal(this):
|
if is_goal(this):
|
||||||
print("astar: visited", len(done), "nodes")
|
#print("astar: visited", len(done), "nodes")
|
||||||
print("astar: pending", len(q), "nodes")
|
#print("astar: pending", len(q), "nodes")
|
||||||
# reconsruct the path
|
# reconsruct the path
|
||||||
n = this
|
n = this
|
||||||
path = []
|
path = []
|
||||||
|
|
73
day18/sol.py
73
day18/sol.py
|
@ -7,41 +7,54 @@ def parse(file):
|
||||||
for line in file
|
for line in file
|
||||||
]
|
]
|
||||||
|
|
||||||
def solve(file, N=70, T=1024):
|
def solve(file, N=71, T=1024):
|
||||||
falling = parse(file)
|
falling = parse(file)
|
||||||
|
|
||||||
start = (0,0,0) # x,y,t
|
|
||||||
|
|
||||||
map = [[0]*N for _ in range(N)]
|
|
||||||
inf = float('inf')
|
inf = float('inf')
|
||||||
|
map = [[0]*N for _ in range(N)]
|
||||||
map = defaultdict(lambda: inf)
|
map = defaultdict(lambda: inf)
|
||||||
for t,p in enumerate(falling):
|
for i,p in enumerate(falling):
|
||||||
map[p] = t
|
map[p] = i
|
||||||
|
sol = _solve(map, N, T)
|
||||||
def neighbors(n):
|
|
||||||
x,y,t = n
|
|
||||||
#if T < map[x,y]:
|
|
||||||
# can't move out of a blocked space
|
|
||||||
# return []
|
|
||||||
def push(x,y,t):
|
|
||||||
if 0 <= x < N and 0 <= y < N:
|
|
||||||
if T <= map[x,y]:
|
|
||||||
out.append((1,(x,y,t)))
|
|
||||||
out = []
|
|
||||||
push(x+1,y,t+1)
|
|
||||||
push(x,y+1,t+1)
|
|
||||||
push(x-1,y,t+1)
|
|
||||||
push(x,y-1,t+1)
|
|
||||||
return out
|
|
||||||
|
|
||||||
end = N-1, N-1
|
|
||||||
def isgoal(n):
|
|
||||||
x,y,_ = n
|
|
||||||
return (x,y) == end
|
|
||||||
|
|
||||||
sol = astar.search(start, isgoal, neighbors)
|
|
||||||
print(sol)
|
print(sol)
|
||||||
print(len(sol[-1])-1)
|
print(len(sol[-1])-1)
|
||||||
|
|
||||||
|
def _solve(map, N=71, T=1024):
|
||||||
|
start = (0,0) # x,y,t
|
||||||
|
|
||||||
|
def neighbors(n):
|
||||||
|
x,y = n
|
||||||
|
def push(x,y):
|
||||||
|
if 0 <= x < N and 0 <= y < N:
|
||||||
|
if T <= map[x,y]:
|
||||||
|
out.append((1,(x,y)))
|
||||||
|
out = []
|
||||||
|
push(x+1,y)
|
||||||
|
push(x,y+1)
|
||||||
|
push(x-1,y)
|
||||||
|
push(x,y-1)
|
||||||
|
return out
|
||||||
|
|
||||||
|
end = N-1, N-1
|
||||||
|
|
||||||
|
def heuristic(n):
|
||||||
|
return abs(end[0] - n[0]) + abs(end[1] - n[1])
|
||||||
|
|
||||||
|
return astar.search(start, end, neighbors, heuristic)
|
||||||
|
|
||||||
|
import math
|
||||||
|
def solve2(file, N=71, T=1024):
|
||||||
|
falling = parse(file)
|
||||||
|
inf = float('inf')
|
||||||
|
map = [[0]*N for _ in range(N)]
|
||||||
|
map = defaultdict(lambda: inf)
|
||||||
|
for i,p in enumerate(falling):
|
||||||
|
map[p] = i
|
||||||
|
sol = _solve(map, N, i+1)
|
||||||
|
if math.isinf(sol[0]):
|
||||||
|
print(p)
|
||||||
|
break
|
||||||
|
|
||||||
solve(open("sample1.in"), N=7, T=12)
|
solve(open("sample1.in"), N=7, T=12)
|
||||||
|
solve2(open("sample1.in"), N=7, T=12)
|
||||||
solve(open("input"), N=71, T=1024)
|
solve(open("input"), N=71, T=1024)
|
||||||
|
solve2(open("input"), N=71, T=1024)
|
||||||
|
|
Loading…
Reference in New Issue