From b5866b2d8a7045e9f08070858bdf3edf31111bd7 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Mon, 13 Dec 2021 22:55:14 +0100 Subject: [PATCH] Modify points in-place Thanks to skius from libera##rust for the idea --- 2021/src/day13.rs | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/2021/src/day13.rs b/2021/src/day13.rs index 11dc513..90a38dd 100644 --- a/2021/src/day13.rs +++ b/2021/src/day13.rs @@ -54,27 +54,19 @@ fn read_input(input: &mut dyn Read) -> (Vec, Vec) { parse_input(&input_buffer).finish().unwrap().1 } -fn apply_fold(dots: &mut Vec, fold: Fold, to_fold: &mut Vec) { +fn apply_fold(dots: &mut Vec, fold: Fold) { match fold { - Fold::X(coord) => dots.retain(|&(x, y)| { - if x < coord { - true - } else { - to_fold.push((2 * coord - x, y)); - false + Fold::X(coord) => dots.iter_mut().for_each(|(x, _)| { + if *x >= coord { + *x = 2 * coord - *x; } }), - Fold::Y(coord) => dots.retain(|&(x, y)| { - if y < coord { - true - } else { - to_fold.push((x, 2 * coord - y)); - false + Fold::Y(coord) => dots.iter_mut().for_each(|(_, y)| { + if *y >= coord { + *y = 2 * coord - *y; } }), } - - dots.append(to_fold); } fn print_dots(dots: &[Coords]) -> String { @@ -98,7 +90,7 @@ fn print_dots(dots: &[Coords]) -> String { pub fn part1(input: &mut dyn Read) -> String { let (mut dots, folds) = read_input(input); - apply_fold(&mut dots, folds[0], &mut Vec::new()); + apply_fold(&mut dots, folds[0]); dots.sort_unstable(); @@ -108,11 +100,9 @@ pub fn part1(input: &mut dyn Read) -> String { pub fn part2(input: &mut dyn Read) -> String { let (mut dots, folds) = read_input(input); - let mut to_fold = Vec::new(); - folds .into_iter() - .for_each(|fold| apply_fold(&mut dots, fold, &mut to_fold)); + .for_each(|fold| apply_fold(&mut dots, fold)); print_dots(&dots) }