use std::cmp; fn abs_diff(a: u32, b: u32) -> u32 { cmp::max(a, b) - cmp::min(a, b) } fn fuel_required_constant(positions: &[u32], destination: u32) -> u32 { positions.iter().fold(0, |fuel_total, pos| { fuel_total + abs_diff(*pos, destination) }) } fn fuel_required_linear(positions: &[u32], destination: u32) -> u32 { let fuel_required = |pos, dest| { let distance = abs_diff(pos, dest); // Get total fuel cost by adding all integers until distance on top of each // other (distance * (distance + 1)) / 2 }; positions.iter().fold(0, |fuel_total, pos| { fuel_total + fuel_required(*pos, destination) }) } fn part1(positions: &[u32]) { // Stupid approach: Try all positions out let mut min_required = fuel_required_constant(positions, 0); for pos in 1..positions.len() { min_required = cmp::min(fuel_required_constant(positions, pos as u32), min_required); } println!("Solution to part 1: {}", min_required); } fn part2(positions: &[u32]) { // Stupid approach: Try all positions out let mut min_required = fuel_required_linear(positions, 0); for pos in 1..positions.len() { min_required = cmp::min(fuel_required_linear(positions, pos as u32), min_required); } println!("Solution to part 2: {}", min_required); } pub fn run(input: Vec) { let positions: Vec = input .iter() .map(|s| s.split(',').map(|s| s.parse().unwrap())) .flatten() .collect(); part1(&positions); part2(&positions); }