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 { 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); } }