11package eu .sim642 .adventofcode2025
22
3- import eu .sim642 .adventofcodelib .pos .Pos3
43import eu .sim642 .adventofcodelib .IteratorImplicits .*
5- import eu .sim642 .adventofcodelib .UnionFind
6-
7- import scala .annotation .tailrec
4+ import eu .sim642 .adventofcodelib .graph .Kruskal
5+ import eu .sim642 .adventofcodelib .pos .Pos3
86
97object Day8 {
108
@@ -29,11 +27,7 @@ object Day8 {
2927
3028 def multiplySizesAfter (junctionBoxes : Seq [Pos3 ], after : Int = 1000 , sizes : Int = 3 ): Int = {
3129 val closestPairs = closestPairsSeq(junctionBoxes)
32-
33- val ufAfter = closestPairs.iterator
34- .scanLeft(new UnionFind (junctionBoxes))({ case (uf, (p1, p2)) =>
35- uf.unioned(p1, p2)
36- })(after)
30+ val (ufAfter, _) = Kruskal .iterate(junctionBoxes, closestPairs)(after)
3731
3832 ufAfter.groups()
3933 .map(_.size)
@@ -45,18 +39,8 @@ object Day8 {
4539 // TODO: deduplicate
4640 def multiplyLastXs (junctionBoxes : Seq [Pos3 ]): Int = {
4741 val closestPairs = closestPairsSeq(junctionBoxes)
48-
49- // TODO: clean up
50- val size = junctionBoxes.size
51- val ufAfter = closestPairs.iterator
52- .scanLeft((new UnionFind (junctionBoxes), 0 ))({ case ((uf, edges), (p1, p2)) =>
53- if (uf.sameRepr(p1, p2))
54- (uf, edges)
55- else
56- (uf.unioned(p1, p2), edges + 1 )
57- }).tail.zip(closestPairs).find(_._1._2 == size - 1 ).get._2
58-
59- ufAfter._1.x * ufAfter._2.x
42+ val lastPair = Kruskal .iterateEdges(junctionBoxes, closestPairs).last
43+ lastPair._1.x * lastPair._2.x
6044 }
6145
6246 def parseJunctionBox (s : String ): Pos3 = s match {
0 commit comments