Ici, j'ai réfléchi au fait que si on a deux boîtes de dérivation qui ne sont pas reliées par le fil le plus petit existant, alors on peut raccourcir le réseau total.
Donc il apparaît clair qu'il faut ajouter les liens du plus petit au plus grand, jusqu'à compléter l'exercice.
J'ai un peu lutté sur la représentation des données, je voulais être intelligent, mais je me suis retrouvé avec des cas où des sous-graphes étaient encore référencés.
Là, j'aurais été plus à l'aise en C, à manipuler proprement des pointeurs, pour modifier directement les données à plusieurs endroits à la fois.
Bon, je le fais aussi en Python, mais j'ai des trucs qui m'ont embêté, et j'ai perdu l'élégance que j'espérais avoir.
Au final, j'ai quand même un truc pas super optimisé qui s'exécute en 3,5s, c'est très laid.
Et comme ça prend seulement 1s en PyPy, je sais que j'ai fait du mauvais travail :D
fromdataclassesimportdataclassimportmathimportitertoolsMAX=1000# 10 pour l'exempledata=sys.stdin.read().strip().splitlines()@dataclass(frozen=True)classBox:x:inty:intz:intdef__mul__(self,x):# distance euclidienne: a*breturn(self.x-x.x)**2+(self.y-x.y)**2+(self.z-x.z)**2boxes={Box(*(int(_)for_inl.split(",")))forlindata}dist=sorted({(a*b,frozenset((a,b)))fora,binitertools.product(boxes,boxes)ifb!=a})circuits={b:{b}forbinboxes}fori,(d,(a,b))inenumerate(dist):ifbnotincircuits[a]:c=circuits[a].union(circuits[b])iflen(c)==len(boxes):break# On a finifor_inc:circuits[_]=cifi==MAX-1:ex1={(len(_),frozenset(_))for_incircuits.values()}ex1=math.prod(sorted(lforl,_inex1)[-3:])ex2=a.x*b.x
[^] # Re: Jour 8
Posté par Yth (Mastodon) . En réponse au journal Advent of Code 2025. Évalué à 2.
Ici, j'ai réfléchi au fait que si on a deux boîtes de dérivation qui ne sont pas reliées par le fil le plus petit existant, alors on peut raccourcir le réseau total.
Donc il apparaît clair qu'il faut ajouter les liens du plus petit au plus grand, jusqu'à compléter l'exercice.
J'ai un peu lutté sur la représentation des données, je voulais être intelligent, mais je me suis retrouvé avec des cas où des sous-graphes étaient encore référencés.
Là, j'aurais été plus à l'aise en C, à manipuler proprement des pointeurs, pour modifier directement les données à plusieurs endroits à la fois.
Bon, je le fais aussi en Python, mais j'ai des trucs qui m'ont embêté, et j'ai perdu l'élégance que j'espérais avoir.
Au final, j'ai quand même un truc pas super optimisé qui s'exécute en 3,5s, c'est très laid.
Et comme ça prend seulement 1s en PyPy, je sais que j'ai fait du mauvais travail :D