-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay19MonsterMessages.kt
More file actions
42 lines (36 loc) · 1.21 KB
/
Day19MonsterMessages.kt
File metadata and controls
42 lines (36 loc) · 1.21 KB
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
package adventofcode.year2020
import adventofcode.Puzzle
import adventofcode.PuzzleInput
class Day19MonsterMessages(
customInput: PuzzleInput? = null,
) : Puzzle(customInput) {
private val rules by lazy {
input
.split("\n\n")
.first()
.lines()
.map { it.replace("\"", "") }
.map { it.split(": ") }
.associate { it.first() to it.last() }
}
private val messages by lazy { input.split("\n\n").last().lines() }
override fun partOne(): Int {
val rule0 =
generateSequence(rules["0"]) { previous ->
previous
.split(" ")
.joinToString(" ") {
when (val ref = NUMBER_REGEX.find(it)) {
null -> it
else -> it.replace(ref.value, "(${rules[ref.value]})")
}
}
}.first { regex -> regex.split(" ").none { it.contains(NUMBER_REGEX) } }
.replace(" ", "")
.toRegex()
return messages.count { rule0.matches(it) }
}
companion object {
private val NUMBER_REGEX = """\d+""".toRegex()
}
}