@@ -11,21 +11,28 @@ import scala.collection.mutable
1111object Day9 {
1212
1313 trait Part {
14- def largestArea (redTiles : Seq [Pos ]): Long
15- }
14+ def makeIsValid (redTiles : Seq [Pos ]): Box => Boolean
15+
16+ def largestArea (redTiles : Seq [Pos ]): Long = {
17+ val isValid = makeIsValid(redTiles)
1618
17- object Part1 extends Part {
18- override def largestArea (redTiles : Seq [Pos ]): Long = {
1919 (for {
2020 // faster than combinations(2)
2121 (p1, i) <- redTiles.iterator.zipWithIndex
2222 p2 <- redTiles.view.slice(i + 1 , redTiles.size).iterator
23- } yield Box .bounding(Seq (p1, p2)).size[Long ]).max
23+ box = Box .bounding(Seq (p1, p2))
24+ if isValid(box)
25+ } yield box.size[Long ]).max
2426 }
2527 }
2628
29+ object Part1 extends Part {
30+ override def makeIsValid (redTiles : Seq [Pos ]): Box => Boolean =
31+ _ => true
32+ }
33+
2734 object Part2 extends Part {
28- override def largestArea (redTiles : Seq [Pos ]): Long = {
35+ override def makeIsValid (redTiles : Seq [Pos ]): Box => Boolean = {
2936 // TODO: clean up
3037 // TODO: optimize (with polygon checks?)
3138 val xs = redTiles.map(_.x).distinct.sorted
@@ -92,13 +99,7 @@ object Day9 {
9299 outsidePrefix(gridBox.min.y - 1 )(gridBox.min.x - 1 )) == 0
93100 }
94101
95- (for {
96- // faster than combinations(2)
97- (p1, i) <- redTiles.iterator.zipWithIndex
98- p2 <- redTiles.view.slice(i + 1 , redTiles.size).iterator
99- box = Box .bounding(Seq (p1, p2))
100- if isValid(box)
101- } yield box.size[Long ]).max
102+ isValid
102103 }
103104 }
104105
0 commit comments