@@ -64,6 +64,27 @@ object Day8 {
6464 .product
6565 }
6666
67+ // TODO: deduplicate
68+ def multiplyLastXs (junctionBoxes : Seq [Pos3 ]): Int = {
69+ val closestPairs =
70+ junctionBoxes.combinations(2 )
71+ .map({ case Seq (p1, p2) => (p1, p2) })
72+ .toSeq
73+ .sortBy(_ euclideanDistance _)
74+
75+ // TODO: clean up
76+ val size = junctionBoxes.size
77+ val ufAfter = closestPairs.iterator
78+ .scanLeft((new UnionFind (junctionBoxes), 0 ))({ case ((uf, edges), (p1, p2)) =>
79+ if (uf.sameRepr(p1, p2))
80+ (uf, edges)
81+ else
82+ (uf.unioned(p1, p2), edges + 1 )
83+ }).tail.zip(closestPairs).find(_._1._2 == size - 1 ).get._2
84+
85+ ufAfter._1.x * ufAfter._2.x
86+ }
87+
6788 def parseJunctionBox (s : String ): Pos3 = s match {
6889 case s " $x, $y, $z" => Pos3 (x.toInt, y.toInt, z.toInt)
6990 }
@@ -73,6 +94,7 @@ object Day8 {
7394 lazy val input : String = scala.io.Source .fromInputStream(getClass.getResourceAsStream(" day8.txt" )).mkString.trim
7495
7596 def main (args : Array [String ]): Unit = {
76- println(multiplySizesAfter(parseJunctionBoxes(input)))
97+ // println(multiplySizesAfter(parseJunctionBoxes(input)))
98+ println(multiplyLastXs(parseJunctionBoxes(input)))
7799 }
78100}
0 commit comments