diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2022-10-02 21:48:53 +0200 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2022-10-02 21:48:53 +0200 |
| commit | f3833dc637840fca55f253c9f362641499aa42be (patch) | |
| tree | da2a8001fe112d604e0a693946b4e29fcb84d9bb /src/bin/day17.rs | |
| parent | f582b42c798f2f9f80e41e6bcc7ce4d637a239e7 (diff) | |
day17
Diffstat (limited to 'src/bin/day17.rs')
| -rw-r--r-- | src/bin/day17.rs | 41 |
1 files changed, 41 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); + } +} |
