69 lines
1.7 KiB
Rust
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);
|
|
}
|
|
}
|