summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/day2.rs47
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);
+ }
+}