Advent of code

 14 décembre 2023 

  Parabolic Reflector Dish : Faire glisser des cailloux dans 4 directions successives
...O.....#O#...
   
#OO..O.##..#...
   
.###..O.#...O.#
   
O.O......OO.O#.
   
.#....#.O#...O.
   
.#.....O..#...#
   
        
  1. code.py
  2. code_optim_deplacer_cailloux.py
  3. code_oneLiners_lievreTortue.py
  4. code_numpy.py

""" Ancienne fonction qui déplace caillou par caillou """

def ligne_penchee_a_gauche(ligne: MutableSequence[str]) -> MutableSequence[str]:
    for c in range(len(ligne)):
        if ligne[c] == "O":
            ligne[c] = "."
            for i in range(c,-1,-1):
                if i == 0 or not ligne[i-1] == ".":
                    ligne[i] = "O"
                    break
    return ligne




""" Nouvelle fonction qui recrée chaque segment entre les "#" à partir du nombre de cailloux ronds
    Elle peut prendre directement un string, puisqu'on ne modifie pas la ligne petit à petit. La grille est alors une liste de strings. """

def ligne_penchee_a_gauche(ligne: str) -> str:
    return "#".join( [ (nb:=token.count("O")) * "O"  +  (len(token)-nb) * "."
                       for token in  ligne.split("#") ] )