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() } }