1
Fork 0
advent-of-code/source/year_2021/day_06/mod.rs

78 lines
1.7 KiB
Rust
Raw Permalink Normal View History

2024-01-14 21:04:10 +00:00
//! Day 06 of 2021.
use crate::prelude::*;
2021-12-06 11:16:13 +00:00
2024-01-14 21:04:10 +00:00
/// Shorthand for a [`HashMap`] using [`isize`]s.
2021-12-06 11:16:13 +00:00
type FishMap = HashMap<isize, isize>;
2024-01-14 21:04:10 +00:00
/// Get the solution for day 06 of 2021.
pub fn solution() -> Solution {
Solution::new(Day::new(6, 2021), part_1, part_2)
.with_expected(343441, 1569108373832_i64)
2021-12-06 11:16:13 +00:00
}
2024-01-14 21:04:10 +00:00
/// The logic to solve part one.
fn part_1(input: &str) -> Result<String> {
2021-12-06 11:16:13 +00:00
let mut fishes = parse_fishes(input)?;
for _ in 0..80 {
fishes = simulate_fishes(fishes);
}
Ok(count_fishes(fishes).to_string())
2021-12-06 11:16:13 +00:00
}
2024-01-14 21:04:10 +00:00
/// The logic to solve part two.
fn part_2(input: &str) -> Result<String> {
2021-12-06 11:16:13 +00:00
let mut fishes = parse_fishes(input)?;
for _ in 0..256 {
fishes = simulate_fishes(fishes);
}
Ok(count_fishes(fishes).to_string())
2021-12-06 11:16:13 +00:00
}
2024-01-14 21:04:10 +00:00
/// Parse the [`FishMap`]s from the puzzle input.
2021-12-06 11:16:13 +00:00
fn parse_fishes(input: &str) -> Result<FishMap> {
let mut fishes = FishMap::new();
let individual_fishes = input
.split(',')
2021-12-06 11:16:13 +00:00
.map(str::parse)
.collect::<Result<Vec<_>, _>>()?;
for fish in individual_fishes {
let amount = fishes.entry(fish).or_default();
*amount += 1;
}
Ok(fishes)
}
2024-01-14 21:04:10 +00:00
/// Get the sum of the [`FishMap`] values.
2021-12-06 11:16:13 +00:00
fn count_fishes(fishes: FishMap) -> isize {
2023-12-08 16:38:52 +00:00
fishes.values().sum()
2021-12-06 11:16:13 +00:00
}
2024-01-14 21:04:10 +00:00
/// Simulate the fishes according to the puzzle's instructions.
2021-12-06 11:16:13 +00:00
fn simulate_fishes(fishes: FishMap) -> FishMap {
let mut new_fishes = HashMap::new();
for (mut timer, amount) in fishes {
timer -= 1;
if timer < 0 {
let new_fish = new_fishes.entry(8).or_default();
*new_fish += amount;
let reset_fish = new_fishes.entry(6).or_default();
*reset_fish += amount;
} else {
let current_fish = new_fishes.entry(timer).or_default();
*current_fish += amount;
}
}
new_fishes
}