1
0
Files
Advent-of-Code/2021/src/main/kotlin/Day08.kt
T
2021-12-08 19:18:09 +01:00

50 lines
2.2 KiB
Kotlin

package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.BaseDay
import be.vandewalleh.aoc.utils.input.Day
@Day
class Day08 : BaseDay() {
override fun part1() = input.lines.value
.map { it.split(" | ")[1].split(" ") }
.sumOf { it.count { it.length in setOf(2, 3, 4, 7) } }
override fun part2() = input.lines.value
.map { it.split(" | ").map { it.split(" ") } }
.sumOf { (pattern, digits) ->
val patterns = decodePatterns(pattern)
digits.map { patterns[it.sortChars()] }.joinToString("").toInt()
}
private fun decodePatterns(patterns: List<String>): Map<String, Int> {
val result = Array(10) { "" }
result[1] = patterns.single { it.length == 2 }
result[7] = patterns.single { it.length == 3 }
result[4] = patterns.single { it.length == 4 }
result[8] = patterns.single { it.length == 7 }
val frequency = patterns.flatMap { it.toCharArray().toList() }.groupBy { it }.mapValues { it.value.size }
val a = (result.letters(7) - result.letters(1)).first()
val b = frequency.findKey { it.value == 6 }
val c = frequency.findKey { it.value == 8 && it.key != a }
val d = frequency.findKey { it.value == 7 && it.key in result.letters(4) }
val e = frequency.findKey { it.value == 4 }
val f = frequency.findKey { it.value == 9 }
result[0] = patterns.find { it.length == 6 && d !in it }!!
result[2] = patterns.find { it.length == 5 && b !in it && f !in it }!!
result[3] = patterns.find { it.length == 5 && b !in it && e !in it }!!
result[5] = patterns.find { it.length == 5 && c !in it && e !in it }!!
result[6] = patterns.find { it.length == 6 && c !in it }!!
result[9] = patterns.find { it.length == 6 && e !in it }!!
return result.mapIndexed { index, value -> value.sortChars() to index }.toMap()
}
private fun Array<String>.letters(number: Int) = this[number].toCharArray().toSet()
private fun <K, V> Map<K, V>.findKey(predicate: (Map.Entry<K, V>) -> Boolean) = entries.find(predicate)!!.key
private fun String.sortChars() = toCharArray().sorted().joinToString("")
}