diff --git a/src/bin/day09.rs b/src/bin/day09.rs index 81bb313..dedf28e 100644 --- a/src/bin/day09.rs +++ b/src/bin/day09.rs @@ -8,18 +8,20 @@ struct Day09 { } impl Day09 { - fn find_next(xs: &[i32]) -> i32 { + fn find_next(mut xs: Vec) -> i32 { + let last = *xs.last().unwrap(); + let mut ds = vec![]; + while xs.iter().any(|&x| x != 0) { + for i in 0..xs.len() - 1 { + xs[i] = xs[i + 1] - xs[i]; + } + xs.pop(); - let mut last_row = xs.to_owned(); - while last_row.iter().any(|&x| x != 0) { - let next_row = last_row.windows(2).map(|s| s[1] - s[0]).collect_vec(); - - ds.push(*next_row.last().unwrap()); - last_row = next_row; + ds.push(*xs.last().unwrap()); } - xs.last().unwrap() + ds.iter().rev().sum::() + last + ds.iter().rev().sum::() } } @@ -34,7 +36,7 @@ impl Solution for Day09 { } fn part_1(&mut self) -> Output1 { - self.values.iter().map(|xs| Self::find_next(xs)).sum() + self.values.iter().cloned().map(Self::find_next).sum() } fn part_2(&mut self) -> Output2 { @@ -46,7 +48,7 @@ impl Solution for Day09 { ys }) - .map(|xs| Self::find_next(&xs)) + .map(Self::find_next) .sum() } }