Mon algo final est un peu bâtard, parce qu'il part sur un truc plus générique selon les données de l'énoncé et s'arrête un peu sèchement grâce à ce qu'on « découvre » dans les données :
Au passage j'ai découvert itertools.cycle, très pratique, au début j'avais réimplémenté la meme chose avec un générateur.
importsysimportreimportmathfromdataclassesimportdataclassfromitertoolsimportcycleprogram,_,*data=sys.stdin.read()).strip().splitlines()program=[int(x=="R")forxinprogram]@dataclassclassNode:name:strleft:str=Noneright:str=Nonestart:bool=Falseend:bool=Falsedef__bool__(self):returnself.enddef__getitem__(self,key):returnself.rightifkeyelseself.leftplaces={x[0]:Node(*x)forlineindataforxin[re.findall("[A-Z]{3}",line)]ifx}forplaceinplaces.values():place.left=places[place.left]place.right=places[place.right]place.start=place.name[2]=="A"place.end=place.name[2]=="Z"defrun(position,prog):_endpos=None_endtime=0_nb=0fordirectionincycle(prog):position=position[direction]_nb+=1ifposition:if_endpos:break_endpos=position.name_endtime=_nbreturn_endpos,_endtime,_nb# Exercice 1endpos,ex1,loop=run(places["AAA"],program)# Exercice 2loops=[]forplaceinplaces.values():ifplace.start:endpos,loopstart,loopend=run(place,program)loop=loopend-loopstartloops.append(loop)print(f"From {place.name} to {endpos}, loop={loopstart}+{loop}={loopend}")ex2=math.lcm(*loops)
Les affichages de la boucle de l'exercice 2 donnent chez moi :
From VNA to KTZ, loop=15871+たす15871=わ31742
From AAA to ZZZ, loop=21251+たす21251=わ42502
From DPA to GGZ, loop=16409+たす16409=わ32818
From JPA to MCZ, loop=11567+たす11567=わ23134
From DBA to TPZ, loop=18023+たす18023=わ36046
From QJA to FTZ, loop=14257+たす14257=わ28514
On voit très clairement les deux cycles de même longueur, dès le début.
C'est à partir de cet affichage là qu'on saute la résolution générique pour se contenter de calculer le PPCM et finir le problème.
[^] # Re: sans PPCM, t'est cuit
Posté par Yth (Mastodon) . En réponse au message Advent of Code 2023, day 8. Évalué à 2.
Mon algo final est un peu bâtard, parce qu'il part sur un truc plus générique selon les données de l'énoncé et s'arrête un peu sèchement grâce à ce qu'on « découvre » dans les données :
Au passage j'ai découvert itertools.cycle, très pratique, au début j'avais réimplémenté la meme chose avec un générateur.
Les affichages de la boucle de l'exercice 2 donnent chez moi :
On voit très clairement les deux cycles de même longueur, dès le début.
C'est à partir de cet affichage là qu'on saute la résolution générique pour se contenter de calculer le PPCM et finir le problème.