aoc-2021-rust

git clone https://git.sinitax.com/sinitax/aoc-2021-rust
Log | Files | Refs | README | sfeed.txt

commit 1d00cb56c55d23e5528051e4af435370230ad54a
parent 3b66b945943dd92bbd1489b88b20d3abb63cccdc
Author: Louis Burda <quent.burda@gmail.com>
Date:   Thu,  9 Dec 2021 22:52:34 +0100

Add day 6 solution

Diffstat:
Asrc/06/Cargo.toml | 8++++++++
Asrc/06/input | 1+
Asrc/06/part1 | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/06/part2 | 10++++++++++
Asrc/06/src/main.rs | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/src/06/Cargo.toml b/src/06/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "aoc" +version = "0.1.0" +edition = "2021" + +[dependencies] +num-bigint = "0.4.3" +num-traits = "*" diff --git a/src/06/input b/src/06/input @@ -0,0 +1 @@ +2,5,2,3,5,3,5,5,4,2,1,5,5,5,5,1,2,5,1,1,1,1,1,5,5,1,5,4,3,3,1,2,4,2,4,5,4,5,5,5,4,4,1,3,5,1,2,2,4,2,1,1,2,1,1,4,2,1,2,1,2,1,3,3,3,5,1,1,1,3,4,4,1,3,1,5,5,1,5,3,1,5,2,2,2,2,1,1,1,1,3,3,3,1,4,3,5,3,5,5,1,4,4,2,5,1,5,5,4,5,5,1,5,4,4,1,3,4,1,2,3,2,5,1,3,1,5,5,2,2,2,1,3,3,1,1,1,4,2,5,1,2,4,4,2,5,1,1,3,5,4,2,1,2,5,4,1,5,5,2,4,3,5,2,4,1,4,3,5,5,3,1,5,1,3,5,1,1,1,4,2,4,4,1,1,1,1,1,3,4,5,2,3,4,5,1,4,1,2,3,4,2,1,4,4,2,1,5,3,4,1,1,2,2,1,5,5,2,5,1,4,4,2,1,3,1,5,5,1,4,2,2,1,1,1,5,1,3,4,1,3,3,5,3,5,5,3,1,4,4,1,1,1,3,3,2,3,1,1,1,5,4,2,5,3,5,4,4,5,2,3,2,5,2,1,1,1,2,1,5,3,5,1,4,1,2,1,5,3,5,2,1,3,1,2,4,5,3,4,3 diff --git a/src/06/part1 b/src/06/part1 @@ -0,0 +1,76 @@ +--- Day 6: Lanternfish --- + +The sea floor is getting steeper. Maybe the sleigh keys got carried this way? + +A massive school of glowing lanternfish swims past. They must spawn quickly to reach such large +numbers - maybe exponentially quickly? You should model their growth rate to be sure. + +Although you know nothing about this specific species of lanternfish, you make some guesses about +their attributes. Surely, each lanternfish creates a new lanternfish once every 7 days. + +However, this process isn't necessarily synchronized between every lanternfish - one lanternfish +might have 2 days left until it creates another lanternfish, while another might have 4. So, you can +model each fish as a single number that represents the number of days until it creates a new +lanternfish. + +Furthermore, you reason, a new lanternfish would surely need slightly longer before it's capable of +producing more lanternfish: two more days for its first cycle. + +So, suppose you have a lanternfish with an internal timer value of 3: + + + - After one day, its internal timer would become 2. + + - After another day, its internal timer would become 1. + + - After another day, its internal timer would become 0. + + - After another day, its internal timer would reset to 6, and it would create a new lanternfish +with an internal timer of 8. + + - After another day, the first lanternfish would have an internal timer of 5, and the second +lanternfish would have an internal timer of 7. + + +A lanternfish that creates a new fish resets its timer to 6, not 7 (because 0 is included as a valid +timer value). The new lanternfish starts with an internal timer of 8 and does not start counting +down until the next day. + +Realizing what you're trying to do, the submarine automatically produces a list of the ages of +several hundred nearby lanternfish (your puzzle input). For example, suppose you were given the +following list: + +3,4,3,1,2 +This list means that the first fish has an internal timer of 3, the second fish has an internal +timer of 4, and so on until the fifth fish, which has an internal timer of 2. Simulating these fish +over several days would proceed as follows: + +Initial state: 3,4,3,1,2 +After 1 day: 2,3,2,0,1 +After 2 days: 1,2,1,6,0,8 +After 3 days: 0,1,0,5,6,7,8 +After 4 days: 6,0,6,4,5,6,7,8,8 +After 5 days: 5,6,5,3,4,5,6,7,7,8 +After 6 days: 4,5,4,2,3,4,5,6,6,7 +After 7 days: 3,4,3,1,2,3,4,5,5,6 +After 8 days: 2,3,2,0,1,2,3,4,4,5 +After 9 days: 1,2,1,6,0,1,2,3,3,4,8 +After 10 days: 0,1,0,5,6,0,1,2,2,3,7,8 +After 11 days: 6,0,6,4,5,6,0,1,1,2,6,7,8,8,8 +After 12 days: 5,6,5,3,4,5,6,0,0,1,5,6,7,7,7,8,8 +After 13 days: 4,5,4,2,3,4,5,6,6,0,4,5,6,6,6,7,7,8,8 +After 14 days: 3,4,3,1,2,3,4,5,5,6,3,4,5,5,5,6,6,7,7,8 +After 15 days: 2,3,2,0,1,2,3,4,4,5,2,3,4,4,4,5,5,6,6,7 +After 16 days: 1,2,1,6,0,1,2,3,3,4,1,2,3,3,3,4,4,5,5,6,8 +After 17 days: 0,1,0,5,6,0,1,2,2,3,0,1,2,2,2,3,3,4,4,5,7,8 +After 18 days: 6,0,6,4,5,6,0,1,1,2,6,0,1,1,1,2,2,3,3,4,6,7,8,8,8,8 + +Each day, a 0 becomes a 6 and adds a new 8 to the end of the list, while each other number decreases +by 1 if it was present at the start of the day. + +In this example, after 18 days, there are a total of 26 fish. After 80 days, there would be a total +of 5934. + +Find a way to simulate lanternfish. How many lanternfish would there be after 80 days? + + diff --git a/src/06/part2 b/src/06/part2 @@ -0,0 +1,10 @@ +--- Part Two --- + +Suppose the lanternfish live forever and have unlimited food and space. Would they take over the +entire ocean? + +After 256 days in the example above, there would be a total of 26984457539 lanternfish! + +How many lanternfish would there be after 256 days? + + diff --git a/src/06/src/main.rs b/src/06/src/main.rs @@ -0,0 +1,70 @@ +use std::fs; +use std::env; +use num_bigint::BigUint; +use num_traits::{FromPrimitive,ToPrimitive,Zero}; + +fn main() { + let args: Vec<String> = env::args().collect(); + if args[1] == "1" { + part1(); + } else if args[1] == "2" { + part2(); + } else { + eprintln!("No such part\n"); + } +} + +fn step_time_p1(les_fish: &mut Vec<u32>) { + let mut new_count: u32 = 0; + for fish in les_fish.iter_mut() { + if *fish == 0 { + *fish = 6; + new_count += 1; + } else { + *fish -= 1; + } + } + for _i in 0..new_count { + les_fish.push(8); + } +} + +fn step_time_p2(cur_fish: &mut Vec<BigUint>) { + for i in 0..8 { + cur_fish.swap(i, i+1); + } + cur_fish[6] = cur_fish[6].clone() + cur_fish[8].clone(); +} + +fn part1() { + let mut fish: Vec<u32> = fs::read_to_string("input").expect("no fish") + .strip_suffix("\n").unwrap() + .split(",") + .map(|x| x.parse().unwrap()).collect(); + + for _i in 0..80 { + step_time_p1(&mut fish); + } + + println!("{}", fish.len()); +} + +fn part2() { + let fish: Vec<BigUint> = fs::read_to_string("input").expect("no fish") + .strip_suffix("\n").unwrap() + .split(",") + .map(|x| x.parse().unwrap()).collect(); + let mut count: Vec<BigUint> = vec![Zero::zero(); 9]; + + for i in 0..9 { + let c = fish.iter().filter(|&x| x.to_u32() == Some(i as u32)).count(); + count[i] = BigUint::from_u32(c as u32).unwrap(); + } + + for _i in 0..256 { + step_time_p2(&mut count); + } + + println!("{}", count.iter().sum::<BigUint>()); +} +