Guest User

Untitled

a guest
Dec 8th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.14 KB | None | 0 0
  1. use std::fs;
  2.  
  3. struct AocNode {
  4.     children: Vec<AocNode>,
  5.     meta: Vec<i32>
  6. }
  7.  
  8. impl AocNode {
  9.     fn new(data: Vec<i32>, offset:usize) -> AocNode {
  10.  
  11.         let child_count = data[offset];
  12.         let meta_count = data[offset+1];
  13.         let mut children:Vec<AocNode> = Vec::new();
  14.         let mut o = offset + 2;
  15.         let mut meta= Vec::new();
  16.  
  17.         for _i in 0..child_count {
  18.             let n:AocNode = AocNode::new(data.clone(), o);
  19.             o += n.get_length() as usize;
  20.             children.push(n);
  21.         }
  22.  
  23.         let start = o;
  24.         let end = start + (meta_count as usize);
  25.  
  26.         for j in start..end {
  27.             meta.push(data[j]);
  28.         }
  29.         return AocNode { children, meta };
  30.     }
  31.  
  32.     fn get_length(&self) -> i32 {
  33.         let mut length = 2;
  34.         length += self.meta.len() as i32;
  35.  
  36.         for i in 0..self.children.len() {
  37.             length += self.children[i].get_length();
  38.         }
  39.  
  40.         return length;
  41.     }
  42.  
  43.     fn get_part1(&self) -> i32 {
  44.         let mut sum = self.meta.clone().into_iter().sum();
  45.  
  46.         for i in 0..self.children.len() {
  47.             sum += self.children[i].get_part1();
  48.         }
  49.  
  50.         return sum;
  51.     }
  52.  
  53.     fn get_part2(&self) -> i32 {
  54.         if self.children.len() == 0
  55.             {
  56.                 return self.meta.clone().into_iter().sum();
  57.             }
  58.         let mut sum = 0;
  59.  
  60.         for i in 0..self.meta.len() {
  61.             let mut index = self.meta[i] as usize;
  62.             if index > 0
  63.                 {
  64.                     if self.children.len()>= index
  65.                         {
  66.                             sum += self.children[index-1].get_part2();
  67.                         }
  68.                 }
  69.         }
  70.  
  71.         return sum;
  72.     }
  73.  
  74. }
  75.  
  76. fn main() {
  77.     let input = fs::read_to_string("input.txt").expect("Error reading the file");
  78.  
  79.     let input = input.split(" ");
  80.     let vec: Vec<i32> = input.into_iter().map(|n| n.parse::<i32>().unwrap()).collect();
  81.     let offset:usize = 0;
  82.  
  83.     let n = AocNode::new(vec, offset);
  84.  
  85.     println!("Part 1: {}", n.get_part1());
  86.     println!("Part 2: {}", n.get_part2());
  87. }
Advertisement
Add Comment
Please, Sign In to add comment