Solve 2021/06
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 @@
|
|||||||
|
3,4,3,1,2
|
@ -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…
Reference in New Issue