summaryrefslogtreecommitdiff
path: root/2018/src/bin/day_8.rs
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2022-04-19 20:31:44 +0200
committerJustin Wernick <justin@worthe-it.co.za>2022-04-19 20:31:44 +0200
commitcb3d2db9b82f131ebb36a9b3bea6830bf1a80c0f (patch)
treef516c9f1084b8ed57efe60482a51860e7436550c /2018/src/bin/day_8.rs
parent34c0aa87fada4bf3bc75ff0493e0876e65289697 (diff)
parentcfd9b4f2ad1a09bedf7f764f84448a61faab54a3 (diff)
Merge branch '2018-main'
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()
+ }
+}