diff options
-rw-r--r-- | src/Day04.kt | 2 | ||||
-rw-r--r-- | src/Day05.kt | 2 | ||||
-rw-r--r-- | src/Day06.kt | 66 | ||||
-rw-r--r-- | src/Utils.kt | 2 |
4 files changed, 25 insertions, 47 deletions
diff --git a/src/Day04.kt b/src/Day04.kt index 6db98dd..4f93a67 100644 --- a/src/Day04.kt +++ b/src/Day04.kt @@ -4,7 +4,7 @@ class Bingo(private val revealQueue: ArrayDeque<Int>, private val boards: List<B val sections = input.trim().split("(\\r?\\n){2}".toRegex()) val revealQueueString = sections.first() - val revealQueue = ArrayDeque(revealQueueString.split(",").map { it.toInt() }) + val revealQueue = ArrayDeque(revealQueueString.split(",").map(String::toInt)) val boards = sections.drop(1).map { Board.fromMatrixString(it) } diff --git a/src/Day05.kt b/src/Day05.kt index 7c93896..bc3f1bc 100644 --- a/src/Day05.kt +++ b/src/Day05.kt @@ -8,7 +8,7 @@ data class Line(val start: Pos, val end: Pos) { companion object { fun fromString(input: String): Line { val (start, end) = input.split(" -> ").map { coordinateString -> - val (x, y) = coordinateString.split(",").map { it.toInt() } + val (x, y) = coordinateString.split(",").map(String::toInt) Pos(x, y) } diff --git a/src/Day06.kt b/src/Day06.kt index d192c72..57e56f2 100644 --- a/src/Day06.kt +++ b/src/Day06.kt @@ -1,52 +1,30 @@ -fun main() { - fun part1(input: String): Int { - var fish = input.trim().split(",").map(String::toInt) - - repeat(80) { - val pendingFish = mutableListOf<Int>() - - fish = fish.map { - when (it) { - 0 -> { - pendingFish.add(8) - 6 - } - else -> { - it - 1 - } - } - } + pendingFish +fun calculateFishPopulation(input: String, days: Int): Long { + val fishCounts = + input + .trim() + .split(",") + .map(String::toInt) + .groupingBy { it } + .eachCount() + .mapValues { (_, v) -> v.toLong() } + .toMutableMap() + + repeat(days) { + val readyToBirth = fishCounts.getOrDefault(0, 0) + repeat(8) { + fishCounts[it] = fishCounts.getOrDefault(it + 1, 0) } - - return fish.size + fishCounts.merge(6, readyToBirth, Long::plus) + fishCounts[8] = readyToBirth } - fun part2(input: String): Long { - val fishCounts = - input - .trim() - .split(",") - .map(String::toInt) - .groupingBy { it } - .eachCount() - .mapValues { (_, v) -> v.toLong() } - .toMutableMap() + return fishCounts.values.sum() +} - repeat(256) { - val readyToBirth = fishCounts.getOrDefault(0, 0) - fishCounts[0] = fishCounts.getOrDefault(1, 0) - fishCounts[1] = fishCounts.getOrDefault(2, 0) - fishCounts[2] = fishCounts.getOrDefault(3, 0) - fishCounts[3] = fishCounts.getOrDefault(4, 0) - fishCounts[4] = fishCounts.getOrDefault(5, 0) - fishCounts[5] = fishCounts.getOrDefault(6, 0) - fishCounts[6] = fishCounts.getOrDefault(7, 0) + readyToBirth - fishCounts[7] = fishCounts.getOrDefault(8, 0) - fishCounts[8] = readyToBirth - } +fun main() { + fun part1(input: String): Int = calculateFishPopulation(input, 80).toInt() - return fishCounts.values.sum() - } + fun part2(input: String): Long = calculateFishPopulation(input, 256) val testInput = readInputAsString("Day06_test") check(part1(testInput) == 5934) diff --git a/src/Utils.kt b/src/Utils.kt index 6268ba6..7876c3a 100644 --- a/src/Utils.kt +++ b/src/Utils.kt @@ -21,7 +21,7 @@ fun readInputAsString(name: String): String = File("src", "$name.txt").readText( * @param name name of the file * @return list of ints containing numbers from each of file's lines */ -fun readInputAsNumbers(name: String): List<Int> = readInputAsLines(name).map { it.toInt() } +fun readInputAsNumbers(name: String): List<Int> = readInputAsLines(name).map(String::toInt) /** * Read lines from the given input txt file containing binary numbers and convert them to lists of bits. |