use std::io::{self, Read}; type Result = std::result::Result>; fn get_input_string() -> io::Result { let mut buffer = String::new(); io::stdin().read_to_string(&mut buffer)?; Ok(buffer) } fn main() -> Result<()> { let mass_list: Vec<_> = get_input_string()? .split("\n") .filter(|n| !n.is_empty()) .map(|n| n.parse::().unwrap()) .collect(); part1(&mass_list); part2(&mass_list); Ok(()) } fn part1(mass_list: &Vec) { let total: u64 = mass_list.iter() .copied() .map(fuel_req) .sum(); println!("Part 1: {}", total); } fn fuel_req(mass: u64) -> u64 { let frac = mass / 3; if frac <= 2 { 0 } else { frac - 2 } } fn part2(mass_list: &Vec) { let total: u64 = mass_list.iter() .copied() .map(full_fuel_req) .sum(); println!("Part 2: {}", total); } fn full_fuel_req(mass: u64) -> u64 { let req = fuel_req(mass); if req == 0 { 0 } else { req + full_fuel_req(req) } }