day1 part2

This commit is contained in:
Bill Thiede 2021-11-30 22:00:25 -08:00
parent 6de9b72fae
commit 76da21b3cc

View File

@ -40,6 +40,38 @@
//! In this example, there are 7 measurements that are larger than the previous measurement.
//!
//! How many measurements are larger than the previous measurement?
//! --- Part Two ---
//! Considering every single measurement isn't as useful as you expected: there's just too much noise in the data.
//!
//! Instead, consider sums of a three-measurement sliding window. Again considering the above example:
//!
//! 199 A
//! 200 A B
//! 208 A B C
//! 210 B C D
//! 200 E C D
//! 207 E F D
//! 240 E F G
//! 269 F G H
//! 260 G H
//! 263 H
//! Start by comparing the first and second three-measurement windows. The measurements in the first window are marked A (199, 200, 208); their sum is 199 + 200 + 208 = 607. The second window is marked B (200, 208, 210); its sum is 618. The sum of measurements in the second window is larger than the sum of the first, so this first comparison increased.
//!
//! Your goal now is to count the number of times the sum of measurements in this sliding window increases from the previous sum. So, compare A with B, then compare B with C, then C with D, and so on. Stop when there aren't enough measurements left to create a new three-measurement sum.
//!
//! In the above example, the sum of each three-measurement window is as follows:
//!
//! A: 607 (N/A - no previous sum)
//! B: 618 (increased)
//! C: 618 (no change)
//! D: 617 (decreased)
//! E: 647 (increased)
//! F: 716 (increased)
//! G: 769 (increased)
//! H: 792 (increased)
//! In this example, there are 5 sums that are larger than the previous sum.
//!
//! Consider sums of a three-measurement sliding window. How many sums are larger than the previous sum?
use aoc_runner_derive::{aoc, aoc_generator};
@ -61,6 +93,14 @@ fn part1(depths: &[u32]) -> u32 {
.sum()
}
#[aoc(day1, part2)]
fn part2(depths: &[u32]) -> u32 {
let sums: Vec<u32> = depths.windows(3).map(|s| s.iter().sum()).collect();
sums.windows(2)
.map(|s| if s[0] < s[1] { 1 } else { 0 })
.sum()
}
#[test]
fn test_part1() {
assert_eq!(
@ -79,3 +119,22 @@ fn test_part1() {
7
);
}
#[test]
fn test_part2() {
assert_eq!(
part2(&parse(
r#"199
200
208
210
200
207
240
269
260
263"#
)),
5
);
}