Skip to content

Commit d5ff030

Browse files
committed
solve: day19
1 parent e0049a0 commit d5ff030

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"utils",
5-
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10", "day11", "day12", "day13", "day14", "day15", "day16", "day17", "day18",
5+
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10", "day11", "day12", "day13", "day14", "day15", "day16", "day17", "day18", "day19",
66
]
77

88
[workspace.dependencies]

day19/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day19"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_derive'
8+
utils.path = '../utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day19/src/main.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::collections::HashMap;
2+
3+
use aoc_derive::aoc_main;
4+
use itertools::Itertools;
5+
use utils::*;
6+
7+
fn part1<'a>(patterns: &[&'a str], target: &'a str) -> bool {
8+
patterns.iter().any(|pattern| match target.strip_prefix(pattern) {
9+
Some("") => true,
10+
Some(target) => part1(patterns, target),
11+
None => false,
12+
})
13+
}
14+
15+
fn part2<'a>(patterns: &[&'a str], target: &'a str, cache: &mut HashMap<&'a str, usize>) -> usize {
16+
cache.get(&target).copied().unwrap_or_else(|| {
17+
let res = patterns
18+
.iter()
19+
.map(|&pattern| match target.strip_prefix(pattern) {
20+
Some("") => 1,
21+
Some(target) => part2(patterns, target, cache),
22+
None => 0,
23+
})
24+
.sum();
25+
cache.insert(target, res);
26+
res
27+
})
28+
}
29+
30+
#[aoc_main]
31+
fn solve(input: Input) -> impl Into<Solution> {
32+
let (patterns, designs) = input.blocks().collect_tuple().unwrap();
33+
34+
let patterns = patterns.split(", ").collect_vec();
35+
let designs = designs.lines().collect_vec();
36+
37+
let part1 = designs.iter().filter(|design| part1(&patterns, design)).count();
38+
39+
let part2 =
40+
designs.iter().map(|design| part2(&patterns, design, &mut HashMap::new())).sum_usize();
41+
42+
(part1, part2)
43+
}
44+
45+
#[cfg(test)]
46+
mod tests {
47+
use super::*;
48+
#[test]
49+
fn test_examples() {
50+
use utils::assert_example;
51+
assert_example!(
52+
r#"r, wr, b, g, bwu, rb, gb, br
53+
54+
brwrr
55+
bggr
56+
gbbr
57+
rrbgbr
58+
ubwu
59+
bwurrg
60+
brgr
61+
bbrgwb"#,
62+
6,
63+
16
64+
);
65+
}
66+
}

0 commit comments

Comments
 (0)