V den 6. jsem se pokusil zaměřit se na rychlost řešení, namísto čistého kódu, abych odhadl, jestli bych měl vůbec šanci dostat se do Top 100 v leaderboardu. No, trvalo mi to něco přes 40 min, kde se mi u toho málem roztopil mozek 🙂 . Takže na to prdím, neb to mi za to nestojí … zde je moje řešení pro den 6. a příště se navrátím zpět k důmyslnosti a čistotě řešení samotného:
import com.svetylkovo.rojo.Rojo import java.io.File import kotlin.math.abs import kotlin.streams.toList data class Coord(val id: Int, val x: Int, val y: Int) { fun manhattanDistanceFrom(other: Coord) = abs(x - other.x) + abs(y - other.y) } fun main() { val input = File("input6.txt").readText().trim() val coords = Rojo.map("(\\d+), (\\d+)", input) { x, y -> x.toInt() to y.toInt() }.toList().mapIndexed { index, it -> Coord(index + 1, it.first, it.second) } val maxX = (coords.map { it.x }.max() ?: 0) + 1 val maxY = (coords.map { it.y }.max() ?: 0) + 1 val area = Array(maxX) { IntArray(maxY) { 0 } } for (x in 0 until maxX) { for (y in 0 until maxY) { area[x][y] = findClosestDistance(x, y, coords) } } val infiniteAreas = (0 until maxX).map { x -> (0 until maxY).map { y -> if (x == 0 || x == maxX - 1 || y == 0 || y == maxY - 1) area[x][y] else null } }.flatten().filterNotNull().filter { it != 0 }.distinct() val largestNonInfinite = coords.filterNot { it.id in infiniteAreas } .map { findRegionSize(area, it) }.max() println(largestNonInfinite) //part B for (x in 0 until maxX) { for (y in 0 until maxY) { if (findSummedDistance(x, y, coords) < 10000) { area[x][y] = -1 } } } val regionSize = area.flatMap { it.toList() }.count { it == -1 } println(regionSize) } private fun findRegionSize( area: Array<IntArray>, coord: Coord ): Int { return area.sumBy { it.count { it == coord.id } } } fun findSummedDistance(x: Int, y: Int, coords: List<Coord>): Int { val coord = Coord(0, x, y) val distancesMap = coords.associateWith { it.manhattanDistanceFrom(coord) } return distancesMap.values.sum() } fun findClosestDistance(x: Int, y: Int, coords: List<Coord>): Int { val coord = Coord(0, x, y) val distancesMap = coords.associateWith { it.manhattanDistanceFrom(coord) } val closest = distancesMap.minBy { it.value } if (closest != null) { val closestCount = distancesMap.values .filter { it == closest.value } .count() return if (closestCount > 1) 0 else closest.key.id } return 0 }