aoc-rs-2021/src/day_18/mod.rs
Jan Christian Grünhage c49814908e implement day 18
2021-12-18 18:08:53 +01:00

69 lines
1.7 KiB
Rust

mod model;
mod parsing;
use aoc_runner_derive::{aoc, aoc_generator};
use itertools::Itertools;
pub use model::SnailfishNumber;
pub use parsing::parse_number_list;
use yap::IntoTokens;
#[aoc_generator(day18)]
pub fn parse_input(input: &str) -> Vec<SnailfishNumber> {
parse_number_list(&mut input.into_tokens()).unwrap()
}
#[aoc(day18, part1)]
pub fn part1(input: &[SnailfishNumber]) -> isize {
let mut iter = input.iter();
let mut accu = iter.next().unwrap().clone();
for number in iter {
accu = accu + number.clone();
}
accu.magnitude()
}
#[aoc(day18, part2)]
pub fn part2(input: &[SnailfishNumber]) -> isize {
input
.iter()
.cloned()
.cartesian_product(input.iter().cloned())
.filter(|(a, b)| a != b)
.map(|(a, b)| (a + b).magnitude())
.max()
.unwrap()
}
#[cfg(test)]
mod test {
const EXAMPLE_INPUT: &str = "[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
[[[5,[2,8]],4],[5,[[9,9],0]]]
[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
[[[[5,4],[7,7]],8],[[8,3],8]]
[[9,3],[[9,9],[6,[4,9]]]]
[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]";
const RESULT_PART_1: isize = 4140;
const RESULT_PART_2: isize = 3993;
#[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);
}
}