-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay19MonsterMessages.kt
41 lines (35 loc) · 1.22 KB
/
Day19MonsterMessages.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
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()
}
}