Skip to content

Commit 4657c02

Browse files
committed
Solve 2024 day 8 part 2
1 parent 3de8c5d commit 4657c02

File tree

2 files changed

+53
-17
lines changed

2 files changed

+53
-17
lines changed

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

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,44 @@ object Day8 {
1414
} yield cell -> Pos(x, y)).toSet.groupMap(_._1)(_._2)
1515
}
1616

17-
def antennaAntinodes(antenna1: Pos, antenna2: Pos): Set[Pos] = {
18-
val diff = antenna2 - antenna1
19-
Set(antenna1 - diff, antenna2 + diff)
17+
trait Part {
18+
def antennaAntinodes(grid: Grid[Char])(antenna1: Pos, antenna2: Pos): Set[Pos]
19+
20+
def countAntinodes(grid: Grid[Char]): Int = {
21+
val antennas = findAntennas(grid)
22+
val antinodes = (for {
23+
(_, poss) <- antennas
24+
antenna1 <- poss
25+
antenna2 <- poss
26+
if antenna1 != antenna2
27+
antinode <- antennaAntinodes(grid)(antenna1, antenna2)
28+
} yield antinode).toSet
29+
antinodes.size
30+
}
2031
}
2132

22-
def countAntinodes(grid: Grid[Char]): Int = {
23-
val antennas = findAntennas(grid)
24-
val antinodes = (for {
25-
(_, poss) <- antennas
26-
antenna1 <- poss
27-
antenna2 <- poss
28-
if antenna1 != antenna2
29-
antinode <- antennaAntinodes(antenna1, antenna2)
30-
if grid.containsPos(antinode)
31-
} yield antinode).toSet
32-
antinodes.size
33+
object Part1 extends Part {
34+
override def antennaAntinodes(grid: Grid[Char])(antenna1: Pos, antenna2: Pos): Set[Pos] = {
35+
val diff = antenna2 - antenna1
36+
Set(antenna1 - diff, antenna2 + diff).filter(grid.containsPos)
37+
}
38+
}
39+
40+
object Part2 extends Part {
41+
override def antennaAntinodes(grid: Grid[Char])(antenna1: Pos, antenna2: Pos): Set[Pos] = {
42+
val diff = antenna2 - antenna1
43+
val antinodes1 = Iterator.iterate(antenna1)(_ - diff).takeWhile(grid.containsPos).toSet
44+
val antinodes2 = Iterator.iterate(antenna2)(_ + diff).takeWhile(grid.containsPos).toSet
45+
antinodes1 ++ antinodes2
46+
}
3347
}
3448

3549
def parseGrid(input: String): Grid[Char] = input.linesIterator.map(_.toVector).toVector
3650

3751
lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day8.txt")).mkString.trim
3852

3953
def main(args: Array[String]): Unit = {
40-
println(countAntinodes(parseGrid(input)))
54+
println(Part1.countAntinodes(parseGrid(input)))
55+
println(Part2.countAntinodes(parseGrid(input)))
4156
}
4257
}

src/test/scala/eu/sim642/adventofcode2024/Day8Test.scala

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,32 @@ class Day8Test extends AnyFunSuite {
1919
|............
2020
|............""".stripMargin
2121

22+
val exampleInput2 =
23+
"""T.........
24+
|...T......
25+
|.T........
26+
|..........
27+
|..........
28+
|..........
29+
|..........
30+
|..........
31+
|..........
32+
|..........""".stripMargin
33+
2234
test("Part 1 examples") {
23-
assert(countAntinodes(parseGrid(exampleInput)) == 14)
35+
assert(Part1.countAntinodes(parseGrid(exampleInput)) == 14)
2436
}
2537

2638
test("Part 1 input answer") {
27-
assert(countAntinodes(parseGrid(input)) == 357)
39+
assert(Part1.countAntinodes(parseGrid(input)) == 357)
40+
}
41+
42+
test("Part 2 examples") {
43+
assert(Part2.countAntinodes(parseGrid(exampleInput2)) == 9)
44+
assert(Part2.countAntinodes(parseGrid(exampleInput)) == 34)
45+
}
46+
47+
test("Part 2 input answer") {
48+
assert(Part2.countAntinodes(parseGrid(input)) == 1266)
2849
}
2950
}

0 commit comments

Comments
 (0)