From 744aa2fc729116aa476750b77cddc8ffe8060d01 Mon Sep 17 00:00:00 2001 From: kageru Date: Tue, 7 Dec 2021 14:06:09 +0100 Subject: [PATCH] Simplify day 7 --- 2021/src/bin/day07.rs | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/2021/src/bin/day07.rs b/2021/src/bin/day07.rs index 8040d71..12d1a54 100644 --- a/2021/src/bin/day07.rs +++ b/2021/src/bin/day07.rs @@ -2,7 +2,6 @@ #![feature(test)] extern crate test; use aoc2021::common::*; -use itertools::{Itertools, MinMaxResult}; const DAY: usize = 7; type Parsed = Vec; @@ -11,25 +10,16 @@ fn parse_input(raw: &str) -> Parsed { parse_nums_comma(raw) } -fn min_max(parsed: &Vec) -> (usize, usize) { - match parsed.iter().minmax() { - MinMaxResult::MinMax(&min, &max) => (min, max), - _ => unreachable!("List not long enough"), - } -} - fn part1(parsed: &Parsed) -> usize { - let (min, max) = min_max(parsed); - (min..=max).map(|x| parsed.iter().map(|p| p.abs_diff(x)).sum()).min().unwrap() -} - -fn sum_to(n: usize) -> usize { - (1..=n).sum() + let mut nums = parsed.to_owned(); + nums.sort(); + let median = nums[nums.len() / 2]; + parsed.iter().map(|p| p.abs_diff(median)).sum() } fn part2(parsed: &Parsed) -> usize { - let (min, max) = min_max(parsed); - (min..=max).map(|x| parsed.iter().map(|p| p.abs_diff(x)).map(sum_to).sum()).min().unwrap() + let avg = parsed.iter().sum::() / parsed.len(); + parsed.iter().map(|p| p.abs_diff(avg)).map(|n| (0..=n).sum::()).sum() } fn main() { @@ -46,13 +36,7 @@ mod tests { const TEST_INPUT: &str = "16,1,2,0,4,2,7,1,2,14"; test!(part1() == 37); - test!(part2() == 168); bench!(part1() == 328318); bench!(part2() == 89791146); bench_input!(Vec::len => 1000); - - #[bench] - fn bench_sum_to(b: &mut test::Bencher) { - b.iter(|| assert_eq!(sum_to(test::black_box(1000000)), 500000500000)) - } }