diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2022-08-27 21:26:33 +0200 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2022-08-27 21:26:33 +0200 |
| commit | 1860c9cd4b2f9127902b9ee503209502e3bbfb94 (patch) | |
| tree | 3f7989537da5ac806897ce140c6ae420b8581908 /src/bin | |
| parent | 95ed2adcaddc583dbf4274618d647fcb462e1a4b (diff) | |
day2
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/day2.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/bin/day2.rs b/src/bin/day2.rs new file mode 100644 index 0000000..df1b1d3 --- /dev/null +++ b/src/bin/day2.rs @@ -0,0 +1,47 @@ +fn main() { + let input = advent::read_lines(2); + println!("2a: {}", calculate(&input, area_with_slack)); + println!("2b: {}", calculate(&input, ribbon_length)); +} + +fn area_with_slack(a: u32, b: u32, c: u32) -> u32 { + let x = a * b; + let y = a * c; + let z = b * c; + let slack = *[x, y, z].iter().min().unwrap(); + 2*x + 2*y + 2*z + slack +} + +fn ribbon_length(a: u32, b: u32, c: u32) -> u32 { + let mut lens = Vec::from([a, b, c]); + lens.sort(); + + 2 * lens[0] + 2 * lens[1] + lens.iter().product::<u32>() +} + +fn calculate<T: AsRef<str>>(input: &[T], f: fn(u32, u32, u32) -> u32) -> u32 { + input.iter() + .map(|line| line.as_ref() + .splitn(3, 'x') + .map(|n| n.parse::<u32>().unwrap()) + .collect::<Vec<u32>>()) + .map(|v| f(v[0], v[1], v[2])) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_area() { + assert_eq!(area_with_slack(2,3,4), 58); + assert_eq!(area_with_slack(1,1,10), 43); + } + + #[test] + fn test_ribbon() { + assert_eq!(ribbon_length(2,3,4), 34); + assert_eq!(ribbon_length(1,1,10), 14); + } +} |
