diff --git a/source/day_10/mod.rs b/source/day_10/mod.rs new file mode 100644 index 0000000..baa1285 --- /dev/null +++ b/source/day_10/mod.rs @@ -0,0 +1,91 @@ +use std::collections::VecDeque; + +use color_eyre::Result; + +pub fn solve() -> Result<()> { + let input_data = include_str!("../../data/day_10.txt").trim(); + println!("Day 10 Part 1: {}", part_1(input_data)?); + println!("Day 10 Part 2: {}", part_2(input_data)?); + Ok(()) +} + +fn part_1(input: &str) -> Result { + let mut syntax_error_score = 0; + + for line in input.lines() { + let mut tokens = VecDeque::new(); + + for token in line.chars() { + if ['(', '[', '{', '<'].contains(&token) { + tokens.push_back(token); + continue; + } + + let expected_close = match tokens.pop_back() { + Some('(') => ')', + Some('[') => ']', + Some('{') => '}', + Some('<') => '>', + _ => unreachable!(), + }; + + if token != expected_close { + syntax_error_score += match token { + ')' => 3, + ']' => 57, + '}' => 1197, + '>' => 25137, + _ => unreachable!(), + }; + } + } + } + + Ok(syntax_error_score) +} + +fn part_2(input: &str) -> Result { + let mut scores = vec![]; + + 'line_loop: for line in input.lines() { + let mut line_score = 0; + let mut tokens = VecDeque::new(); + + for token in line.chars() { + if ['(', '[', '{', '<'].contains(&token) { + tokens.push_back(token); + continue; + } + + let expected_close = match tokens.pop_back() { + Some('(') => ')', + Some('[') => ']', + Some('{') => '}', + Some('<') => '>', + _ => unreachable!(), + }; + + if token != expected_close { + continue 'line_loop; + } + } + + for token in tokens.into_iter().rev() { + let token_score = match token { + '(' => 1, + '[' => 2, + '{' => 3, + '<' => 4, + _ => unreachable!(), + }; + + line_score *= 5; + line_score += token_score; + } + + scores.push(line_score); + } + + scores.sort_by(|a, b| a.cmp(b)); + Ok(scores[scores.len() / 2]) +} diff --git a/source/main.rs b/source/main.rs index fecf887..9c8c08f 100644 --- a/source/main.rs +++ b/source/main.rs @@ -11,6 +11,7 @@ mod day_06; mod day_07; mod day_08; mod day_09; +mod day_10; fn main() -> Result<()> { color_eyre::install()?; @@ -27,6 +28,7 @@ fn main() -> Result<()> { day_07::solve, day_08::solve, day_09::solve, + day_10::solve, ]; for day in days {