Day 6
This commit is contained in:
105
src/main/kotlin/com/basdado/adventofcode/Day6.kt
Normal file
105
src/main/kotlin/com/basdado/adventofcode/Day6.kt
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
package com.basdado.adventofcode
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
import java.util.Arrays.stream
|
||||||
|
import java.util.stream.Collectors
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
|
||||||
|
val day = Day6()
|
||||||
|
day.puzzle1()
|
||||||
|
day.puzzle2()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Day6 {
|
||||||
|
|
||||||
|
fun puzzle1() {
|
||||||
|
|
||||||
|
val coords = lines("/day/6/input.txt")
|
||||||
|
.map { it.split(",") }
|
||||||
|
.map { Pair(it[0].trim().toInt(), it[1].trim().toInt()) }
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
|
||||||
|
val minX = coords.stream().mapToInt { it.first }.min().asInt - 1
|
||||||
|
val maxX = coords.stream().mapToInt { it.first }.max().asInt + 1
|
||||||
|
val minY = coords.stream().mapToInt { it.second }.min().asInt - 1
|
||||||
|
val maxY = coords.stream().mapToInt { it.second }.max().asInt + 1
|
||||||
|
|
||||||
|
val grid = Array(maxY - minY) { Array(maxX - minX) { Cell(-1, Int.MAX_VALUE) } }
|
||||||
|
|
||||||
|
for (areaId in 0 until coords.size) {
|
||||||
|
|
||||||
|
val areaCenter = coords[areaId]
|
||||||
|
for(y in minY until maxY) {
|
||||||
|
val j = y - minY
|
||||||
|
for (x in minX until maxX) {
|
||||||
|
val i = x - minX
|
||||||
|
|
||||||
|
val dist = abs(areaCenter.first - x) + abs(areaCenter.second - y)
|
||||||
|
if (dist < grid[j][i].minDistance) {
|
||||||
|
grid[j][i].minDistance = dist
|
||||||
|
grid[j][i].minAreaId = areaId
|
||||||
|
} else if (dist == grid[j][i].minDistance) {
|
||||||
|
// Equal distance so this doesn't count
|
||||||
|
grid[j][i].minAreaId = -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// println(Arrays.stream(grid).map { Arrays.stream(it).map { it.minAreaId.toString() }.collect(Collectors.joining(" "))}.collect(Collectors.joining("\r\n")))
|
||||||
|
|
||||||
|
val infiniteAreas = HashSet<Int>()
|
||||||
|
infiniteAreas.add(-1)
|
||||||
|
stream(grid[0]).map { it.minAreaId }.collect(Collectors.toSet())
|
||||||
|
infiniteAreas.addAll(stream(grid[grid.size - 1]).map { it.minAreaId }.collect(Collectors.toSet()))
|
||||||
|
infiniteAreas.addAll(stream(grid).map { it[0].minAreaId }.collect(Collectors.toSet()))
|
||||||
|
infiniteAreas.addAll(stream(grid).map { it[it.size - 1].minAreaId }.collect(Collectors.toSet()))
|
||||||
|
|
||||||
|
val areaSizes = stream(grid)
|
||||||
|
.flatMap { stream(it) }
|
||||||
|
.filter{ !infiniteAreas.contains(it.minAreaId) }
|
||||||
|
.collect(Collectors.groupingBy({ c: Cell -> c.minAreaId }, Collectors.counting()))
|
||||||
|
|
||||||
|
println(areaSizes.values.max())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun puzzle2() {
|
||||||
|
|
||||||
|
val coords = lines("/day/6/input.txt")
|
||||||
|
.map { it.split(",") }
|
||||||
|
.map { Pair(it[0].trim().toInt(), it[1].trim().toInt()) }
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
|
||||||
|
val minX = coords.stream().mapToInt { it.first }.min().asInt - 1
|
||||||
|
val maxX = coords.stream().mapToInt { it.first }.max().asInt + 1
|
||||||
|
val minY = coords.stream().mapToInt { it.second }.min().asInt - 1
|
||||||
|
val maxY = coords.stream().mapToInt { it.second }.max().asInt + 1
|
||||||
|
|
||||||
|
val grid = Array(maxY - minY) { Array(maxX - minX) { 0 } }
|
||||||
|
|
||||||
|
for(y in minY until maxY) {
|
||||||
|
val j = y - minY
|
||||||
|
for (x in minX until maxX) {
|
||||||
|
val i = x - minX
|
||||||
|
|
||||||
|
for (areaId in 0 until coords.size) {
|
||||||
|
|
||||||
|
val areaCenter = coords[areaId]
|
||||||
|
|
||||||
|
grid[j][i] += abs(areaCenter.first - x) + abs(areaCenter.second - y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println(stream(grid)
|
||||||
|
.flatMapToInt { stream(it).mapToInt{i -> i} }
|
||||||
|
.filter{ it < 10000 }
|
||||||
|
.boxed()
|
||||||
|
.collect(Collectors.counting()))
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Cell (var minAreaId: Int, var minDistance: Int)
|
||||||
|
|
||||||
|
}
|
||||||
50
src/main/resources/day/6/input.txt
Normal file
50
src/main/resources/day/6/input.txt
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
177, 51
|
||||||
|
350, 132
|
||||||
|
276, 139
|
||||||
|
249, 189
|
||||||
|
225, 137
|
||||||
|
337, 354
|
||||||
|
270, 147
|
||||||
|
182, 329
|
||||||
|
118, 254
|
||||||
|
174, 280
|
||||||
|
42, 349
|
||||||
|
96, 341
|
||||||
|
236, 46
|
||||||
|
84, 253
|
||||||
|
292, 143
|
||||||
|
253, 92
|
||||||
|
224, 137
|
||||||
|
209, 325
|
||||||
|
243, 195
|
||||||
|
208, 337
|
||||||
|
197, 42
|
||||||
|
208, 87
|
||||||
|
45, 96
|
||||||
|
64, 295
|
||||||
|
266, 248
|
||||||
|
248, 298
|
||||||
|
194, 261
|
||||||
|
157, 74
|
||||||
|
52, 248
|
||||||
|
243, 201
|
||||||
|
242, 178
|
||||||
|
140, 319
|
||||||
|
69, 270
|
||||||
|
314, 302
|
||||||
|
209, 212
|
||||||
|
237, 217
|
||||||
|
86, 294
|
||||||
|
295, 144
|
||||||
|
248, 206
|
||||||
|
157, 118
|
||||||
|
155, 146
|
||||||
|
331, 40
|
||||||
|
247, 302
|
||||||
|
250, 95
|
||||||
|
193, 214
|
||||||
|
345, 89
|
||||||
|
183, 206
|
||||||
|
121, 169
|
||||||
|
79, 230
|
||||||
|
88, 155
|
||||||
Reference in New Issue
Block a user