From 57bd3fd46448fc461a2e977c4f08f1341005ee6e Mon Sep 17 00:00:00 2001 From: Lucas Resch Date: Sat, 9 Dec 2023 14:45:23 +0100 Subject: [PATCH] 2023-09: Solve second puzzle --- 2023-rust/README.md | 18 +++++++++--------- 2023-rust/src/bin/09.rs | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/2023-rust/README.md b/2023-rust/README.md index af50556..a457c19 100644 --- a/2023-rust/README.md +++ b/2023-rust/README.md @@ -9,17 +9,17 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www. | Day | Part 1 | Part 2 | | :---: | :---: | :---: | -| [Day 1](./src/bin/01.rs) | `64.6µs` | `651.1µs` | -| [Day 2](./src/bin/02.rs) | `42.9µs` | `50.4µs` | -| [Day 3](./src/bin/03.rs) | `445.6µs` | `428.1µs` | -| [Day 4](./src/bin/04.rs) | `103.4µs` | `19.7ms` | +| [Day 1](./src/bin/01.rs) | `65.9µs` | `668.0µs` | +| [Day 2](./src/bin/02.rs) | `42.1µs` | `48.7µs` | +| [Day 3](./src/bin/03.rs) | `429.6µs` | `418.1µs` | +| [Day 4](./src/bin/04.rs) | `96.3µs` | `19.4ms` | | [Day 5](./src/bin/05.rs) | `30.3µs` | `26.5s` | -| [Day 6](./src/bin/06.rs) | `642.0ns` | `37.2ms` | -| [Day 7](./src/bin/07.rs) | `205.1µs` | `-` | -| [Day 8](./src/bin/08.rs) | `257.5µs` | `1.7ms` | -| [Day 9](./src/bin/09.rs) | `101.1µs` | `-` | +| [Day 6](./src/bin/06.rs) | `573.0ns` | `40.4ms` | +| [Day 7](./src/bin/07.rs) | `200.0µs` | `-` | +| [Day 8](./src/bin/08.rs) | `256.2µs` | `1.7ms` | +| [Day 9](./src/bin/09.rs) | `106.4µs` | `110.1µs` | -**Total: 26560.95ms** +**Total: 26563.94ms** ## Usage diff --git a/2023-rust/src/bin/09.rs b/2023-rust/src/bin/09.rs index 6f9c2b4..c517396 100644 --- a/2023-rust/src/bin/09.rs +++ b/2023-rust/src/bin/09.rs @@ -8,16 +8,41 @@ pub fn part_one(input: &str) -> Option { Some( sensor_readings .iter() - .map(|readings| extrapolate(readings)) + .map(|readings| extrapolate_forwards(readings)) .sum(), ) } -pub fn part_two(input: &str) -> Option { - None +pub fn part_two(input: &str) -> Option { + let sensor_readings = parse_input(input); + + Some( + sensor_readings + .iter() + .map(|readings| extrapolate_backwards(readings)) + .sum(), + ) } -fn extrapolate(readings: &[i32]) -> i32 { +fn extrapolate_forwards(readings: &[i32]) -> i32 { + // Add the last row of differences together to extrapolate the next number + calc_differences(readings) + .iter() + .map(|differences| differences.last().unwrap()) + .sum() +} + +fn extrapolate_backwards(readings: &[i32]) -> i32 { + let differences = calc_differences(readings); + differences + .iter() + .map(|differences| differences.first().copied().unwrap()) + .rev() + .reduce(|acc, number| number - acc) + .unwrap() +} + +fn calc_differences(readings: &[i32]) -> Vec> { let mut differences: Vec> = vec![readings.to_vec()]; let mut i = 0; @@ -35,11 +60,7 @@ fn extrapolate(readings: &[i32]) -> i32 { i += 1; } - // Add the last row of differences together to extrapolate the next number differences - .iter() - .map(|differences| differences.last().unwrap()) - .sum() } fn parse_input(input: &str) -> Vec> { @@ -66,6 +87,6 @@ mod tests { #[test] fn test_part_two() { let result = part_two(&advent_of_code::template::read_file("examples", DAY)); - assert_eq!(result, None); + assert_eq!(result, Some(2)); } }