This commit is contained in:
2018-12-06 13:08:55 +01:00
parent c6066c42ed
commit f1c31df8b4
2 changed files with 155 additions and 0 deletions

View 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)
}

View 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