@@ -14,6 +14,17 @@ object Day8 {
1414 }
1515 }
1616
17+ def closestPairsSeq (junctionBoxes : Seq [Pos3 ]): Seq [(Pos3 , Pos3 )] = {
18+ // noinspection ConvertibleToMethodValue
19+ (for {
20+ // faster than combinations(2)
21+ (p1, i) <- junctionBoxes.iterator.zipWithIndex
22+ p2 <- junctionBoxes.view.slice(i + 1 , junctionBoxes.size).iterator
23+ } yield (p1, p2))
24+ .toSeq
25+ .sortBy(_ euclideanDistance _)
26+ }
27+
1728 class UnionFind [A ](val reprs : Map [A , A ]) {
1829 // TODO: optimize
1930
@@ -46,11 +57,7 @@ object Day8 {
4657 }
4758
4859 def multiplySizesAfter (junctionBoxes : Seq [Pos3 ], after : Int = 1000 , sizes : Int = 3 ): Int = {
49- val closestPairs =
50- junctionBoxes.combinations(2 )
51- .map({ case Seq (p1, p2) => (p1, p2) })
52- .toSeq
53- .sortBy(_ euclideanDistance _)
60+ val closestPairs = closestPairsSeq(junctionBoxes)
5461
5562 val ufAfter = closestPairs.iterator
5663 .scanLeft(new UnionFind (junctionBoxes))({ case (uf, (p1, p2)) =>
@@ -66,11 +73,7 @@ object Day8 {
6673
6774 // TODO: deduplicate
6875 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 _)
76+ val closestPairs = closestPairsSeq(junctionBoxes)
7477
7578 // TODO: clean up
7679 val size = junctionBoxes.size
@@ -94,7 +97,7 @@ object Day8 {
9497 lazy val input : String = scala.io.Source .fromInputStream(getClass.getResourceAsStream(" day8.txt" )).mkString.trim
9598
9699 def main (args : Array [String ]): Unit = {
97- // println(multiplySizesAfter(parseJunctionBoxes(input)))
100+ println(multiplySizesAfter(parseJunctionBoxes(input)))
98101 println(multiplyLastXs(parseJunctionBoxes(input)))
99102 }
100103}
0 commit comments