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 transpose avec numpy afin de pouvoir faire les mêmes opérations
    sur les lignes et colonnes.
    Utilisation d'une formule mathématiques plutôt que de parcourir
    toutes les paires de galaxies.
    La distance de Manhattan permet de faire le calcul sur les lignes, puis
    sur les colonnes, de façon indépendante
 """

import numpy, itertools

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

def somme_distances_valeurs(valeurs: list[int]) -> int:
    ecarts = [ vals[1] - vals[0] for vals in itertools.pairwise(valeurs) ]
    return sum( (i+1) * (len(valeurs)-(i+1)) * ecart  for i,ecart in enumerate(ecarts) )

    # Ou directement :
    # return sum( (i+1) * (len(valeurs)-(i+1)) * (valeurs[i+1]-valeurs[i])  for i in range(len(valeurs)-1) )

somme_distances = 0
for _ in range(2):    # On fait les choses pour les lignes, puis les colonnes après transposition
    lines = sum( ( (1 if '#' in line else 2) * [line] for line in lines ), [] )    # Doubler les lignes vides

    indices_y_galaxies = [y  for y,line in enumerate(lines)  for c in line  if c == '#']
    somme_distances += somme_distances_valeurs(indices_y_galaxies)

    lines = numpy.array([list(line) for line in lines]).transpose().tolist()       # Transposer les lignes
    
print("Réponse partie 1:", somme_distances)