-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay08.kt
57 lines (44 loc) · 2.43 KB
/
Day08.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package aoc.years.year2021
import aoc.Day
@Year2021
class Day08 : Day() {
override fun solvePart1(input: List<String>): Any {
return input.asSequence()
.map { it.substringAfter("| ") }
.map { it.split(" ") }
.flatten()
.map { it.length }
.filter { it == 2 || it == 3 || it == 4 || it == 7 }
.count()
}
override fun solvePart2(input: List<String>): Any {
return input.map { it.split(" | ") }
.map { Pair(it[0].split(" "), it[1].split(" ")) }
.sumOf { calculateOutputNumber(it.first, it.second) }
}
private fun calculateOutputNumber(signalPatterns: List<String>, outputDigits: List<String>): Int {
val digits = buildDigitMap(signalPatterns)
return outputDigits.map { digits.getDigit(it) }
.reduce { acc, digit -> acc + digit }
.toInt()
}
private fun buildDigitMap(signalPatterns: List<String>): MutableMap<String, String> {
val digits = mutableMapOf<String, String>()
digits["1"] = signalPatterns.first { it.length == 2 }
digits["7"] = signalPatterns.first { it.length == 3 }
digits["4"] = signalPatterns.first { it.length == 4 }
digits["8"] = signalPatterns.first { it.length == 7 }
digits["9"] = signalPatterns.filter { it.length == 6 }.first { it.toSet().containsAll(digits["4"]!!.toSet()) }
digits["0"] = signalPatterns.filter { it.length == 6 }.first { !it.toSet().containsAll(digits["4"]!!.toSet()) && it.toSet().containsAll(digits["1"]!!.toSet()) }
digits["6"] = signalPatterns.filter { it.length == 6 }.first { !it.toSet().containsAll(digits["4"]!!.toSet()) && !it.toSet().containsAll(digits["1"]!!.toSet()) }
digits["3"] = signalPatterns.filter { it.length == 5 }.first { it.toSet().containsAll(digits["1"]!!.toSet()) }
digits["5"] = signalPatterns.filter { it.length == 5 }.first { !it.toSet().containsAll(digits["1"]!!.toSet()) && it.toSet().union(digits["6"]!!.toSet()).size == 6 }
digits["2"] = signalPatterns.filter { it.length == 5 }.first { !it.toSet().containsAll(digits["1"]!!.toSet()) && it.toSet().union(digits["6"]!!.toSet()).size == 7 }
return digits
}
}
private fun MutableMap<String, String>.getDigit(pattern: String): String {
return this.entries.filter { it.value.length == pattern.length }
.first { it.value.toSet().containsAll(pattern.toSet()) }
.key
}