Posté par Yth (Mastodon) .
En réponse au message Avent du Code, jour 23.
Évalué à 2.
Dernière modification le 23 décembre 2022 à 13:34.
@dataclass(frozen=True)classDirection:# Sur-modélisation de la directiond:int@classmethoddefinit(cls):cls.N=Direction(0)cls.S=Direction(1)cls.W=Direction(2)cls.E=Direction(3)return[cls.N,cls.S,cls.W,cls.E]@classmethod@cachedefget(cls,d):returncls.init()[d%4]@cached_propertydefnext(self):returnDirection.get(self.d+1)def__str__(self):return"NSWE"[self.d]classElf(tuple):# Modélisation failsafe d'une position d'elfe.@cached_propertydefcol(self):returnself[0]@cached_propertydefrow(self):returnself[1]@cached_propertydefenw(self):returnElf((self.col-1,self.row-1))@cached_propertydefen(self):returnElf((self.col,self.row-1))@cached_propertydefene(self):returnElf((self.col+1,self.row-1))@cached_propertydefew(self):returnElf((self.col-1,self.row))@cached_propertydefee(self):returnElf((self.col+1,self.row))@cached_propertydefesw(self):returnElf((self.col-1,self.row+1))@cached_propertydefes(self):returnElf((self.col,self.row+1))@cached_propertydefese(self):returnElf((self.col+1,self.row+1))@cached_propertydefaround(self):return{self.enw,self.en,self.ene,self.ew,self.ee,self.esw,self.es,self.ese}@cached_propertydefN(self):return{self.enw,self.en,self.ene}@cached_propertydefS(self):return{self.esw,self.es,self.ese}@cached_propertydefW(self):return{self.enw,self.ew,self.esw}@cached_propertydefE(self):return{self.ene,self.ee,self.ese}deflook(self,d):return[self.N,self.S,self.W,self.E][d.d]defgo(self,d):return[self.en,self.es,self.ew,self.ee][d.d]defchoose(self,direction,elves):for_inrange(4):ifself.look(direction).isdisjoint(elves):returnself.go(direction)direction=direction.nextdefinputs(data):return{Elf((col,row))forrow,rinenumerate(data.splitlines())forcol,cinenumerate(r)ifc=="#"}defdimension(elves):return(min(e.colforeinelves),max(e.colforeinelves),min(e.rowforeinelves),max(e.rowforeinelves),)defiteration(elves,direction,debug=False):considering=set()blocked=set()forelfinelves:ifelf.around.isdisjoint(elves):elf.choice=Nonecontinueelf.choice=elf.choose(direction,elves)ifnotelf.choice:continueifelf.choiceinconsidering:blocked.add(elf.choice)elf.choice=Noneelse:considering.add(elf.choice)considering.difference_update(blocked)move={elfforelfinelvesifelf.choiceinconsidering}moveto={elf.choiceforelfinmove}elves.difference_update(move)elves.update(moveto)returnlen(considering)Direction.init()direction=Direction.Nelves=inputs(sys.stdin.read())round=0whileiteration(elves,direction):round+=1direction=direction.nextifround==10:c0,c1,r0,r1=dimension(elves)print(f"Empty Spaces at Round 10 = {(c1 - c0 + 1) * (r1 - r0 + 1) - len(elves)}")print(f"Ended at round {round+1}")
Simple, propre, impossible de se planter, tout est clair, tout est sur-validé. Et ça fonctionne.
Mon bug c'est parce que j'avais fait une boucle pour afficher du debug.
Sinon j'aurais pas fait de boucle, et utiliser des set.difference/update comme dans le code présenté...
Pfff...
Ah, oui, partir sur une classe dérivée de tuple pour les Elfes, c'est évidemment pour pouvoir utiliser les fonctions d'ensemble, très simples et efficaces, sans avoir à coder quoi que ce soit de compliqué, ou réinventer la roue !
[^] # Re: Mes conseils...
Posté par Yth (Mastodon) . En réponse au message Avent du Code, jour 23. Évalué à 2. Dernière modification le 23 décembre 2022 à 13:34.
Simple, propre, impossible de se planter, tout est clair, tout est sur-validé. Et ça fonctionne.
Mon bug c'est parce que j'avais fait une boucle pour afficher du debug.
Sinon j'aurais pas fait de boucle, et utiliser des set.difference/update comme dans le code présenté...
Pfff...
Ah, oui, partir sur une classe dérivée de tuple pour les Elfes, c'est évidemment pour pouvoir utiliser les fonctions d'ensemble, très simples et efficaces, sans avoir à coder quoi que ce soit de compliqué, ou réinventer la roue !