diff --git a/aoc2019/src/day01.rs b/aoc2019/src/day01.rs index 4404875..a79dbf1 100644 --- a/aoc2019/src/day01.rs +++ b/aoc2019/src/day01.rs @@ -4,12 +4,16 @@ const INPUT: &str = include_str!("../input/day01.txt"); pub fn run() -> Result<()> { println!("part 1: {}", part1(INPUT)?); + println!("part 2: {}", part2(INPUT)?); Ok(()) } fn fuel_needed(module_weight: u64) -> u64 { - (module_weight / 3) - 2 + match (module_weight / 3).checked_sub(2) { + Some(f) => f, + None => 0, + } } fn part1(input: &str) -> Result { @@ -23,6 +27,29 @@ fn part1(input: &str) -> Result { .sum() } +fn cumulated_fuel_needed(module_weight: u64) -> u64 { + let mut total_fuel = fuel_needed(module_weight); + let mut additional_fuel = fuel_needed(total_fuel); + + while additional_fuel != 0 { + total_fuel += additional_fuel; + additional_fuel = fuel_needed(additional_fuel); + } + + total_fuel +} + +fn part2(input: &str) -> Result { + input + .lines() + .map(|line| line.parse::()) + .map(|w| match w { + Ok(w) => Ok(cumulated_fuel_needed(w)), + Err(e) => Err(Box::from(e)), + }) + .sum() +} + #[cfg(test)] mod tests { use super::*; @@ -39,4 +66,16 @@ mod tests { fn part1_real() { assert_eq!(part1(INPUT).unwrap(), 3268951); } + + #[test] + fn part2_provided() { + assert_eq!(cumulated_fuel_needed(14), 2); + assert_eq!(cumulated_fuel_needed(1969), 966); + assert_eq!(cumulated_fuel_needed(100756), 50346); + } + + #[test] + fn part2_real() { + assert_eq!(part2(INPUT).unwrap(), 4900568); + } }