◂ 11 décembre 2023 ▸
Cosmic Expansion : Compter des distances de Manhattan entre des points avec lignes/colonnes vides à démultiplier
.......................... …
..........#.....#......... …
.......................#.. …
⋮
- code1.py
- code1_maths.py
- code2.py
- 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)