aboutsummaryrefslogtreecommitdiff
path: root/aoc-2021-kotlin/src/Day08.kt
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))
}