From 835a1e0c2deae83d35e45d193e00b57dee1c3e67 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Mon, 6 Dec 2021 08:42:21 -0800 Subject: [PATCH] Fishie fishie fishie. --- src/bin/day6.rs | 127 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/bin/day6.rs diff --git a/src/bin/day6.rs b/src/bin/day6.rs new file mode 100644 index 0000000..d7a857c --- /dev/null +++ b/src/bin/day6.rs @@ -0,0 +1,127 @@ +#[cfg(test)] +const TEST_DATA: &[u8] = &[3, 4, 3, 1, 2]; +const REAL_DATA: &[u8] = &[ + 3, 4, 1, 2, 1, 2, 5, 1, 2, 1, 5, 4, 3, 2, 5, 1, 5, 1, 2, 2, 2, 3, 4, 5, 2, 5, 1, 3, 3, 1, 3, 4, + 1, 5, 3, 2, 2, 1, 3, 2, 5, 1, 1, 4, 1, 4, 5, 1, 3, 1, 1, 5, 3, 1, 1, 4, 2, 2, 5, 1, 5, 5, 1, 5, + 4, 1, 5, 3, 5, 1, 1, 4, 1, 2, 2, 1, 1, 1, 4, 2, 1, 3, 1, 1, 4, 5, 1, 1, 1, 1, 1, 5, 1, 1, 4, 1, + 1, 1, 1, 2, 1, 4, 2, 1, 2, 4, 1, 3, 1, 2, 3, 2, 4, 1, 1, 5, 1, 1, 1, 2, 5, 5, 1, 1, 4, 1, 2, 2, + 3, 5, 1, 4, 5, 4, 1, 3, 1, 4, 1, 4, 3, 2, 4, 3, 2, 4, 5, 1, 4, 5, 2, 1, 1, 1, 1, 1, 3, 1, 5, 1, + 3, 1, 1, 2, 1, 4, 1, 3, 1, 5, 2, 4, 2, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 5, 4, 1, 3, 3, 5, 3, + 2, 5, 5, 2, 1, 5, 2, 4, 4, 1, 5, 2, 3, 1, 5, 3, 4, 1, 5, 1, 5, 3, 1, 1, 1, 4, 4, 5, 1, 1, 1, 3, + 1, 4, 5, 1, 2, 3, 1, 3, 2, 3, 1, 3, 5, 4, 3, 1, 3, 4, 3, 1, 2, 1, 1, 3, 1, 1, 3, 1, 1, 4, 1, 2, + 1, 2, 5, 1, 1, 3, 5, 3, 3, 3, 1, 1, 1, 1, 1, 5, 3, 3, 1, 1, 3, 4, 1, 1, 4, 1, 1, 2, 4, 4, 1, 1, + 3, 1, 3, 2, 2, 1, 2, 5, 3, 3, 1, 1, +]; + +#[derive(Debug, PartialEq)] +struct LanternFishies { + data: [usize; 9], +} + +impl<'a> From<&'a [u8]> for LanternFishies { + fn from(state: &[u8]) -> LanternFishies { + let mut data = [0; 9]; + + for x in state.iter() { + data[*x as usize] += 1; + } + + LanternFishies { data } + } +} + +impl LanternFishies { + fn count(&self) -> usize { + self.data.iter().sum() + } + + fn step(&mut self) { + let base_data = self.data; + + self.data.fill(0); + + self.data[6] += base_data[0]; + self.data[8] += base_data[0]; + for (i, curval) in base_data.iter().enumerate().skip(1) { + self.data[i - 1] += curval; + } + } + + fn steps(&mut self, count: usize) { + for _ in 0..count { + self.step(); + } + } +} + +#[test] +fn example() { + let mut values = LanternFishies::from(TEST_DATA); + assert_eq!( + LanternFishies { + data: [0, 1, 1, 2, 1, 0, 0, 0, 0] + }, + values + ); + assert_eq!(5, values.count()); + values.step(); + assert_eq!( + LanternFishies { + data: [1, 1, 2, 1, 0, 0, 0, 0, 0] + }, + values + ); + assert_eq!(5, values.count()); + values.step(); + assert_eq!( + LanternFishies { + data: [1, 2, 1, 0, 0, 0, 1, 0, 1] + }, + values + ); + assert_eq!(6, values.count()); + values.step(); + assert_eq!( + LanternFishies { + data: [2, 1, 0, 0, 0, 1, 1, 1, 1] + }, + values + ); + assert_eq!(7, values.count()); + values.step(); + assert_eq!( + LanternFishies { + data: [1, 0, 0, 0, 1, 1, 3, 1, 2] + }, + values + ); + assert_eq!(9, values.count()); +} + +#[test] +fn regression() { + let mut test_values = LanternFishies::from(TEST_DATA); + test_values.steps(18); + assert_eq!(26, test_values.count()); + test_values.steps(80 - 18); + assert_eq!(5934, test_values.count()); + test_values.steps(256 - 80); + assert_eq!(26984457539, test_values.count()); + + let mut real_values = LanternFishies::from(REAL_DATA); + real_values.steps(80); + assert_eq!(365131, real_values.count()); + real_values.steps(256 - 80); + assert_eq!(1650309278600, real_values.count()); +} + +fn main() { + let mut fishies = LanternFishies::from(REAL_DATA); + fishies.steps(80); + println!("After 80 days, there will be {} fishies.", fishies.count()); + fishies.steps(256 - 80); + println!( + "After 256 days, there will be {} fishies. (That's a lot of fishies!)", + fishies.count() + ); +}