50 lines
2.2 KiB
Kotlin
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("")
|
|
}
|