|
| 1 | +package net.olegg.aoc.year2024.day19 |
| 2 | + |
| 3 | +import net.olegg.aoc.someday.SomeDay |
| 4 | +import net.olegg.aoc.year2024.DayOf2024 |
| 5 | + |
| 6 | +/** |
| 7 | + * See [Year 2024, Day 19](https://adventofcode.com/2024/day/19) |
| 8 | + */ |
| 9 | +object Day19 : DayOf2024(19) { |
| 10 | + override fun first(): Any? { |
| 11 | + val (rawPatterns, rawTowels) = data.split("\n\n") |
| 12 | + |
| 13 | + val patterns = rawPatterns.split(", ") |
| 14 | + |
| 15 | + return rawTowels.lines().count { towel -> |
| 16 | + val reachable = MutableList(towel.length + 1) { false } |
| 17 | + reachable[0] = true |
| 18 | + |
| 19 | + reachable.indices.forEach { index -> |
| 20 | + if (reachable[index]) { |
| 21 | + val tail = towel.substring(index) |
| 22 | + patterns.forEach { pattern -> |
| 23 | + if (tail.startsWith(pattern)) { |
| 24 | + reachable[index + pattern.length] = true |
| 25 | + } |
| 26 | + } |
| 27 | + } |
| 28 | + } |
| 29 | + |
| 30 | + reachable.last() |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + override fun second(): Any? { |
| 35 | + val (rawPatterns, rawTowels) = data.split("\n\n") |
| 36 | + |
| 37 | + val patterns = rawPatterns.split(", ") |
| 38 | + |
| 39 | + return rawTowels.lines().sumOf { towel -> |
| 40 | + val reachable = MutableList(towel.length + 1) { 0L } |
| 41 | + reachable[0] = 1L |
| 42 | + |
| 43 | + reachable.indices.forEach { index -> |
| 44 | + val count = reachable[index] |
| 45 | + if (count != 0L) { |
| 46 | + val tail = towel.substring(index) |
| 47 | + patterns.forEach { pattern -> |
| 48 | + if (tail.startsWith(pattern)) { |
| 49 | + reachable[index + pattern.length] += count |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + } |
| 54 | + |
| 55 | + reachable.last() |
| 56 | + } |
| 57 | + } |
| 58 | +} |
| 59 | + |
| 60 | +fun main() = SomeDay.mainify(Day19) |
0 commit comments