From f965a52d4034fd5c159dceb6567fbb79932957d2 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 8 Dec 2018 07:30:24 +0200 Subject: Day 8: Recursing the tree --- src/bin/day_8.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) (limited to 'src/bin/day_8.rs') diff --git a/src/bin/day_8.rs b/src/bin/day_8.rs index ff1db8a..59813b0 100644 --- a/src/bin/day_8.rs +++ b/src/bin/day_8.rs @@ -4,15 +4,63 @@ 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 = read_file(&PathBuf::from("inputs/8.txt"))?; - - println!("Input: {:?}", input); + 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