Skip to content

Commit 8702586

Browse files
committed
Optimize combinations in 2025 day 8
1 parent d0d66a9 commit 8702586

File tree

1 file changed

+14
-11
lines changed
  • src/main/scala/eu/sim642/adventofcode2025

1 file changed

+14
-11
lines changed

src/main/scala/eu/sim642/adventofcode2025/Day8.scala

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)