◂ 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…
- code1.py
- code1_optim.py
- 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)