--- Day 17: Pyroclastic Flow ---
unknown
python
3 years ago
2.3 kB
102
Indexable
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)
Editor is loading...