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