day14 make it go fasterrr
This commit is contained in:
parent
1741640930
commit
17652da8ee
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,6 +4,7 @@ gif-*
|
||||
|
||||
### Python ###
|
||||
# Byte-compiled / optimized / DLL files
|
||||
profile.out
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
@ -7,15 +7,6 @@ import functools
|
||||
SAND_START = [0,500]
|
||||
|
||||
|
||||
def get_lines(rows):
|
||||
_rows = []
|
||||
for row in rows:
|
||||
_row = []
|
||||
for point in row.split(" -> "):
|
||||
_row.append(list(reversed(list(map(int, point.split(","))))))
|
||||
_rows.append(_row)
|
||||
return _rows
|
||||
|
||||
def find_bounds(lines):
|
||||
x = []
|
||||
y = []
|
||||
@ -32,7 +23,7 @@ def part1(rows):
|
||||
d = sand[1]
|
||||
dr = sand[1]+1
|
||||
return next_y, (dl,d,dr)
|
||||
lines = get_lines(rows)
|
||||
lines = [[list(reversed(list(map(int, point.split(","))))) for point in row.split(" -> ")] for row in rows]
|
||||
(minY,maxY), (minX,maxX) = find_bounds(lines)
|
||||
mx = matrix.matrix_of_size(maxX+2,maxY+2)
|
||||
walls = []
|
||||
@ -82,55 +73,52 @@ def part1(rows):
|
||||
print("done", sand_grains)
|
||||
|
||||
|
||||
@shared.profile
|
||||
def part2(rows):
|
||||
def get_next(sand):
|
||||
next_y = sand[0]+1
|
||||
dl = sand[1]-1
|
||||
d = sand[1]
|
||||
dr = sand[1]+1
|
||||
return next_y, (dl,d,dr)
|
||||
def check_air(y,x):
|
||||
if y == floor:
|
||||
return False
|
||||
if (y,x) in walls:
|
||||
return False
|
||||
return True
|
||||
|
||||
lines = get_lines(rows)
|
||||
lines = [[list(reversed(list(map(int, point.split(","))))) for point in row.split(" -> ")] for row in rows]
|
||||
(minY,maxY), (minX,maxX) = find_bounds(lines)
|
||||
walls = set()
|
||||
walls = {}
|
||||
_between_points = matrix.coords_between_points
|
||||
for line in lines:
|
||||
for x in range(len(line)-1):
|
||||
coords = matrix.coords_between_points(line[x], line[x+1])
|
||||
for c in coords:
|
||||
walls.add(c)
|
||||
walls[c] = "#"
|
||||
for y,x in walls:
|
||||
walls.add((y,x))
|
||||
walls[(y,x)] = "#"# .add((y,x))
|
||||
floor = maxY + 2
|
||||
|
||||
sand_grains = -1
|
||||
while True:
|
||||
sand_grains += 1
|
||||
sand = [0,500]
|
||||
|
||||
if tuple(sand) in walls:
|
||||
print("done", sand_grains)
|
||||
break
|
||||
|
||||
while True:
|
||||
next_y, (dl, d, dr) = get_next(sand)
|
||||
if check_air(next_y, d):
|
||||
next_y = sand[0]+1
|
||||
dl = sand[1]-1
|
||||
dr = sand[1]+1
|
||||
if next_y == floor:
|
||||
# hit the floor
|
||||
walls[tuple(sand)] = "#" # Draw stop
|
||||
break
|
||||
|
||||
elif (next_y, sand[1]) not in walls:
|
||||
sand[0] = next_y
|
||||
elif check_air(next_y,dl):
|
||||
elif (next_y, dl) not in walls:
|
||||
sand[0] = next_y
|
||||
sand[1] = dl
|
||||
elif check_air(next_y, dr):
|
||||
elif (next_y, dr) not in walls:
|
||||
sand[0] = next_y
|
||||
sand[1] = dr
|
||||
|
||||
else:
|
||||
walls.add(tuple(sand))
|
||||
# Hit something flat
|
||||
walls[tuple(sand)] = "#"
|
||||
break
|
||||
#matrix.view_matrix(mx, 0,minX-1, maxY+3,maxX+2)
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
rows = [row for row in shared.load_rows(14)]
|
||||
|
@ -1,6 +1,26 @@
|
||||
from contextlib import contextmanager
|
||||
from timeit import default_timer
|
||||
from pathlib import Path
|
||||
import cProfile
|
||||
import functools
|
||||
import pstats
|
||||
|
||||
def profile(func):
|
||||
|
||||
@functools.wraps(func)
|
||||
def inner(*args, **kwargs):
|
||||
profiler = cProfile.Profile()
|
||||
profiler.enable()
|
||||
try:
|
||||
retval = func(*args, **kwargs)
|
||||
finally:
|
||||
profiler.disable()
|
||||
with open('profile.out', 'w') as profile_file:
|
||||
stats = pstats.Stats(profiler, stream=profile_file)
|
||||
stats.print_stats()
|
||||
return retval
|
||||
|
||||
return inner
|
||||
|
||||
spl = lambda y: [int(w) for w in y]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user