From 11b2fd042a72eb93fb0741e2dec7d0ec035178f8 Mon Sep 17 00:00:00 2001 From: Arne Dußin Date: Wed, 8 Dec 2021 10:05:20 +0100 Subject: Yes, I totally didn't forget to commit --- src/day_7.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/day_7.rs (limited to 'src/day_7.rs') diff --git a/src/day_7.rs b/src/day_7.rs new file mode 100644 index 0000000..e14512a --- /dev/null +++ b/src/day_7.rs @@ -0,0 +1,58 @@ +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); +} -- cgit v1.2.3-70-g09d2