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