diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bin/day17.rs | 41 | ||||
| -rw-r--r-- | src/lib.rs | 9 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/bin/day17.rs b/src/bin/day17.rs new file mode 100644 index 0000000..1f3d009 --- /dev/null +++ b/src/bin/day17.rs @@ -0,0 +1,41 @@ +use itertools::Itertools; + +fn main() { + let input = advent::read_numbers(17); + println!("17a: {}", container_fittings(&input, 150)); + println!("17b: {}", minimum_containers(&input, 150)); +} + +fn container_fittings(input: &[u16], target: u16) -> usize { + input.iter() + .powerset() + .filter(|containers| containers.iter().copied().sum::<u16>() == target) + .count() +} + +fn minimum_containers(input: &[u16], target: u16) -> usize { + let min_count = input.iter() + .powerset() + .filter(|containers| containers.iter().copied().sum::<u16>() == target) + .map(|containers| containers.len()) + .min() + .unwrap(); + + input.iter() + .powerset() + .filter(|containers| containers.len() == min_count) + .filter(|containers| containers.iter().copied().sum::<u16>() == target) + .count() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [20, 15, 10, 5, 5]; + assert_eq!(container_fittings(&input, 25), 4); + assert_eq!(minimum_containers(&input, 25), 3); + } +} @@ -1,3 +1,6 @@ +use std::str::FromStr; +use std::fmt::Debug; + pub fn read_file(day: u8) -> String { let filename = format!("inputs/day{}", day); std::fs::read_to_string(filename).unwrap() @@ -8,3 +11,9 @@ pub fn read_lines(day: u8) -> Vec<String> { .map(String::from) .collect() } + +pub fn read_numbers<T: FromStr>(day: u8) -> Vec<T> where <T as FromStr>::Err: Debug { + read_lines(day).iter() + .map(|n| n.parse::<T>().unwrap()) + .collect::<Vec<T>>() +} |
