I guess adding type aliases and removing the regex from parser makes it a bit more readable.
typealias Rule = Pair<Int, Int>
typealias PageNumbers = List<Int>
fun part1(input: String): Int {
val (rules, listOfNumbers) = parse(input)
return listOfNumbers
.filter { numbers -> numbers == sort(numbers, rules) }
.sumOf { numbers -> numbers[numbers.size / 2] }
}
fun part2(input: String): Int {
val (rules, listOfNumbers) = parse(input)
return listOfNumbers
.filterNot { numbers -> numbers == sort(numbers, rules) }
.map { numbers -> sort(numbers, rules) }
.sumOf { numbers -> numbers[numbers.size / 2] }
}
private fun sort(numbers: PageNumbers, rules: List<Rule>): PageNumbers {
return numbers.sortedWith { a, b -> if (rules.contains(a to b)) -1 else 1 }
}
private fun parse(input: String): Pair<List<Rule>, List<PageNumbers>> {
val (rulesSection, numbersSection) = input.split("\n\n")
val rules = rulesSection.lines()
.mapNotNull { line ->
val parts = line.split('|').map { it.toInt() }
if (parts.size >= 2) parts[0] to parts[1] else null
}
val numbers = numbersSection.lines()
.map { line -> line.split(',').map { it.toInt() } }
return rules to numbers
}
Kotlin
Not much inspiration. Brute forcing my way through today's level.
Solution