Simplify day 7
This commit is contained in:
parent
413339cdb8
commit
744aa2fc72
|
@ -2,7 +2,6 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use aoc2021::common::*;
|
use aoc2021::common::*;
|
||||||
use itertools::{Itertools, MinMaxResult};
|
|
||||||
|
|
||||||
const DAY: usize = 7;
|
const DAY: usize = 7;
|
||||||
type Parsed = Vec<usize>;
|
type Parsed = Vec<usize>;
|
||||||
|
@ -11,25 +10,16 @@ fn parse_input(raw: &str) -> Parsed {
|
||||||
parse_nums_comma(raw)
|
parse_nums_comma(raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn min_max(parsed: &Vec<usize>) -> (usize, usize) {
|
|
||||||
match parsed.iter().minmax() {
|
|
||||||
MinMaxResult::MinMax(&min, &max) => (min, max),
|
|
||||||
_ => unreachable!("List not long enough"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn part1(parsed: &Parsed) -> usize {
|
fn part1(parsed: &Parsed) -> usize {
|
||||||
let (min, max) = min_max(parsed);
|
let mut nums = parsed.to_owned();
|
||||||
(min..=max).map(|x| parsed.iter().map(|p| p.abs_diff(x)).sum()).min().unwrap()
|
nums.sort();
|
||||||
}
|
let median = nums[nums.len() / 2];
|
||||||
|
parsed.iter().map(|p| p.abs_diff(median)).sum()
|
||||||
fn sum_to(n: usize) -> usize {
|
|
||||||
(1..=n).sum()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part2(parsed: &Parsed) -> usize {
|
fn part2(parsed: &Parsed) -> usize {
|
||||||
let (min, max) = min_max(parsed);
|
let avg = parsed.iter().sum::<usize>() / parsed.len();
|
||||||
(min..=max).map(|x| parsed.iter().map(|p| p.abs_diff(x)).map(sum_to).sum()).min().unwrap()
|
parsed.iter().map(|p| p.abs_diff(avg)).map(|n| (0..=n).sum::<usize>()).sum()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -46,13 +36,7 @@ mod tests {
|
||||||
const TEST_INPUT: &str = "16,1,2,0,4,2,7,1,2,14";
|
const TEST_INPUT: &str = "16,1,2,0,4,2,7,1,2,14";
|
||||||
|
|
||||||
test!(part1() == 37);
|
test!(part1() == 37);
|
||||||
test!(part2() == 168);
|
|
||||||
bench!(part1() == 328318);
|
bench!(part1() == 328318);
|
||||||
bench!(part2() == 89791146);
|
bench!(part2() == 89791146);
|
||||||
bench_input!(Vec::len => 1000);
|
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))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user