63 lines
1.4 KiB
Rust
63 lines
1.4 KiB
Rust
mod model;
|
|
|
|
use aoc_runner_derive::{aoc, aoc_generator};
|
|
use itertools::Itertools;
|
|
|
|
use self::model::Mistake;
|
|
|
|
#[aoc_generator(day10)]
|
|
pub fn parse_input(input: &str) -> Vec<Mistake> {
|
|
input.lines().filter_map(model::find_mistake).collect()
|
|
}
|
|
|
|
#[aoc(day10, part1)]
|
|
pub fn part1(input: &[Mistake]) -> usize {
|
|
input
|
|
.iter()
|
|
.filter_map(|mistake| mistake.unexpected_char_score())
|
|
.sum()
|
|
}
|
|
|
|
#[aoc(day10, part2)]
|
|
pub fn part2(input: &[Mistake]) -> usize {
|
|
let scores: Vec<usize> = input
|
|
.iter()
|
|
.filter_map(|mistake| mistake.autocomplete_score())
|
|
.sorted()
|
|
.collect();
|
|
scores[scores.len() / 2]
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
const EXAMPLE_INPUT: &str = "[({(<(())[]>[[{[]{<()<>>
|
|
[(()[<>])]({[<{<<[]>>(
|
|
{([(<{}[<>[]}>{[]{[(<()>
|
|
(((({<>}<{<{<>}{[]{[]{}
|
|
[[<[([]))<([[{}[[()]]]
|
|
[{[{({}]{}}([{[{{{}}([]
|
|
{<[[]]>}<{[{[{[]{()[[[]
|
|
[<(<(<(<{}))><([]([]()
|
|
<{([([[(<>()){}]>(<<{{
|
|
<{([{{}}[<[[[<>{}]]]>[]]";
|
|
const RESULT_PART_1: usize = 26397;
|
|
const RESULT_PART_2: usize = 288957;
|
|
|
|
#[test]
|
|
fn part1_example() {
|
|
let result = super::part1(&super::parse_input(EXAMPLE_INPUT));
|
|
assert_eq!(result, RESULT_PART_1);
|
|
}
|
|
|
|
#[test]
|
|
fn part2_example() {
|
|
let result = super::part2(&super::parse_input(EXAMPLE_INPUT));
|
|
assert_eq!(result, RESULT_PART_2);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_example() {
|
|
super::parse_input(EXAMPLE_INPUT);
|
|
}
|
|
}
|