Day 1: Historian Hysteria
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 3 points
Kotlin
No π for Kotlin here?
import kotlin.math.abs
fun part1(input: String): Int {
val diffs: MutableList<Int> = mutableListOf()
val pair = parse(input)
pair.first.sort()
pair.second.sort()
pair.first.forEachIndexed { idx, num ->
diffs.add(abs(num - pair.second[idx]))
}
return diffs.sum()
}
fun part2(input: String): Int {
val pair = parse(input)
val frequencies = pair.second.groupingBy { it }.eachCount()
var score = 0
pair.first.forEach { num ->
score += num * frequencies.getOrDefault(num, 0)
}
return score
}
private fun parse(input: String): Pair<MutableList<Int>, MutableList<Int>> {
val left: MutableList<Int> = mutableListOf()
val right: MutableList<Int> = mutableListOf()
input.lines().forEach { line ->
if (line.isNotBlank()) {
val parts = line.split("\\s+".toRegex())
left.add(parts[0].toInt())
right.add(parts[1].toInt())
}
}
return left to right
}
1 point
*
I have another Kotlin (albeit similar) solution:
import kotlin.math.abs
fun main() {
fun getLists(input: List<String>): Pair<List<Int>, List<Int>> {
val unsortedPairs = input.map {
it.split(" ").map { it.toInt() }
}
val listA = unsortedPairs.map { it.first() }
val listB = unsortedPairs.map { it.last() }
return Pair(listA, listB)
}
fun part1(input: List<String>): Int {
val (listA, listB) = getLists(input)
return listA.sorted().zip(listB.sorted()).sumOf { abs(it.first - it.second) }
}
fun part2(input: List<String>): Int {
val (listA, listB) = getLists(input)
return listA.sumOf { number ->
number * listB.count { it == number }
}
}
// Or read a large test input from the `src/Day01_test.txt` file:
val testInput = readInput("Day01_test")
check(part1(testInput) == 11)
check(part2(testInput) == 31)
// Read the input from the `src/Day01.txt` file.
val input = readInput("Day01")
part1(input).println()
part2(input).println()
}
Itβs a bit more compact. (If you take out the part that actually calls the functions on the (test-)input.)
2 points