Solve 2021/06

master
Alfred Melch 3 years ago
parent f885b70c9e
commit 27234dbb63

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day06"
version = "0.1.0"

@ -0,0 +1,8 @@
[package]
name = "day06"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

@ -0,0 +1,84 @@
https://adventofcode.com/2021/day/6
## \--- Day 6: Lanternfish ---
The sea floor is getting steeper. Maybe the sleigh keys got carried this way?
A massive school of glowing
[lanternfish](https://en.wikipedia.org/wiki/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:
[code]
3,4,3,1,2
[/code]
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:
[code]
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
[/code]
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?_

@ -0,0 +1,19 @@
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

@ -0,0 +1 @@
5,1,1,4,1,1,4,1,1,1,1,1,1,1,1,1,1,1,4,2,1,1,1,3,5,1,1,1,5,4,1,1,1,2,2,1,1,1,2,1,1,1,2,5,2,1,2,2,3,1,1,1,1,1,1,1,1,5,1,1,4,1,1,1,5,4,1,1,3,3,2,1,1,1,5,1,1,4,1,1,5,1,1,5,1,2,3,1,5,1,3,2,1,3,1,1,4,1,1,1,1,2,1,2,1,1,2,1,1,1,4,4,1,5,1,1,3,5,1,1,5,1,4,1,1,1,1,1,1,1,1,1,2,2,3,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,5,1,1,1,1,4,1,1,1,1,4,1,1,1,1,3,1,2,1,2,1,3,1,3,4,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,4,1,1,2,2,1,2,4,1,1,3,1,1,1,5,1,3,1,1,1,5,5,1,1,1,1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,5,1,4,3,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,3,1,2,2,1,4,1,5,1,5,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,4,3,1,1,4

@ -0,0 +1,66 @@
use std::collections::VecDeque;
use std::io::stdin;
fn main() {
println!("Hello, world!");
let args: Vec<String> = std::env::args().collect();
if args.len() > 1 && args[1] == "part1" {
part1();
} else {
part2();
}
}
fn part1() {
println!("Part 1:");
let mut input = String::new();
stdin().read_line(&mut input).ok();
dbg!(&input);
let count_fishes = count_fishes_after_days(&input, 80);
dbg!(count_fishes);
}
fn part2() {
println!("Part 2:");
let mut input = String::new();
stdin().read_line(&mut input).ok();
dbg!(&input);
let count_fishes = count_fishes_after_days(&input, 256);
dbg!(count_fishes);
}
fn count_fishes_after_days(input: &str, after_days: i32) -> i64 {
let fishes: Vec<usize> = input
.split(',')
.map(|s| s.trim())
.map(|num| num.parse().unwrap())
.collect();
println!("Fishes: {:?}", fishes);
let mut buf = VecDeque::from([0; 9]);
for fish in fishes {
buf[fish] += 1
}
println!("Initial state: {:?}", buf);
for day in 1..after_days + 1 {
buf.rotate_left(1);
buf[6] += buf[8];
let count_fishes: i64 = buf.iter().sum();
println!(
"After {:>2} days: {:?}, {:>3} fishes",
day, buf, count_fishes
);
}
let count_fishes: i64 = buf.iter().sum();
return count_fishes;
}
Loading…
Cancel
Save