Solve 19
This commit is contained in:
parent
b2311337a1
commit
4438d4a617
1 changed files with 50 additions and 0 deletions
50
src/bin/19.rs
Normal file
50
src/bin/19.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use aoc::*;
|
||||||
|
use cached::proc_macro::cached;
|
||||||
|
use cached::UnboundCache;
|
||||||
|
|
||||||
|
const INPUT: &str = include_str!("../../input/19");
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
assert_example!(part1, "19-test", 6);
|
||||||
|
println!("Part 1: {}", part1(INPUT));
|
||||||
|
assert_example!(part2, "19-test", 16);
|
||||||
|
println!("Part 2: {}", part2(INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> usize {
|
||||||
|
let (available, requested) = parse(input);
|
||||||
|
requested
|
||||||
|
.filter(|requested| combinations(requested, &available) > 0)
|
||||||
|
.count()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> usize {
|
||||||
|
let (available, requested) = parse(input);
|
||||||
|
requested
|
||||||
|
.map(|requested| combinations(requested, &available))
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cached(
|
||||||
|
type = "UnboundCache<(String, usize), usize>",
|
||||||
|
create = "{ UnboundCache::new() }",
|
||||||
|
convert = r#"{ (requested.to_string(), available.len()) }"#
|
||||||
|
)]
|
||||||
|
fn combinations(requested: &str, available: &[&str]) -> usize {
|
||||||
|
if requested.is_empty() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
available
|
||||||
|
.iter()
|
||||||
|
.flat_map(|available| requested.strip_prefix(available))
|
||||||
|
.map(|requested| combinations(requested, available))
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse(input: &str) -> (Vec<&str>, impl Iterator<Item = &str> + use<'_>) {
|
||||||
|
let (available, requested) = input.split_once("\n\n").unwrap();
|
||||||
|
let available = available.split(", ").collect();
|
||||||
|
let requested = requested.lines();
|
||||||
|
(available, requested)
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue