Skip to content

Commit dd9aa3f

Browse files
committed
2024 Day 08
1 parent ee13d94 commit dd9aa3f

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package de.jball.aoc2024.day08
2+
3+
import de.jball.AdventOfCodeDay
4+
import de.jball.aocutils.Grid
5+
import de.jball.aocutils.Point
6+
import kotlin.math.sin
7+
8+
class Day08(test: Boolean = false): AdventOfCodeDay<Int>(test, 14, 34) {
9+
10+
val antennas = Grid.parse(input, '.')
11+
12+
override fun part1(): Int {
13+
14+
val antennaLocationsByType = antennas.map.entries
15+
.groupBy({ it.value }, { it.key })
16+
17+
val candidates = antennaLocationsByType.entries.flatMap { antiNodes(it.value) }
18+
return candidates.toSet().size
19+
}
20+
21+
private fun antiNodes(input: List<Point>, fullLines: Boolean = false): Set<Point> {
22+
if (input.size < 2) return setOf()
23+
24+
val candidates = (0 until input.size).flatMap { i ->
25+
((i + 1) until input.size).flatMap { j ->
26+
antiNodes(input[i], input[j], fullLines)
27+
}
28+
}
29+
30+
return candidates.toSet()
31+
}
32+
33+
private fun antiNodes(a: Point, b: Point, line: Boolean = false): List<Point> {
34+
val delta = a-b
35+
val positives = generateSequence(a) { it + delta }
36+
.let { if (line) it else it.drop(1) }
37+
.takeWhile { this.antennas.isPointInGrid(it) }
38+
.let { if (line) it else it.take(1) }
39+
.toList()
40+
val negatives = generateSequence(b) { it - delta }
41+
.let { if (line) it else it.drop(1) }
42+
.takeWhile { this.antennas.isPointInGrid(it) }
43+
.let { if (line) it else it.take(1) }
44+
.toList()
45+
46+
return positives + negatives
47+
}
48+
49+
override fun part2(): Int {
50+
val antennaLocationsByType = antennas.map.entries
51+
.groupBy({ it.value }, { it.key })
52+
53+
val candidates = antennaLocationsByType.entries.flatMap { antiNodes(it.value, fullLines = true) }
54+
return candidates.toSet().size
55+
}
56+
}
57+
58+
fun main() {
59+
Day08().run()
60+
}

src/main/kotlin/de/jball/aocutils/Grid.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ open class Grid<T>(val map: Map<Point, T>, val width: Int, val height: Int, priv
2121
}
2222
}
2323

24+
fun isPointInGrid(point: Point): Boolean {
25+
val (x, y) = point
26+
return (x in 0..<width && y in 0..<height)
27+
}
28+
2429
override fun toString(): String {
2530
return (height-1 downTo 0).map { row ->
2631
(0 ..< width).map { column ->

src/test/kotlin/de/jball/aoc2024/Tests2024.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import de.jball.aoc2024.day04.Day04
77
import de.jball.aoc2024.day05.Day05
88
import de.jball.aoc2024.day06.Day06
99
import de.jball.aoc2024.day07.Day07
10+
import de.jball.aoc2024.day08.Day08
1011
import kotlin.test.Test
1112

1213
class Tests2024 {
@@ -44,4 +45,9 @@ class Tests2024 {
4445
fun day07() {
4546
Day07(true).run()
4647
}
48+
49+
@Test
50+
fun day08() {
51+
Day08(true).run()
52+
}
4753
}

src/test/resources/2024/Day08.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
............
2+
........0...
3+
.....0......
4+
.......0....
5+
....0.......
6+
......A.....
7+
............
8+
............
9+
........A...
10+
.........A..
11+
............
12+
............

0 commit comments

Comments
 (0)