Unify part 1 and 2 better

This commit is contained in:
2023-12-09 19:10:01 +01:00
parent de440ef10e
commit 92c985cbd4

View File

@@ -15,12 +15,11 @@ fn parse_reports(i: &[u8]) -> IResult<&[u8], Vec<Vec<i32>>> {
))(i) ))(i)
} }
fn compute_next(report: &[i32]) -> i32 { fn compute_next<'a>(report: impl IntoIterator<Item = &'a i32>) -> i32 {
let mut deltas = Vec::new(); let mut deltas = Vec::new();
for w in report.windows(2) { for &entry in report {
let mut delta = w[1] - w[0]; let mut delta = entry;
for prev_delta in &mut deltas { for prev_delta in &mut deltas {
let prev = mem::replace(prev_delta, delta); let prev = mem::replace(prev_delta, delta);
delta = delta - prev; delta = delta - prev;
@@ -31,14 +30,15 @@ fn compute_next(report: &[i32]) -> i32 {
} }
} }
let next_step = deltas.drain(..).rev().fold(0, |c, d| c + d); deltas.drain(..).rev().fold(0, |c, d| c + d)
report.last().unwrap() + next_step
} }
pub fn part1(input: &[u8]) -> anyhow::Result<String> { pub fn part1(input: &[u8]) -> anyhow::Result<String> {
let reports = parse_input(input, parse_reports)?; let reports = parse_input(input, parse_reports)?;
let result: i32 = reports.iter().map(|report| compute_next(&report)).sum(); let result: i32 = reports
.iter()
.map(|report| compute_next(report.iter()))
.sum();
Ok(result.to_string()) Ok(result.to_string())
} }
@@ -46,10 +46,7 @@ pub fn part2(input: &[u8]) -> anyhow::Result<String> {
let mut reports = parse_input(input, parse_reports)?; let mut reports = parse_input(input, parse_reports)?;
let result: i32 = reports let result: i32 = reports
.iter_mut() .iter_mut()
.map(|report| { .map(|report| compute_next(report.iter().rev()))
report.reverse();
compute_next(&report)
})
.sum(); .sum();
Ok(result.to_string()) Ok(result.to_string())
} }