◂ 17 décembre 2022 ▸
Pyroclastic Flow : Tetris: calculer la hauteur finale d'une chute de pierres
>>><<>>><<<>>>><<>>><<<<>>>><<<>>>><<<>>><<<<>><<><>><<<>>>><<< …
- codePartie1.py
- code.py
- amelioration_estLibre.diffy
- visualisation.txt
- visualisationTerminalCouleurs.png
- couleurs.diffy
from itertools import cycle
f = open("input.txt", 'r')
lines = [line[:-1] for line in f.readlines()]
JETS = lines[0]
NB_COLONNES = 7
VIDE = ' '
NB_PIERRES = 2022
TYPES_PIERRES = '-+LIO'
MOUVEMENTS = {'>':1, '<':-1}
HAUTEURS_PIECES = {'-':1, '+':3, 'L':3, 'I':4, 'O':2}
PIECES = {
'-':((0,0),(1,0),(2,0),(3,0)),
'+':((1,0),(0,1),(1,1),(2,1),(1,2)),
'L':((0,0),(1,0),(2,0),(2,1),(2,2)),
'I':((0,0),(0,1),(0,2),(0,3)),
'O':((0,0),(0,1),(1,0),(1,1)),
}
mur = [ NB_COLONNES*[VIDE] for _ in range(5*NB_PIERRES) ]
mur[0] = NB_COLONNES * '#' # plancher à hauteur 0
hauteurAtteinte = 0 # plancher
def estLibre(typePierre, px, py, mur):
for (dx,dy) in PIECES[typePierre]:
nx = px+dx
ny = py+dy
if nx < 0 or nx >= NB_COLONNES or mur[ny][nx] != VIDE:
return False
return True
def placer(typePierre, mur, px, py):
for (dx,dy) in PIECES[typePierre]:
mur[py + dy][px + dx] = typePierre
cycle_typesPierres = cycle(TYPES_PIERRES) # '-', '+', 'L', 'I', 'O', '-', '+'…
cycle_indexJets = cycle(range(len(JETS))) # 0, 1, 2, …, 0, 1, 2, … /depuis le temps que j'attendais de pouvoir utiliser itertools.cycle :)
for _ in range(NB_PIERRES):
typePierre = next(cycle_typesPierres)
posX = 2 # coin en bas à gauche
posY = hauteurAtteinte + 4
rienDessous = True
while rienDessous:
indiceJet = next(cycle_indexJets)
if estLibre(typePierre, posX + MOUVEMENTS[JETS[indiceJet]], posY, mur):
posX += MOUVEMENTS[JETS[indiceJet]]
if estLibre(typePierre, posX, posY-1, mur):
posY -= 1
else:
rienDessous = False
placer(typePierre, mur, posX, posY)
hauteurAtteinte = max(hauteurAtteinte, posY + HAUTEURS_PIECES[typePierre] - 1)
print("Réponse partie 1:", hauteurAtteinte)