-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay8.kt
85 lines (69 loc) · 3.29 KB
/
Day8.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package aoc2021.day08
fun readToListsOfOutputs(inputList: List<String>): List<String> {
val outputValues = mutableListOf<String>()
inputList.forEach { line ->
line.split(" | ")[1].split(" ").forEach { outputValues.add(it) }
}
return outputValues
}
fun countUniqueSegments(outputValueList: List<String>): Int {
return outputValueList.count { it.length != 5 && it.length != 6 }
}
fun decodePatterns(inputList: List<String>): Int {
var sum = 0
inputList.forEach { line ->
val split = line.split(" | ")
val sortedPatternsToNum =
getSegmentMap(split).entries.associateBy({ it.value.toSortedSet().joinToString("") }) { it.key }
val sortedOutputValues = mutableListOf<String>()
split[1].split(" ").forEach { sortedOutputValues.add(it.toSortedSet().joinToString("")) }
var outputNumber = ""
sortedOutputValues.forEach {
outputNumber += sortedPatternsToNum[it]
}
sum += outputNumber.toInt()
}
return sum
}
private fun getSegmentMap(split: List<String>): MutableMap<Int, String> {
val patterns = split[0].split(" ").toMutableList()
val numberToPatternMap = mutableMapOf<Int, String>()
(0..9).forEach { numberToPatternMap[it] = "" }
numberToPatternMap[1] = patterns.first { it.length == 2 }
numberToPatternMap[4] = patterns.first { it.length == 4 }
numberToPatternMap[7] = patterns.first { it.length == 3 }
numberToPatternMap[8] = patterns.first { it.length == 7 }
val one = numberToPatternMap[1]!!
numberToPatternMap[6] = patterns.first { _6HasSixSegmentsAndLacksOneSegmentOf1(it, one) }
patterns.remove(numberToPatternMap[6])
numberToPatternMap[9] = patterns.first { _9HasSixSegmenstAndBothOf4Minus1(it, one, numberToPatternMap[4]!!) }
patterns.remove(numberToPatternMap[9])
numberToPatternMap[0] = patterns.first { it.length == 6 }
val topSegmentOf1 = getTopSegmentOf1(numberToPatternMap[6]!!)
numberToPatternMap[5] = patterns.first { _5HasFiveSegmentsAndLacksTopSegmentOf1(it, topSegmentOf1) }
numberToPatternMap[3] = patterns.first { _3HasFiveSegmentsAndBothSegmentsOf1(it, one) }
patterns.removeIf { it == numberToPatternMap[3] || it == numberToPatternMap[5] }
numberToPatternMap[2] = patterns.first { it.length == 5 }
return numberToPatternMap
}
private fun _6HasSixSegmentsAndLacksOneSegmentOf1(pattern: String, one: String): Boolean {
return pattern.length == 6 && one.contains(
toCharSet("abcdefg").subtract(toCharSet(pattern)).first()
)
}
private fun _3HasFiveSegmentsAndBothSegmentsOf1(pattern: String, one: String): Boolean {
return pattern.length == 5 && toCharSet(pattern).containsAll(toCharSet(one))
}
private fun _9HasSixSegmenstAndBothOf4Minus1(pattern: String, one: String, four: String): Boolean {
val fourMinusOne = toCharSet(four).subtract(toCharSet(one))
return pattern.length == 6 && toCharSet(pattern).containsAll(fourMinusOne)
}
private fun _5HasFiveSegmentsAndLacksTopSegmentOf1(pattern: String, topSegmentOf1: Char): Boolean {
return pattern.length == 5 && !pattern.contains(topSegmentOf1)
}
private fun getTopSegmentOf1(six: String): Char {
return toCharSet("abcdefg").subtract(toCharSet(six)).first()
}
fun toCharSet(string: String): Set<Char> {
return string.toCharArray().toSet()
}