Advent of code

 16 décembre 2022 

  Proboscidea Volcanium : Ouvrir des vannes dans un réseaux dans l'ordre optimal
Valve RO has flow rate=5; tunnels lead to valves NO, FD, QV, BV
   
 Valve GT has flow rate=0; tunn
   
                               
  1. graphe.png
  2. code.py
  3. codePartie1_ancienAlgo.py
  4. codePartie2_tropLent.py
### Partie 1 uniquement, trop lent pour adapter en partie 2, même si le défi est intéressant 
from functools import cache

f = open("input.txt", 'r')
lines = [line[:-1] for line in f.readlines()]

START = 'AA'
TEMPS = 30

VANNES = []
debits = []
for line in lines:
  tokens = line.split()
  vanne = tokens[1]
  debit = int(tokens[4][5:-1])
  VANNES.append(vanne)
  debits.append(debit)
debits = tuple(debits)

tunnels = []
for line in lines:
  tokens = line.split()
  vanne = tokens[1]
  vannesTunnels = list(map(lambda s:VANNES.index(s), map(lambda s: s[-1]==',' and s[:-1] or s, tokens[9:])))
  tunnels.append(vannesTunnels)

@cache
def meilleurDebit(position, debits, tempsRestant, comeFrom=None):
    if tempsRestant <= 0:
        return 0
    meilleur = 0

    # pas tourner vanne
    for acces in tunnels[position]:
        if acces == comeFrom:
            continue
        meilleur = max(meilleur, meilleurDebit(acces, debits, tempsRestant - 1, position))

    # tourner vanne
    if debits[position] != 0:
        debitSupplementaire = debits[position] * (tempsRestant-1)
        debits = list(debits[:])
        debits[position] = 0   # ne pas rouvrir la vanne plus tard
        debits = tuple(debits)
        for acces in tunnels[position]:
            meilleur = max(meilleur, debitSupplementaire + meilleurDebit(acces, debits, tempsRestant - 2))

    return meilleur

print("Réponse partie 1:", meilleurDebit(VANNES.index(START), debits, TEMPS))