Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Created December 8, 2018 12:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0e4ef622/58745de8b2df1540862cd34866bd1cda to your computer and use it in GitHub Desktop.
Save 0e4ef622/58745de8b2df1540862cd34866bd1cda to your computer and use it in GitHub Desktop.
aoc 2018 day8
use std::collections::*;
pub fn part1(input: &str) -> usize {
let mut input = input.split_whitespace().peekable();
let mut entries = Vec::new();
parse_node(input.by_ref(), &mut entries);
entries.into_iter().sum()
}
fn parse_node<'a>(input: &mut impl Iterator<Item = &'a str>, entries: &mut Vec<usize>) {
let child_node_count = input.next().unwrap().parse::<usize>().unwrap();
let metadata_entries_count = input.next().unwrap().parse::<usize>().unwrap();
for _ in 0..child_node_count {
parse_node(input, entries);
}
for _ in 0..metadata_entries_count {
entries.push(input.next().unwrap().parse().unwrap());
}
}
fn build_tree<'a, I: Iterator<Item = &'a str>>(input: &mut I, entries: &mut Vec<(Vec<usize>, Vec<usize>)>) {
let child_node_count = input.next().unwrap().parse::<usize>().unwrap(); // ^ children, metadata
let metadata_entries_count = input.next().unwrap().parse::<usize>().unwrap();
let mut children = Vec::new();
let mut met = Vec::new();
let this_index = entries.len();
entries.push((children, met));
let mut children = Vec::new();
let mut met = Vec::new();
for _ in 0..child_node_count {
children.push(entries.len());
build_tree(input, entries);
}
for _ in 0..metadata_entries_count {
met.push(input.next().unwrap().parse().unwrap());
}
entries[this_index] = (children, met);
}
fn value_of(tree: &[(Vec<usize>, Vec<usize>)], node: usize) -> usize {
if tree[node].0.len() == 0 {
tree[node].1.iter().cloned().sum()
} else {
let mut sum = 0;
for ent in &tree[node].1 {
tree[node].0.get(ent-1)
.map(|&i| sum += value_of(tree, i));
}
sum
}
}
pub fn part2(input: &str) -> impl std::fmt::Display {
let mut input = input.split_whitespace().peekable();
let mut entries = Vec::new();
build_tree(input.by_ref(), &mut entries);
value_of(&entries, 0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment