Advent of code

 11 décembre 2023 

  Cosmic Expansion : Compter des distances de Manhattan entre des points avec lignes/colonnes vides à démultiplier
..........................
   
..........#.....#.........
   
.......................#..
   
             
  1. code1.py
  2. code1_maths.py
  3. code2.py
  4. code2_maths.py
""" On pourrait bien entendu utiliser le code de la partie 2
    en utilisant un facteur ×2 au lieu de ×1'000'000
    Mais c'est sympa de faire le code qui ajoute des lignes.
 """

import itertools

f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]


indices_y_a_multiplier = [ y  for y,line in enumerate(lines)  if not '#' in line ]
for y in indices_y_a_multiplier[::-1]:   # depuis la fin pour ne pas décaler les indices
    lines.insert(y, len(lines[0]) * '.')

indices_x_a_multiplier = [ x  for x in range(len(lines[0]))  if  all(line[x]=='.' for line in lines) ]
for x in indices_x_a_multiplier[::-1]:   # idem, depuis la fin
    lines = [ line[:x] + '.' + line[x:] for line in lines ]

galaxies = [ (x,y) for y in range(len(lines)) for x in range(len(lines[0])) if lines[y][x] == '#' ]

def dist_manhattan(p1: list[int,int], p2: list[int,int]) -> int:
    return sum( abs(p1[i] - p2[i]) for i in (0,1) )

somme_distances = sum( dist_manhattan(galaxie1, galaxie2) 
                       for (galaxie1, galaxie2) in  itertools.combinations(galaxies, 2) )
print("Réponse partie 1:", somme_distances)




##### alternatives #####
indices_x_a_multiplier = [ x  for x in range(len(lines[0]))  if '#' not in [line[x] for line in lines] ]