From cfd9b4f2ad1a09bedf7f764f84448a61faab54a3 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 20:26:02 +0200 Subject: Refile for merging repos --- 2018/src/bin/day_8.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 2018/src/bin/day_8.rs (limited to '2018/src/bin/day_8.rs') diff --git a/2018/src/bin/day_8.rs b/2018/src/bin/day_8.rs new file mode 100644 index 0000000..59813b0 --- /dev/null +++ b/2018/src/bin/day_8.rs @@ -0,0 +1,66 @@ +extern crate advent_of_code_2018; +use advent_of_code_2018::*; + +use std::error::Error; +use std::path::PathBuf; + +use std::slice::Iter; + +// cargo watch -cs "cargo run --release --bin day_8" + +fn main() -> Result<(), Box> { + let input: Vec = read_file(&PathBuf::from("inputs/8.txt")) + .map(|lines| lines[0] + .split_whitespace() + .map(|s| s.parse().unwrap()) + .collect() + )?; + + //println!("Input: {:?}", input); + + let metadata_sum = sum_metadata(&mut input.iter()); + debug!(metadata_sum); + + let value = node_value(&mut input.iter()); + debug!(value); + + Ok(()) +} + +fn sum_metadata(iter: &mut Iter<'_, u32>) -> u32 { + let num_children = iter.next().unwrap().clone(); + let num_metadata = iter.next().unwrap().clone(); + + let children_sum: u32 = (0..num_children) + .map(|_| sum_metadata(iter)) + .sum(); + + let metadata_sum: u32 = (0..num_metadata) + .map(|_| iter.next().unwrap()) + .sum(); + + children_sum + metadata_sum +} + + +fn node_value(iter: &mut Iter<'_, u32>) -> u32 { + let num_children = iter.next().unwrap().clone(); + let num_metadata = iter.next().unwrap().clone(); + + let node_values: Vec = (0..num_children) + .map(|_| node_value(iter)) + .collect(); + + let metadata: Vec = (0..num_metadata) + .map(|_| iter.next().unwrap().clone()) + .collect(); + + if num_children == 0 { + metadata.iter().sum() + } else { + metadata.iter() + .filter(|m| **m > 0 && **m-1 < num_children) + .map(|m| node_values[*m as usize - 1]) + .sum() + } +} -- cgit v1.2.3