◂ 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
from itertools import cycle
import math
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]
instructions = lines[0]
directions = dict()
starting_locations = []
for line in lines[2:]:
loc = line[0:3]
if loc.endswith('A'):
starting_locations.append(loc)
directions[loc] = (line[7:10], line[12:15])
def count_steps(loc: str) -> int:
nb_steps = 0
for next_dir in cycle(instructions):
nb_steps += 1
if next_dir == 'L':
loc = directions[loc][0]
else:
loc = directions[loc][1]
if loc.endswith('Z'):
return nb_steps
all_nb_steps = [count_steps(loc) for loc in starting_locations]
""" Grosse grosse arnaque de cette fin de code: rien ne laissait supposer que ça donnerait la bonne réponse.
En effet, pour que le plus petit multiple commun (LCM) fonctionne, il fallait deux conditions:
1) qu'il n'y ait qu'un label '**Z' dans chaque cycle (on pouvait se douter que ça *puisse* être le cas, mais il aurait fallu le vérifier);
2) que les cycles reprennent au bon endroit, à savoir sur le 2e élément de la suite (là où nous envoie les tout premiers endroits).
Cette condition n'avait aucune raison directions'être vraie (sinon de simplifier le calcul de la solution si on le voyait).
Au final, ceux qui comme moi ont tenté le PPMC, à tout hasard ou sans trop réfléchir, avons gagné un temps fou par rapport à ceux
qui avaient implémenté le Théorème des restes chinois.
"""
print("Réponse partie 2:", math.lcm(*all_nb_steps))