diff --git a/2020/01/src/main.rs b/2020/01/src/main.rs index 129a8f3..e00f1f1 100644 --- a/2020/01/src/main.rs +++ b/2020/01/src/main.rs @@ -1,3 +1,4 @@ +#![feature(bool_to_option)] use itertools::Itertools; use std::io::BufRead; @@ -10,32 +11,16 @@ fn main() { let p1 = input .iter() .tuple_combinations() - .filter(|(&a, &b)| a + b == 2020) - .map(|(a, b)| a * b) - .next() + .find_map(|(&a, &b)| (a + b == 2020).then_some(a * b)) .unwrap(); println!("Part 1: {}", p1); - /* - smol-brain, n³ solution: - let p2 = input - .tuple_combinations() - .filter(|(&a, &b, &c)| a + b + c == 2020) - .map(|(a, b, c)| a * b * c) - .next() - .unwrap(); - println!("Part 2: {}", p2); - */ - // Ascended n² solution (thanks to Lypheo) + let mut p2_table = vec![None; 2020]; for (&a, &b) in input.iter().tuple_combinations() { if a + b < 2020 { p2_table[a + b] = Some((a, b)) } } - let (a, b) = input - .iter() - .filter_map(|x| p2_table[2020 - x]) - .next() - .unwrap(); + let (a, b) = input.iter().find_map(|x| p2_table[2020 - x]).unwrap(); println!("Part 2: {}", a * b * (2020 - a - b)); }