Skip to content

Commit 69d23c7

Browse files
committed
19th day
1 parent 17c17d3 commit 69d23c7

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

Diff for: data/examples/19.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
r, wr, b, g, bwu, rb, gb, br
2+
3+
brwrr
4+
bggr
5+
gbbr
6+
rrbgbr
7+
ubwu
8+
bwurrg
9+
brgr
10+
bbrgwb

Diff for: src/bin/19.rs

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
advent_of_code::solution!(19);
2+
3+
use advent_of_code::maneatingape::hash::*;
4+
5+
fn parse_data(input: &str) -> (Vec<&str>, Vec<&str>) {
6+
let (left, right) = input.split_once("\n\n").unwrap();
7+
8+
let towels = left.split(", ").collect();
9+
let messages = right.lines().collect();
10+
11+
(towels, messages)
12+
}
13+
14+
fn validate_message(message: &str, towels: &[&str]) -> bool {
15+
if message.is_empty() {
16+
return true;
17+
}
18+
19+
towels
20+
.iter()
21+
.filter(|towel| message.len() >= towel.len())
22+
.filter(|towel| &&&message[..towel.len()] == towel)
23+
.any(|towel| validate_message(&message[towel.len()..], towels))
24+
}
25+
26+
fn count_valid_message(cache: &mut FastMap<String, u64>, message: &str, towels: &[&str]) -> u64 {
27+
if message.is_empty() {
28+
return 1;
29+
}
30+
31+
if let Some(&result) = cache.get(message) {
32+
return result;
33+
}
34+
35+
towels
36+
.iter()
37+
.filter(|towel| message.len() >= towel.len())
38+
.filter(|towel| &&&message[..towel.len()] == towel)
39+
.map(|towel| {
40+
let result = count_valid_message(cache, &message[towel.len()..], towels);
41+
cache.insert(String::from(&message[towel.len()..]), result);
42+
result
43+
})
44+
.sum()
45+
}
46+
47+
pub fn part_one(input: &str) -> Option<u32> {
48+
let (towels, messages) = parse_data(input);
49+
50+
let result = messages
51+
.into_iter()
52+
.filter(|message| validate_message(message, &towels))
53+
.count() as u32;
54+
55+
Some(result)
56+
}
57+
58+
pub fn part_two(input: &str) -> Option<u64> {
59+
let (towels, messages) = parse_data(input);
60+
61+
let mut cache = FastMap::new();
62+
63+
let result = messages
64+
.into_iter()
65+
.map(|message| count_valid_message(&mut cache, message, &towels))
66+
.sum();
67+
68+
Some(result)
69+
}
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
75+
#[test]
76+
fn test_part_one() {
77+
let input = advent_of_code::template::read_file("examples", DAY);
78+
let result = part_one(&input);
79+
assert_eq!(result, Some(6));
80+
}
81+
82+
#[test]
83+
fn test_part_two() {
84+
let intput = advent_of_code::template::read_file("examples", DAY);
85+
let result = part_two(&intput);
86+
assert_eq!(result, Some(16));
87+
}
88+
}

0 commit comments

Comments
 (0)