Guest User

Untitled

a guest
Dec 10th, 2021
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.35 KB | None | 0 0
  1. fn is_opening(c: &char) -> bool {
  2.     c == &'(' || c == &'[' || c == &'{' || c == &'<'
  3. }
  4.  
  5. fn inverse(c: &char) -> char {
  6.     match c {
  7.         '(' => ')',
  8.         '[' => ']',
  9.         '{' => '}',
  10.         '<' => '>',
  11.         // E for error...
  12.         _ => 'E'
  13.     }
  14. }
  15.  
  16. fn aoc_10_part02(incomplete: &Vec<(String, Vec<char>)>) -> i64 {
  17.     let mut results = incomplete.iter().map(|(_line, remaining_stack)| {
  18.         remaining_stack.iter().fold(0, |acc, val| {
  19.             acc * 5 + match val {
  20.                 '(' => 1,
  21.                 '[' => 2,
  22.                 '{' => 3,
  23.                 '<' => 4,
  24.                 _   => 0
  25.             }
  26.         })
  27.     }).collect::<Vec<i64>>();
  28.     results.sort();
  29.     results[results.len() / 2]
  30. }
  31.  
  32. fn aoc_10_part01(lines: &[String]) -> (i32, Vec<(String, Vec<char>)>) {
  33.     let mut stack: Vec<char>;
  34.     let mut corrupted: Vec<(String, char)> = Vec::new();
  35.     let mut incomplete: Vec<(String, Vec<char>)> = Vec::new();
  36.     // let mut valid: Vec<String> = Vec::new();
  37.     let mut is_corrupted: bool;
  38.  
  39.     for line in lines {
  40.         stack = Vec::new();
  41.         is_corrupted = false;
  42.         for c in line.chars() {
  43.             if is_opening(&c) {
  44.                 stack.push(c);
  45.             } else {
  46.                 if let Some(last_opening) = stack.pop() {
  47.                     if inverse(&last_opening) != c {
  48.                         corrupted.push((line.clone(), c));
  49.                         is_corrupted = true;
  50.                         break;
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.  
  56.         if !is_corrupted {
  57.             if !stack.is_empty() {
  58.                 stack.reverse();
  59.                 incomplete.push((line.clone(), stack.clone()));
  60.             }
  61.             /*
  62.             else {
  63.                 valid.push(line.clone());
  64.             }
  65.             */
  66.         }
  67.     }
  68.  
  69.     (corrupted.iter().map(|(_sentence, c)| {
  70.         match c {
  71.             ')' => 3,
  72.             ']' => 57,
  73.             '}' => 1197,
  74.             '>' => 25137,
  75.             _ => 0,
  76.         }
  77.     }).sum(), incomplete)
  78. }
  79.  
  80. fn main() {
  81.     let s = include_str!("../input.txt").lines().map(String::from).collect::<Vec<String>>();
  82.  
  83.     let result = aoc_10_part01(&s);
  84.     println!("Result {}", result.0);
  85.  
  86.     let result = aoc_10_part02(&result.1);
  87.     println!("Result {}", result);
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment