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
#### 20 fois plus rapide que le code de base
#### (mais 50% plus lent si on appelle la fonction récursive sans la mettre en cache)

from functools import lru_cache
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)))


@lru_cache
def nb_cartes_gagnees(indice_carte):
    return 1 + sum(nb_cartes_gagnees(i) for i in indices_gains[indice_carte])

nb_cartes = sum(nb_cartes_gagnees(i) for i in range(len(indices_gains)))

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