summaryrefslogtreecommitdiff
path: root/src/day_7.rs
diff options
context:
space:
mode:
authorArne Dußin2021-12-08 10:05:20 +0100
committerArne Dußin2021-12-08 10:05:20 +0100
commit11b2fd042a72eb93fb0741e2dec7d0ec035178f8 (patch)
treebf696b91bdec3785cf9d28e5abab26fd088c017a /src/day_7.rs
parent564df712a04cdf65529e288ab9978d8196e8cd9d (diff)
downloadaoc2021-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.rs58
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);
+}