diff --git a/src/main.rs b/src/main.rs index 62e8f35..4dfcc7a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,26 +15,36 @@ fn parse_input(input: &'static str) -> Vec { .collect() } -fn solution(fishes: Vec) -> u64 { - let mut day_stat = [0u64; 9]; - +fn solution(fishes: Vec) -> u64 { + let mut fish_stat = [0u64; 9]; for fish in fishes { - day_stat[fish as usize] += 1; + fish_stat[fish as usize] += 1; } - for _ in 0..80 { - day_stat.rotate_left(1); - - day_stat[6] += day_stat[8]; + // Unrolled loop to improve performance + let blocks = N / 9; + for _ in 0..blocks { + fish_stat[7] += fish_stat[0]; + fish_stat[8] += fish_stat[1]; + fish_stat[0] += fish_stat[2]; + fish_stat[1] += fish_stat[3]; + fish_stat[2] += fish_stat[4]; + fish_stat[3] += fish_stat[5]; + fish_stat[4] += fish_stat[6]; + fish_stat[5] += fish_stat[7]; + fish_stat[6] += fish_stat[8]; + } + for day in blocks * 9..N { + fish_stat[(day + 7) % 9] += fish_stat[day % 9]; } - day_stat.into_iter().sum::() + fish_stat.into_iter().sum::() } fn main() { for input in INPUTS { let input = parse_input(input); - let result = solution(input); + let result = solution::<256>(input); println!("Result {}", result); } } @@ -43,7 +53,7 @@ fn main() { fn solution_bench(b: &mut test::Bencher) { let input = parse_input(INPUTS[1]); b.iter(|| { - let result = solution(input.clone()); + let result = solution::<256>(input.clone()); test::black_box(result); }) }