Add day 6 part 2

This commit is contained in:
kageru 2021-12-06 12:26:12 +01:00
parent 0256625608
commit fc60409b42
2 changed files with 33 additions and 35 deletions

View File

@ -1,42 +1,40 @@
#![feature(test)] #![feature(test)]
extern crate test; extern crate test;
use aoc2021::common::*; use aoc2021::common::*;
use std::iter;
const DAY: usize = 6; const DAY: usize = 6;
const DAYS_PER_CHILD: usize = 6; const FERTILITY_CYCLE: usize = 7;
const DAYS_UNTIL_FERTILE: usize = 2; const DAYS_TO_FERTILITY: usize = 2;
type Parsed = Vec<usize>; type Parsed = Vec<usize>;
fn parse_input(raw: &str) -> Parsed { fn parse_input(raw: &str) -> Parsed {
parse_nums_comma(raw) parse_nums_comma(raw)
} }
fn part1(parsed: &Parsed, generations: usize) -> usize { fn simulate<const LIMIT: usize>(parsed: &Parsed) -> usize {
iter::successors(Some(parsed.to_owned()), |fish| { let mut fish_from_day = [1; LIMIT];
let fish = fish for i in (0..LIMIT).rev() {
.into_iter() let mut next_child = i + FERTILITY_CYCLE + DAYS_TO_FERTILITY;
.flat_map(|n| match n { while next_child < LIMIT {
0 => vec![DAYS_PER_CHILD, DAYS_PER_CHILD + DAYS_UNTIL_FERTILE], fish_from_day[i] += fish_from_day[next_child];
&n => vec![n - 1], next_child += FERTILITY_CYCLE;
}) }
.collect(); }
Some(fish) let mut adult_from_day = vec![1; LIMIT];
}) for i in (0..LIMIT).rev() {
.take(generations + 1) let mut child_at = i + FERTILITY_CYCLE;
.last() while child_at < LIMIT {
.unwrap() adult_from_day[i] += fish_from_day[child_at];
.len() child_at += FERTILITY_CYCLE;
} }
}
fn part2(parsed: &Parsed) -> usize { parsed.iter().map(|&i| adult_from_day[i] + fish_from_day[i]).sum()
unimplemented!()
} }
fn main() { fn main() {
let input = parse_input(&read_file(DAY)); let input = parse_input(&read_file(DAY));
println!("Part 1: {}", part1(&input, 80)); println!("Part 1: {}", simulate::<80>(&input));
println!("Part 2: {}", part2(&input)); println!("Part 2: {}", simulate::<256>(&input));
} }
#[cfg(test)] #[cfg(test)]
@ -46,9 +44,9 @@ mod tests {
const TEST_INPUT: &str = "3,4,3,1,2"; const TEST_INPUT: &str = "3,4,3,1,2";
test!(part1(80) == 5934); test!(simulate<80>() == 5934);
test!(part2() == 0); test!(simulate<256>() == 26984457539);
bench!(part1(80) == 364461); bench!(simulate<80>() == 365862);
bench!(part2() == 0); bench!(simulate<256>() == 1653250886439);
bench_input!(Vec::len => 0); bench_input!(Vec::len => 300);
} }

View File

@ -1,12 +1,12 @@
#[macro_export] #[macro_export]
macro_rules! bench { macro_rules! bench {
($part: ident ($($param: expr),*) == $expected:expr) => { ($part: ident $(<$gen: literal>)? ($($param: expr),*) == $expected:expr) => {
paste::paste! { paste::paste! {
#[bench] #[bench]
fn [<$part _bench>](b: &mut test::Bencher) { fn [<$part $($gen)? _bench>](b: &mut test::Bencher) {
let raw = &read_file(DAY); let raw = &read_file(DAY);
let input = parse_input(&raw); let input = parse_input(&raw);
b.iter(|| assert_eq!($part(test::black_box(&input)$(, $param)*), $expected)); b.iter(|| assert_eq!($part $(::<$gen>)? (test::black_box(&input)$(, $param)*), $expected));
} }
} }
}; };
@ -25,12 +25,12 @@ macro_rules! bench_input {
#[macro_export] #[macro_export]
macro_rules! test { macro_rules! test {
($part: ident ($($param: expr),*) == $expected:expr) => { ($part: ident $(<$gen: literal>)? ($($param: expr),*) == $expected:expr) => {
paste::paste! { paste::paste! {
#[test] #[test]
fn [<$part _test>]() { fn [<$part $($gen)? _test>]() {
let input = parse_input(TEST_INPUT); let input = parse_input(TEST_INPUT);
assert_eq!($part(&input$(, $param)*), $expected); assert_eq!($part $(::<$gen>)? (&input$(, $param)*), $expected);
} }
} }
}; };