Skip to content

Commit cd19eb9

Browse files
committed
Solve the day 19 puzzle
1 parent d0f6549 commit cd19eb9

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

day19/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "day19"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

day19/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Execute this code via `cargo run <filename>`.
2+
3+
### Observations
4+

day19/src/main.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use std::collections::{HashMap, HashSet};
2+
use std::env;
3+
use std::fs::File;
4+
use std::io::{BufRead, BufReader};
5+
6+
fn main() {
7+
let args = env::args().collect::<Vec<String>>();
8+
if let Ok((patterns, designs)) = get_patterns_and_designs(&args[1]) {
9+
println!("{:?}", solve(&patterns, &designs))
10+
}
11+
}
12+
13+
fn solve(patterns: &HashSet<String>, designs: &Vec<String>) -> (usize, u64) {
14+
fn calculate_num_of_realizations<'a>(
15+
design: &'a str,
16+
patterns: &'a HashSet<String>,
17+
feasible_designs: &mut HashMap<&'a str, u64>,
18+
infeasible_designs: &mut HashSet<&'a str>,
19+
) -> u64 {
20+
if feasible_designs.contains_key(design) {
21+
return feasible_designs[design];
22+
}
23+
24+
let num_of_realizations = patterns
25+
.iter()
26+
.filter_map(|p| design.strip_prefix(p).map(|s| (p, s)))
27+
.map(|(_, suffix)| {
28+
calculate_num_of_realizations(
29+
suffix,
30+
patterns,
31+
feasible_designs,
32+
infeasible_designs,
33+
) as u64
34+
})
35+
.sum::<u64>();
36+
37+
feasible_designs.insert(design, num_of_realizations);
38+
num_of_realizations
39+
}
40+
41+
let mut feasible_designs_to_num_of_realizations = HashMap::<&str, u64>::new();
42+
feasible_designs_to_num_of_realizations.insert("", 1);
43+
for d in designs {
44+
calculate_num_of_realizations(
45+
d,
46+
&patterns,
47+
&mut feasible_designs_to_num_of_realizations,
48+
&mut HashSet::<&str>::new(),
49+
);
50+
}
51+
52+
designs.iter().fold((0, 0), |acc, d| {
53+
let tmp = feasible_designs_to_num_of_realizations[d.as_str()];
54+
(acc.0 + if tmp > 0u64 { 1 } else { 0 }, acc.1 + tmp)
55+
})
56+
}
57+
58+
fn get_patterns_and_designs(filename: &String) -> std::io::Result<(HashSet<String>, Vec<String>)> {
59+
let (patterns, designs) = BufReader::new(File::open(filename)?)
60+
.lines()
61+
.flatten()
62+
.fold(
63+
(HashSet::<String>::new(), vec![]),
64+
|(mut patterns, mut designs), line| {
65+
if line.contains(",") {
66+
patterns.extend(line.split(", ").map(String::from));
67+
} else if !line.is_empty() {
68+
designs.push(line);
69+
}
70+
(patterns, designs)
71+
},
72+
);
73+
74+
Ok((patterns, designs))
75+
}

0 commit comments

Comments
 (0)