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:
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 [1m[37mexponentially[0m 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 [1m[37m7[0m 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 [1m[37mthe number of days until it creates a new
+lanternfish[0m.
+
+Furthermore, you reason, a [1m[37mnew[0m 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 [1m[37mnew[0m 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, [1m[37mnot 7[0m (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 [1m[37m5934[0m.
+
+Find a way to simulate lanternfish. [1m[37mHow many lanternfish would there be after 80 days?[0m
+
+
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 [1m[37m26984457539[0m lanternfish!
+
+[1m[37mHow many lanternfish would there be after 256 days?[0m
+
+
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>());
+}
+