From c2f7e68ad4503cec1e6a8025b6fb65a2f3626237 Mon Sep 17 00:00:00 2001 From: Bauke Date: Mon, 6 Dec 2021 12:16:13 +0100 Subject: [PATCH] Solve day 6! --- source/day_06/mod.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++ source/main.rs | 2 ++ 2 files changed, 74 insertions(+) create mode 100644 source/day_06/mod.rs diff --git a/source/day_06/mod.rs b/source/day_06/mod.rs new file mode 100644 index 0000000..7a04923 --- /dev/null +++ b/source/day_06/mod.rs @@ -0,0 +1,72 @@ +use std::collections::HashMap; + +use color_eyre::Result; + +type FishMap = HashMap; + +pub fn solve() -> Result<()> { + let input_data = include_str!("../../data/day_06.txt").trim(); + println!("Day 06 Part 1: {}", part_1(input_data)?); + println!("Day 06 Part 2: {}", part_2(input_data)?); + Ok(()) +} + +fn part_1(input: &str) -> Result { + let mut fishes = parse_fishes(input)?; + + for _ in 0..80 { + fishes = simulate_fishes(fishes); + } + + Ok(count_fishes(fishes)) +} + +fn part_2(input: &str) -> Result { + let mut fishes = parse_fishes(input)?; + + for _ in 0..256 { + fishes = simulate_fishes(fishes); + } + + Ok(count_fishes(fishes)) +} + +fn parse_fishes(input: &str) -> Result { + let mut fishes = FishMap::new(); + let individual_fishes = input + .split(",") + .map(str::parse) + .collect::, _>>()?; + + for fish in individual_fishes { + let amount = fishes.entry(fish).or_default(); + *amount += 1; + } + + Ok(fishes) +} + +fn count_fishes(fishes: FishMap) -> isize { + fishes.into_iter().map(|(_, amount)| amount).sum() +} + +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 +} diff --git a/source/main.rs b/source/main.rs index 376bdd0..bcad1e2 100644 --- a/source/main.rs +++ b/source/main.rs @@ -7,6 +7,7 @@ mod day_02; mod day_03; mod day_04; mod day_05; +mod day_06; fn main() -> Result<()> { color_eyre::install()?; @@ -19,6 +20,7 @@ fn main() -> Result<()> { day_03::solve, day_04::solve, day_05::solve, + day_06::solve, ]; for day in days {