Bon, aujourd'hui nous sommes dans le cas d'un problème avec une solution naïve qui ne passe pas à l'échelle. Mais personnellement, comme l'optimisation de la première partie était quand même assez simple, j'ai fait un strike, la deuxième partie était résolue en changeant simplement une constante.
importitertoolsfromcollections.abcimportIterablefromtypingimportSelfimportaocCoords=tuple[int,int]classImage:def__init__(self,galaxies:Iterable[Coords],factor:int):ys:set[int]=set()xs:set[int]=set()self.galaxies:set[Coords]=set()forgalaxyingalaxies:self.galaxies.add(galaxy)ys.add(galaxy[0])xs.add(galaxy[1])# Space expansion factor: 2 everywhere...self.yfactor=[factor]*(max(ys)+1)self.xfactor=[factor]*(max(xs)+1)# ... except where galaxies were found.foryinys:self.yfactor[y]=1forxinxs:self.xfactor[x]=1defdistance(self,g1:Coords,g2:Coords)->int:y1,x1=g1y2,x2=g2ymin,ymax=min(y1,y2),max(y1,y2)xmin,xmax=min(x1,x2),max(x1,x2)return(sum(self.yfactor[y]foryinrange(ymin,ymax))+sum(self.xfactor[x]forxinrange(xmin,xmax)))@classmethoddefimport_lines(cls,lines:Iterable[str],factor:int)->Self:returncls(((y,x)fory,lineinenumerate(lines)forx,charinenumerate(line.rstrip())ifchar=='#'),factor)defpart1(lines:aoc.Data)->int:"""Solve puzzle part 1: determine total galaxy distances considering an expansion factor of 2."""image=Image.import_lines(lines,2)total=0forg1,g2initertools.combinations(image.galaxies,2):total+=image.distance(g1,g2)returntotaldefpart2(lines:aoc.Data)->int:"""Solve puzzle part 2: determine total galaxy distances considering an expansion factor of 1000000."""image=Image.import_lines(lines,1000000)total=0forg1,g2initertools.combinations(image.galaxies,2):total+=image.distance(g1,g2)returntotal
# Strike
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Advent of Code 2023, jour 11. Évalué à 3. Dernière modification le 11 décembre 2023 à 16:37.
Bon, aujourd'hui nous sommes dans le cas d'un problème avec une solution naïve qui ne passe pas à l'échelle. Mais personnellement, comme l'optimisation de la première partie était quand même assez simple, j'ai fait un strike, la deuxième partie était résolue en changeant simplement une constante.