• [^] # Re: Première partie

    Posté par (site web personnel) . En réponse au message Advent of Code 2023 : Jour 10. Évalué à 3.

    Et pour la deuxième partie, résolue grâce à l'idée de Pierre :

    class Map:
     def simplify(self) -> None:
     connecteds: npt.NDArray[np.bool_] = np.zeros(self.matrix.shape, dtype=np.bool_)
     currents: set[Coords] = {self.start}
     while len(currents) > 0:
     nexts: set[Coords] = set()
     for current in currents:
     if connecteds[current]:
     continue
     connecteds[current] = True
     nexts.update(self.neighs(current))
     currents = nexts
     for index, connected in np.ndenumerate(connecteds):
     if not connected:
     self.matrix[index] = Tile(0)
     def area(self) -> int:
     total = 0
     for line in self.matrix:
     inside: bool = False
     for tile in line:
     if inside and tile is Tile(0):
     total += 1
     if Tile.NORTH in tile:
     inside = not inside
     return total

    Première étape, simplifier la carte en virant tous les tuyaux inutiles. Comme pour la première partie, c'est basé sur un parcours de proche en proche pour identifier les tuyaux connectés au point de départ. Ensuite, on parcours tout, puis on met à zéro les tuiles qui contenaient des tuyaux non connectés.

    En fait, on parcours chaque ligne en gardant en mémoire si on est à l'intérieur de la boucle de tuyaux ou non. Seulement, à l'intérieur ou à l'extérieur, c'est ambigu lorsqu'on est justement sur un tuyau qui fait partie du réseau. Donc, pour être plus précis, on s'intéresse au fait que la zone en haut à gauche de chaque tuile est à l'intérieur ou non. Et vous pouvez faire tous les schémas que vous voulez, la seule chose qui fait changer l'état intérieur/extérieur de la zone en haut à gauche de la tuile suivante, c'est la présente d'un tuyau connecté au nord.

    Quant à l'aire, les tuiles qui y contribuent sont celles qui sont à l'intérieur et qui sont vides (après élimination de tuyaux inutiles). Voilà !