Advent of code

 11 décembre 2025 

  Reactor : Trouver le nombre de chemins dans un graphe orienté, avec deux points de passage obligés
  1. code.py
from functools import lru_cache

outputs = {}
with open('input.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        tokens = line.strip().split()
        outputs[tokens[0][:-1]] = tokens[1:]

@lru_cache
def compter(pos, to='out'):
    if pos == to:
        return 1
    return sum(compter(v, to) for v in outputs.get(pos, []))     # ou outputs[pos] si outputs = collections.defaultdict(list)


### Partie 1 ###
print("Réponse partie 1:", compter('you'))


### Partie 2 ###
rep2 =   compter('svr', 'fft') * compter('fft', 'dac') * compter('dac', 'out') \
       + compter('svr', 'dac') * compter('dac', 'fft') * compter('fft', 'out')
print("Réponse partie 2:", rep2)


#### Partie 2 optimisée, mais aucun besoin au vu de la rapidité du code précédent: ####
rep2 = 0
for stop1, stop2 in (('fft', 'dac'), ('dac', 'fft')):
    nb_intermed = compter(stop1, stop2)
    if nb_intermed:
        rep2 += compter('svr', stop1) * nb_intermed * compter(stop2, 'out')
print("Réponse partie 2:", rep2)