diff --git a/rust/src/day_02.rs b/rust/src/day_02.rs index c24aa09..0eccd5d 100644 --- a/rust/src/day_02.rs +++ b/rust/src/day_02.rs @@ -13,7 +13,7 @@ impl Day for Day02 { } fn solve(self) -> io::Result { - Ok(self.presents.iter().fold(0u32, |acc, present| acc + present.wrapping_paper()) as i32) + Ok(self.presents.iter().fold(0u32, |acc, present| acc + present.ribbon()) as i32) } } @@ -35,6 +35,10 @@ impl Present { self.surface_area() + self.slack() } + fn ribbon(&self) -> u32 { + *self.perimeters().iter().min().unwrap_or(&0) + self.volume() + } + fn surface_area(&self) -> u32 { self.side_areas().iter().fold(0, |acc, &area| acc + 2 * area) } @@ -43,6 +47,16 @@ impl Present { *self.side_areas().iter().min().unwrap_or(&0) } + fn perimeters(&self) -> Vec { + vec![self.length + self.width, + self.width + self.height, + self.height + self.length ].iter().map(|&x| 2 * x).collect() + } + + fn volume(&self) -> u32 { + self.length * self.width * self.height + } + fn side_areas(&self) -> Vec { vec![self.length * self.width, self.width * self.height, self.height * self.length] } @@ -54,9 +68,11 @@ fn test_day02() { assert_eq!(52, present.surface_area()); assert_eq!(6, present.slack()); assert_eq!(58, present.wrapping_paper()); + assert_eq!(34, present.ribbon()); present = Present::new("1x1x10"); assert_eq!(42, present.surface_area()); assert_eq!(1, present.slack()); assert_eq!(43, present.wrapping_paper()); + assert_eq!(14, present.ribbon()); }