Sans surprise, j'ai implémenté un CPU selon les spécifications fournies. Mais pour ce qui est de faire quelque chose à partir des états qu'il atteint à des cycles donnés, je me suis amusé à y introduire ce que j'ai appelé un débogueur, je vous laisse découvrir ça.
importiofromenumimportEnumfromtypingimportCallable,Iterable,Iterator,List,Optional,TupleclassOperation(Enum):addx=('addx',1,2)noop=('noop',0,1)def__init__(self,word:str,nargs:int,cycles:int)->None:self.word=wordself.nargs=nargsself.cycles=cyclesclassInstruction:def__init__(self,op:Operation,*args:int)->None:self.op=opiflen(args)!=op.nargs:raiseValueError("operator {} expect {} arguments".format(op,op.nargs))self.args=argsclassCPU:def__init__(self,program:Iterable[Instruction],debug:Optional[Callable[[int,int],None]]=None)->None:self.X=1self.cycle=1self.program=programself.debug=debugdef_apply(self,instruction:Instruction)->None:ifinstruction.opisOperation.addx:self.X+=instruction.args[0]elifinstruction.opisOperation.noop:passdef_cycle(self)->None:ifself.debugisnotNone:self.debug(self.cycle,self.X)self.cycle+=1defrun(self)->None:last_instruction=Noneforinstructioninself.program:for_inrange(instruction.op.cycles):self._cycle()self._apply(instruction)defimport_program(lines:Iterable[str])->Iterator[Instruction]:forlineinlines:words=line.split()op=Operation[words[0]]args=[int(word)forwordinwords[1:]]yieldInstruction(op,*args)classStrengthSum:def__init__(self)->None:self.strength=0def__call__(self,cycle:int,value:int)->None:ifcyclein(20,60,100,140,180,220):self.strength+=cycle*valueclassCRTDrawer:def__init__(self)->None:self.crt=io.StringIO()@staticmethoddefposition(cycle:int)->int:return(cycle-1)%40def__call__(self,cycle:int,value:int)->None:position=self.position(cycle)ifposition==0:self.crt.write('\n')ifvalue-1<=position<=value+1:self.crt.write('█')else:self.crt.write(' ')classMultiDebug:def__init__(self,*debugs:Callable[[int,int],None])->None:self.debugs=debugsdef__call__(self,cycle:int,value:int)->None:fordebuginself.debugs:debug(cycle,value)defsolve_both(lines:Iterable[str])->Tuple[int,str]:"""Solve part 1 of today's puzzle"""program=import_program(lines)strength_report=StrengthSum()crt_drawer=CRTDrawer()cpu=CPU(program,debug=MultiDebug(strength_report,crt_drawer))cpu.run()returnstrength_report.strength,crt_drawer.crt.getvalue()
# En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 10. Évalué à 5. Dernière modification le 10 décembre 2022 à 13:03.
Sans surprise, j'ai implémenté un CPU selon les spécifications fournies. Mais pour ce qui est de faire quelque chose à partir des états qu'il atteint à des cycles donnés, je me suis amusé à y introduire ce que j'ai appelé un débogueur, je vous laisse découvrir ça.