Advent of code

 3 décembre 2023 

  Gear Ratios : Trouver des nombres qui touchent des symboles dans une grille
..172...................
   
..........*.......712...
   
.......823.835......%...
   
            
Mon algo pour la partie 2 est plus compliqué que nécessaire. Il suffit d'avoir un tableau qui compte le nombre de chaque carte, et d'augmenter au fur et à mesure qu'on les passe en revue.
  1. code1.py
  2. code1_bordSeulement.py
  3. code2.py
  4. code2_court.py
  5. code2_depuis_gears_plutot_que_nombres.py
import re
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

HEIGHT = len(lines)
WIDTH  = len(lines[0])

def liste_gears_touchant(lines: list[str], y: int, x1: int, x2: int) -> list[tuple[int,int]]:
    """Retourne une liste de coordonnées des symboles '*' qui touchent le nombre"""
    liste_coord = []
    # On peut parcourir le rectangle entier contenant le nombre et pas
    # que le bord qui l'entoure, puisque les chiffres du nombre ne seront
    # pas considérés comme symbole
    for h in range(max(0,y-1), min(y+2,HEIGHT)):
        for w in range(max(0,x1-1), min(x2+1,WIDTH)):
            if lines[h][w] == '*':
                liste_coord.append((h,w))
    return liste_coord


# Liste des nombres qui touchent chaque gear '*'
gears_numbers: dict[tuple[int,int], list[int]] = dict()

for y, line in enumerate(lines):
    for num in re.finditer('[0-9]+', line):
        for gear_coord in liste_gears_touchant(lines, y, *num.span()):
            gears_numbers.setdefault(gear_coord, []).append(int(num.group()))

somme_gear_ratios = 0
for gear_numbers in gears_numbers.values():
    if len(gear_numbers) == 2:
        somme_gear_ratios += gear_numbers[0] * gear_numbers[1]   

print("Réponse partie 2:", somme_gear_ratios)