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): Map { 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.letters(number: Int) = this[number].toCharArray().toSet() private fun Map.findKey(predicate: (Map.Entry) -> Boolean) = entries.find(predicate)!!.key private fun String.sortChars() = toCharArray().sorted().joinToString("") }