summaryrefslogtreecommitdiff
path: root/2018/src/bin/day_8.rs
diff options
context:
space:
mode:
Diffstat (limited to '2018/src/bin/day_8.rs')
-rw-r--r--2018/src/bin/day_8.rs66
1 files changed, 66 insertions, 0 deletions
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<Error>> {
+ let input: Vec<u32> = 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<u32> = (0..num_children)
+ .map(|_| node_value(iter))
+ .collect();
+
+ let metadata: Vec<u32> = (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()
+ }
+}