diff --git a/2021/src/day1.rs b/2021/src/day1.rs index f913a8f..08e0caa 100644 --- a/2021/src/day1.rs +++ b/2021/src/day1.rs @@ -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 = 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 + ); +}