Advent of code

 4 décembre 2023 

  Scratchcards : Trouver des nombres gagnants sur des cartes à gratter et gagner de nouvelles cartes
Card   1: 33 56 23 64 92 86 94  7 59 13 | 86 92 64 43 10 70 16 55 79 33 56  8  7 25 82 14 31
   
Card   2: 61 66 75  1 27 38 93 90 34 43 | 94 46 
   
                                               
  1. code1.py
  2. code2.py
  3. code2_optim.py
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

def nb_num_gagnants(line:str) -> int :
    tokens = line.split()
    sep_indice = tokens.index('|')
    tirage: set[int] = set(map(int, tokens[2:sep_indice]))
    coches: set[int] = set(map(int, tokens[sep_indice+1:]))
    return len(tirage.intersection(coches))

# Créer la liste des indices (et non numéro !) des cartes gagnées pour chaque carte
indices_gains: list[tuple[int,...]] = []  
num_indice = -1
for line in lines:
    num_indice += 1
    nb_ok = nb_num_gagnants(line)    
    indices_gains.append(tuple(range(num_indice + 1, num_indice + nb_ok + 1)))

# Compter les cartes gagnantes, de façon récursive
nb_cartes = 0
indices_cartes: list[int] = list(range(len(indices_gains)))
while len(indices_cartes) > 0:
    nb_cartes += 1
    indices_cartes.extend(indices_gains[indices_cartes.pop()])

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