• [^] # Re: 12ème jour

    Posté par . En réponse au journal Advent of code 2024. Évalué à 2.

    compter le nombre de cotés revient à compter le nombre de coins.

    Je n'y avais pas pensé. J'ai utilisé une méthode différentes

    J'identifie les pièces sous forme d'un Set.

    Pour identifier les côtés, je détermine la bordure & la direction qui a servi à déterminer cette bordure. Cela me donne un Set

    Je regroupe les éléments de ce Set par exploration des adjacents de même directions. Le nombre groupe identifié correspond à mon nombre de côté.

     private static int computeSides(Set<Point> pieces) {
     Set<SidePart> set = new HashSet<>();
     int sides = 0;
     for (Point p : pieces) {
     for (Point d : Point.DIRECTIONS) {
     Point i = p.add(d);
     if (!pieces.contains(i)) {
     set.add(new SidePart(p, d));
     }
     }
     }
     Set<SidePart> counted = new HashSet<>();
     for (SidePart sidePart : set) {
     if (counted.contains(sidePart)) {
     continue;
     }
     Set<SidePart> groups = new HashSet<>();
     buildGroup(set, sidePart, groups);
     counted.addAll(groups);
     sides++;
     }
     return sides;
     }
     private static void buildGroup(Set<SidePart> set, SidePart sidePart, Set<SidePart> groups) {
     if (!set.contains(sidePart)) {
     return;
     }
     if (groups.contains(sidePart)) {
     return;
     }
     groups.add(sidePart);
     Point direction = sidePart.direction;
     Point source = sidePart.source;
     if (direction.x != 0) {
     buildGroup(set, new SidePart(source.add(new Point(0, 1)), direction), groups);
     buildGroup(set, new SidePart(source.add(new Point(0, -1)), direction), groups);
     } else {
     buildGroup(set, new SidePart(source.add(new Point(1, 0)), direction), groups);
     buildGroup(set, new SidePart(source.add(new Point(-1, 0)), direction), groups);
     }
     }
     record SidePart(Point source, Point direction) {
     }