diff --git a/2022/python/day17.py b/2022/python/day17.py index 95b166a..2d3b959 100644 --- a/2022/python/day17.py +++ b/2022/python/day17.py @@ -1,7 +1,8 @@ import matrix import shared -from dataclasses import dataclass -from typing import Tuple +from dataclasses import dataclass, field +from functools import cached_property +from typing import Tuple, List import operator @@ -66,30 +67,20 @@ class Shape: @property def coords(self): - actual_coords = [] - for y,x in self.shape[1]: - actual_coords.append((y+self.y,x+self.x)) - return actual_coords + return [ (y+self.y,x+self.x) for y,x in self.shape[1]] -# TODO: check left/right movement into an object def find_highest(shapes, default_height): if not shapes: return default_height - all_y = [] - for s in shapes: - for y,_ in s.coords: - all_y.append(y) - return min(all_y) - -def all_coords(shapes): - coords = set() - for s in shapes: - for c in s.coords: - coords.add(c) - return coords + #return min([y for s in shapes for y,_ in s.coords]) + return min([s.coords[0][0] for s in shapes[-20:]]) + #all_y = [] + #for s in shapes[-20:]: + # all_y.append(s.coords[0][0]) + #return min(all_y) all_coords = set() @@ -119,11 +110,8 @@ def out_of_bounds(height, width, shapes, offset): return False - - -# @shared.profile +@shared.profile def part1(rows): - print(rows) instructions = [r for r in rows] height = 20 height = 2022*4+4 @@ -133,15 +121,14 @@ def part1(rows): rock = 0 shapes = [] spawning = True - while rock < 2022: + while rock < 2022: #1_000_000_000_000: if spawning: + # Add last rock's coords to all coords if shapes: for c in shapes[-1].coords: all_coords.add(c) - if rock % 1000 == 0: - print("Spawn rock #", rock) X = 2 - Y = find_highest(shapes, height) - 4 + Y = find_highest(shapes, height) - 4 shape = Shape(rock=rock, y=Y, x=X, shape=ORDER[rock%len(ORDER)]) shapes.append(shape) spawning = False @@ -158,19 +145,14 @@ def part1(rows): # Try to move right/left - #print(f"Jet of gas pushes {shapes[-1].at_rest_char} rock", next_move) next_offset = OFF[next_move] if not out_of_bounds(height,width, shapes, (0, next_offset[1])) and not collision_at(shapes, next_offset): shapes[-1].x += next_offset[1] - else: - pass - #print("but nothing happens") # check if hit bottom next_offset = (1, next_offset[1]) if out_of_bounds(height, width, shapes, (next_offset[0],0)): - #print("rock comes to rest") # hit bottom dont move down shapes[-1].moving = False spawning = True @@ -185,13 +167,8 @@ def part1(rows): else: # can move down shapes[-1].y += 1 - #print("rock falls one unit") #render(width, height, shapes) - - print(shapes[0], height, shapes[0].coords) - - print("LAST ROCK COUNT", rock+1) print(height - find_highest(shapes, height))