Solve day 10!
This commit is contained in:
parent
ad0f5d63a1
commit
0eaa4648f0
|
@ -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<usize> {
|
||||
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<isize> {
|
||||
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])
|
||||
}
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue