57 lines
1.1 KiB
Rust
57 lines
1.1 KiB
Rust
|
|
use std::io::{self, Read};
|
||
|
|
|
||
|
|
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||
|
|
|
||
|
|
fn get_input_string() -> io::Result<String> {
|
||
|
|
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::<u64>().unwrap())
|
||
|
|
.collect();
|
||
|
|
part1(&mass_list);
|
||
|
|
part2(&mass_list);
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
|
||
|
|
fn part1(mass_list: &Vec<u64>) {
|
||
|
|
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<u64>) {
|
||
|
|
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)
|
||
|
|
}
|
||
|
|
}
|