advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git

main.rs (2459B)

    1 fn main() {
    2     let input = std::fs::read_to_string("input.txt")
    3         .unwrap()
    4         .trim()
    5         .split('\n')
    6         .map(|s| s.to_string())
    7         .collect::<Vec<_>>();
    8     // 311895
    9     println!("Part 1: {}", part_1(&input));
   10     // 2904180541
   11     println!("Part 2: {}", part_2(&input));
   12 }
   13 
   14 enum MatchResult {
   15     Pair,
   16     Stack,
   17     Illegal(u64),
   18 }
   19 
   20 fn check_match(a: Option<&char>, b: char) -> MatchResult {
   21     match (a, b) {
   22         (Some('('), ')') | (Some('['), ']') | (Some('{'), '}') | (Some('<'), '>') => {
   23             MatchResult::Pair
   24         }
   25         (None | Some('(' | '[' | '{' | '<'), '(' | '[' | '{' | '<') => MatchResult::Stack,
   26         _ => MatchResult::Illegal(match b {
   27             ')' => 3,
   28             ']' => 57,
   29             '}' => 1197,
   30             '>' => 25137,
   31             _ => unreachable!(),
   32         }),
   33     }
   34 }
   35 
   36 fn part_1(input: &Vec<String>) -> u64 {
   37     let mut tot_score = 0;
   38     for line in input {
   39         let mut stack = std::collections::VecDeque::<char>::new();
   40         for ch in line.chars() {
   41             match check_match(stack.back(), ch) {
   42                 MatchResult::Pair => {
   43                     stack.pop_back();
   44                 }
   45                 MatchResult::Stack => {
   46                     stack.push_back(ch);
   47                 }
   48                 MatchResult::Illegal(score) => {
   49                     tot_score += score;
   50                     break;
   51                 }
   52             }
   53         }
   54     }
   55     tot_score
   56 }
   57 
   58 fn part_2(input: &Vec<String>) -> u64 {
   59     let mut scores = Vec::<u64>::new();
   60     'next_line: for line in input {
   61         let mut stack = std::collections::VecDeque::<char>::new();
   62         for ch in line.chars() {
   63             match check_match(stack.back(), ch) {
   64                 MatchResult::Pair => {
   65                     stack.pop_back();
   66                 }
   67                 MatchResult::Stack => {
   68                     stack.push_back(ch);
   69                 }
   70                 MatchResult::Illegal(_) => {
   71                     continue 'next_line;
   72                 }
   73             }
   74         }
   75         let mut score = 0;
   76         for ch in stack.iter().rev() {
   77             score = score * 5
   78                 + match ch {
   79                     '(' => 1,
   80                     '[' => 2,
   81                     '{' => 3,
   82                     '<' => 4,
   83                     _ => unreachable!(),
   84                 };
   85         }
   86         scores.push(score);
   87     }
   88     scores.sort();
   89     scores[scores.len() / 2]
   90 }