Advent of code

 8 décembre 2023 

  Haunted Wasteland : Parcourir un chemin selon des instructions gauche/droite
LRLRLLRRLLRRLR
   
  
   
LFM = (PCJ, GQH)
   
THP = (SPP, MKB)
   
PBL = (VVX, JMM)
   
        
Bêtement pas parti du bon endroit et j'arrivais dans une boucle infinie. J'ai donc passé une heure à optimiser mon code hyper intelligemment pour qu'il soit mille fois plus rapide. Mais infini divisé par mille…
  1. code1.py
  2. code1_optim.py
  3. code2.py
"""
Code optimisé avec:
 *  Des indices de tableau pour remplacer les noms des nœuds, afin d'éviter l'usage d'un dictionnaire
    Gain de temps: 30% si les données étaient en grand nombre.
 *  Un remplacement des instructions 'L' et 'R' par des indices 0 et 1, afin d'éviter un if
    Gain de temps: 20% si les données étaient en grand nombre.
Ici, le programme mettant surtout du temps à parser les données (50ms), l'optimisation (qui nous fait gagner 1ms) est négligeable.
"""

from itertools import cycle
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

instructions = [ 0  if c == 'L' else  1  for c in lines[0]]

directions = len(lines) * [None]

labels_indexes = {}
def label_to_index(label: str) -> int :
    return labels_indexes.setdefault(label, len(labels_indexes))

for line in lines[2:]:
    directions[ label_to_index(line[0:3]) ]  =  ( label_to_index(line[7:10]),  label_to_index(line[12:15]) )

location = label_to_index('AAA')
the_end  = label_to_index('ZZZ')
nb_steps = 0
for next_dir in cycle(instructions):
    nb_steps += 1
    location = directions[location][next_dir]
    if location == the_end:
        break


print("Réponse partie 1:", nb_steps)