This commit is contained in:
parent
ccf7dd091c
commit
b2ff775638
82
day08.kts
Executable file
82
day08.kts
Executable file
@ -0,0 +1,82 @@
|
|||||||
|
#!/usr/bin/env kotlin
|
||||||
|
import java.util.Scanner
|
||||||
|
|
||||||
|
val scanner = Scanner(System.`in`)
|
||||||
|
|
||||||
|
val antennaMap = mutableMapOf<String, MutableList<Pair<Int, Int>>>()
|
||||||
|
val antinodeSet = mutableSetOf<Pair<Int, Int>>()
|
||||||
|
val harmonicAntinodeSet = mutableSetOf<Pair<Int, Int>>()
|
||||||
|
var xMax = 0
|
||||||
|
var yMax = 0
|
||||||
|
while (scanner.hasNext()) {
|
||||||
|
val symbols = scanner.nextLine().trim().split("").filter { it.isNotEmpty() }
|
||||||
|
xMax = xMax.coerceAtLeast(symbols.lastIndex)
|
||||||
|
for ((i, symbol) in symbols.withIndex()) {
|
||||||
|
if (symbol == ".") continue
|
||||||
|
antennaMap.getOrPut(symbol) { mutableListOf() }.add(Pair(i, yMax))
|
||||||
|
}
|
||||||
|
yMax++
|
||||||
|
}
|
||||||
|
yMax--
|
||||||
|
|
||||||
|
fun getAntinodes(pair: Pair<Int, Int>, pair1: Pair<Int, Int>, xMax: Int, yMax: Int): Collection<Pair<Int, Int>> {
|
||||||
|
val antinodes = mutableSetOf<Pair<Int, Int>>()
|
||||||
|
val diffOne = Pair(pair.first - pair1.first, pair.second - pair1.second)
|
||||||
|
antinodes.add(Pair(pair.first + diffOne.first, pair.second + diffOne.second))
|
||||||
|
antinodes.add(Pair(pair1.first - diffOne.first, pair1.second - diffOne.second))
|
||||||
|
antinodes.removeIf { it.first < 0 || it.second < 0 || it.first > xMax || it.second > yMax }
|
||||||
|
return antinodes
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getHarmonicAntiNodes(
|
||||||
|
pair: Pair<Int, Int>,
|
||||||
|
pair1: Pair<Int, Int>,
|
||||||
|
xMax: Int,
|
||||||
|
yMax: Int
|
||||||
|
): Collection<Pair<Int, Int>> {
|
||||||
|
val antinodes = mutableSetOf<Pair<Int, Int>>()
|
||||||
|
val diffOne = Pair(pair.first - pair1.first, pair.second - pair1.second)
|
||||||
|
var mult = 0
|
||||||
|
while ((pair.first + mult * diffOne.first) <= xMax && (pair.second + mult * diffOne.second) <= yMax && 0 <= (pair.first + mult * diffOne.first) && 0 <= (pair.second + mult * diffOne.second) ) {
|
||||||
|
antinodes.add(Pair(pair.first + mult * diffOne.first, pair.second + mult * diffOne.second))
|
||||||
|
mult++
|
||||||
|
}
|
||||||
|
mult = 0
|
||||||
|
while ((pair1.first - mult * diffOne.first) <= xMax && (pair1.second - mult * diffOne.second) <= yMax && 0 <= (pair1.first - mult * diffOne.first) && 0 <= (pair1.second - mult * diffOne.second)) {
|
||||||
|
antinodes.add(Pair(pair1.first - mult * diffOne.first, pair1.second - mult * diffOne.second))
|
||||||
|
mult++
|
||||||
|
}
|
||||||
|
antinodes.removeIf { it.first < 0 || it.second < 0 || it.first > xMax || it.second > yMax }
|
||||||
|
return antinodes
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (antennaType in antennaMap.keys) {
|
||||||
|
for (i in antennaMap[antennaType]!!.indices) {
|
||||||
|
for (y in (i + 1)..(antennaMap[antennaType]!!.lastIndex)) {
|
||||||
|
val antinodes = getAntinodes(antennaMap[antennaType]!![i], antennaMap[antennaType]!![y], xMax, yMax)
|
||||||
|
val harmonicAntinodes = getHarmonicAntiNodes(antennaMap[antennaType]!![i], antennaMap[antennaType]!![y], xMax, yMax)
|
||||||
|
antinodeSet.addAll(antinodes)
|
||||||
|
harmonicAntinodeSet.addAll(harmonicAntinodes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun printMap(antinodeSet: Set<Pair<Int, Int>>) {
|
||||||
|
for (y in 0..yMax) {
|
||||||
|
for (x in 0..xMax) {
|
||||||
|
if (Pair(x, y) in antennaMap.values.flatten()) {
|
||||||
|
for (antennatype in antennaMap.keys) {
|
||||||
|
if (Pair(x, y) in antennaMap[antennatype]!!) {
|
||||||
|
print(antennatype)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if(Pair(x, y) in antinodeSet) print("#") else print(".")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println("Antinodes: ${antinodeSet.size}")
|
||||||
|
println("Harmonic Antinodes: ${harmonicAntinodeSet.size}")
|
Loading…
Reference in New Issue
Block a user