--- Day 17: Pyroclastic Flow ---

mail@pastecode.io avatar
unknown
python
2 years ago
2.3 kB
88
Indexable
Never
import copy

data = []
with open("testInput", "r") as file:
    for line in file:
        data.append(line.strip())

def moveLeft(shape: list):
    for point in shape:
        point[1] -= 1
def moveRight(shape: list):
    for point in shape:
        point[1] += 1
def moveDown(shape: list):
    for point in shape:
        point[0] -= 1
def moveUp(shape: list):
    for point in shape:
        point[0] += 1

def adjustPosition(shape: list, topPosition: int, k: int):
    for point in shape:
        point[0] += (topPosition + k)
    return shape

def checkCollision(shape: list, fullPicture):
    for point in shape:
        point = (point[0],point[1])
        if point in fullPicture:
            return True
        if point[1]<0 or point[1]>6:
            return True
        if point[0]<0:
            return True
    return False

shapes = [
    [[0,2],[0,3],[0,4],[0,5]],
    [[0,3],[1,2],[1,3],[1,4],[2,3]],
    [[0,2],[0,3],[0,4],[1,4],[2,4]],
    [[0,2], [1,2], [2,2], [3,2]],
    [[0,2], [1,2], [0,3], [1,3]]
]

fullPicture = set()
currentShape = 0
top = 0
fallingShape = list(shapes[currentShape])
adjustPosition(fallingShape, top, 3)
stoppedRocks = 0

windPattern = data[0]

currentWind = 0
debug = False

while True:
    dir = windPattern[currentWind]

    currentWind = (currentWind + 1) % len(windPattern)
    match dir:
        case '>':
            moveRight(fallingShape)
            if checkCollision(fallingShape, fullPicture):
                moveLeft(fallingShape)

        case '<':
            moveLeft(fallingShape)
            if checkCollision(fallingShape, fullPicture):
                moveRight(fallingShape)

    moveDown(fallingShape)
    if checkCollision(fallingShape, fullPicture):
        moveUp(fallingShape)
        stoppedRocks += 1
        top = max( max([x[0] for x in fallingShape]), top )

        if stoppedRocks == 2022:
            print(top+1) # answer
            break
        
        for point in fallingShape:
            fullPicture.add((point[0], point[1]))

        currentShape = (currentShape + 1) % 5
        fallingShape = copy.deepcopy(shapes[currentShape])
        adjustPosition(fallingShape, top, 4)