blob: b513352e535e532d462dbcc7eabdec0c92f3ac43 (
plain)
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
|
object Day08 {
fun part1(input: List<String>): Int =
input.sumOf {
it
.split("|")[1]
.trim()
.split(" ")
.map(String::length)
.count { len -> len in listOf(2, 3, 4, 7) }
}
fun part2(input: List<String>): Long = input.sumOf { line ->
val (patternString, outputString) = line.split("|").map(String::trim)
val patterns = patternString.split(" ").map(String::toSet)
val one = patterns.first { it.size == 2 }
val four = patterns.first { it.size == 4 }
val seven = patterns.first { it.size == 3 }
val eight = patterns.first { it.size == 7 }
val top = seven - one
val middle = patterns.filter { it.size == 5 }.reduce(Set<Char>::intersect) intersect four
val five = patterns.filter { it.size == 6 }.reduce(Set<Char>::intersect) + middle
val bottom = five - (four + top)
val nine = four + top + bottom
val lowerLeft = eight - nine
val six = five + lowerLeft
val lowerRight = one intersect six
val three = one + top + middle + bottom
val zero = eight - middle
val upperLeft = nine - three
val two = eight - (upperLeft + lowerRight)
val encodings = listOf(zero, one, two, three, four, five, six, seven, eight, nine)
outputString
.split(" ")
.joinToString("") { encodings.indexOf(it.toSet()).toString() }
.toLong()
}
}
fun main() {
val testInput = readInputAsLines("Day08_test")
check(Day08.part1(testInput) == 26)
check(Day08.part2(testInput) == 61229L)
val input = readInputAsLines("Day08")
println(Day08.part1(input))
println(Day08.part2(input))
}
|