Advent of code

 17 décembre 2022 

  Pyroclastic Flow : Tetris: calculer la hauteur finale d'une chute de pierres
>>><<>>><<<>>>><<>>><<<<>>>><<<>>>><<<>>><<<<>><<><>><<<>>>><<<
  1. codePartie1.py
  2. code.py
  3. amelioration_estLibre.diffy
  4. visualisation.txt
  5. visualisationTerminalCouleurs.png
  6. 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)