@@ -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}
0 commit comments