diff options
| author | Arne Dußin | 2021-12-08 10:05:20 +0100 |
|---|---|---|
| committer | Arne Dußin | 2021-12-08 10:05:20 +0100 |
| commit | 11b2fd042a72eb93fb0741e2dec7d0ec035178f8 (patch) | |
| tree | bf696b91bdec3785cf9d28e5abab26fd088c017a /src/day_7.rs | |
| parent | 564df712a04cdf65529e288ab9978d8196e8cd9d (diff) | |
| download | aoc2021-11b2fd042a72eb93fb0741e2dec7d0ec035178f8.tar.gz aoc2021-11b2fd042a72eb93fb0741e2dec7d0ec035178f8.zip | |
Yes, I totally didn't forget to commit
Diffstat (limited to 'src/day_7.rs')
| -rw-r--r-- | src/day_7.rs | 58 |
1 files changed, 58 insertions, 0 deletions
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<String>) +{ + let positions: Vec<u32> = input + .iter() + .map(|s| s.split(',').map(|s| s.parse().unwrap())) + .flatten() + .collect(); + + part1(&positions); + part2(&positions); +} |
