Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::fs;
- struct AocNode {
- children: Vec<AocNode>,
- meta: Vec<i32>
- }
- impl AocNode {
- fn new(data: Vec<i32>, offset:usize) -> AocNode {
- let child_count = data[offset];
- let meta_count = data[offset+1];
- let mut children:Vec<AocNode> = Vec::new();
- let mut o = offset + 2;
- let mut meta= Vec::new();
- for _i in 0..child_count {
- let n:AocNode = AocNode::new(data.clone(), o);
- o += n.get_length() as usize;
- children.push(n);
- }
- let start = o;
- let end = start + (meta_count as usize);
- for j in start..end {
- meta.push(data[j]);
- }
- return AocNode { children, meta };
- }
- fn get_length(&self) -> i32 {
- let mut length = 2;
- length += self.meta.len() as i32;
- for i in 0..self.children.len() {
- length += self.children[i].get_length();
- }
- return length;
- }
- fn get_part1(&self) -> i32 {
- let mut sum = self.meta.clone().into_iter().sum();
- for i in 0..self.children.len() {
- sum += self.children[i].get_part1();
- }
- return sum;
- }
- fn get_part2(&self) -> i32 {
- if self.children.len() == 0
- {
- return self.meta.clone().into_iter().sum();
- }
- let mut sum = 0;
- for i in 0..self.meta.len() {
- let mut index = self.meta[i] as usize;
- if index > 0
- {
- if self.children.len()>= index
- {
- sum += self.children[index-1].get_part2();
- }
- }
- }
- return sum;
- }
- }
- fn main() {
- let input = fs::read_to_string("input.txt").expect("Error reading the file");
- let input = input.split(" ");
- let vec: Vec<i32> = input.into_iter().map(|n| n.parse::<i32>().unwrap()).collect();
- let offset:usize = 0;
- let n = AocNode::new(vec, offset);
- println!("Part 1: {}", n.get_part1());
- println!("Part 2: {}", n.get_part2());
- }
Advertisement
Add Comment
Please, Sign In to add comment