From 1aa90ba9dbb42f03c6272b1a393e3fc9a9a98d9f Mon Sep 17 00:00:00 2001 From: sepia Date: Mon, 23 Dec 2024 00:55:21 -0600 Subject: [PATCH] Day 22 (catching up!) --- src/day22.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +++- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/day22.rs diff --git a/src/day22.rs b/src/day22.rs new file mode 100644 index 0000000..9d90d1d --- /dev/null +++ b/src/day22.rs @@ -0,0 +1,64 @@ +use std::collections::{HashMap, HashSet}; + +type Sequence = (i8, i8, i8, i8); + +pub fn day22() { + let initial_numbers: Vec = crate::input(22) + .lines() + .map(|x| x.parse().unwrap()) + .collect(); + + let mut total_sequence_values: HashMap = HashMap::new(); + for &vendor_secret in initial_numbers.iter() { + let price_data = price_data(vendor_secret); + let mut seen_sequences: HashSet = HashSet::new(); + for window in price_data.windows(4) { + let sequence: Sequence = (window[0].1, window[1].1, window[2].1, window[3].1); + let price = window[3].0; + if !seen_sequences.contains(&sequence) { + *total_sequence_values.entry(sequence.clone()).or_insert(0) += price as u64; + seen_sequences.insert(sequence); + } + } + } + + let (best_sequence, best_price) = total_sequence_values + .into_iter() + .max_by_key(|&(_, price)| price) + .unwrap(); + println!("Best Sequence: {:?}, Price: {}", best_sequence, best_price); + + let mut total: u64 = 0; + for mut number in initial_numbers { + for _ in 0..2000 { + number = evolve_secret_number(number); + } + total += number; + } + println!("Sum of Final Secret Numbers: {total}"); +} + +fn price_data(mut secret: u64) -> Vec<(u8, i8)> { + let mut prices = vec![last_digit(secret)]; + for _ in 0..2000 { + secret = evolve_secret_number(secret); + prices.push(last_digit(secret)); + } + let mut ret: Vec<(u8, i8)> = vec![]; + for i in 1..prices.len() { + let change = prices[i] as i8 - prices[i - 1] as i8; + ret.push((prices[i], change)); + } + ret +} + +fn last_digit(number: u64) -> u8 { + (number % 10) as u8 +} + +fn evolve_secret_number(mut number: u64) -> u64 { + number = (number ^ (64 * number)) % 16777216; + number = (number ^ (number / 32)) % 16777216; + number = (number ^ (number * 2048)) % 16777216; + number +} diff --git a/src/main.rs b/src/main.rs index 29d8a88..604b8e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,9 @@ mod day19; mod day2; #[allow(dead_code)] mod day20; +#[allow(dead_code)] mod day21; +mod day22; #[allow(dead_code)] mod day3; #[allow(dead_code)] @@ -43,7 +45,7 @@ mod day8; mod day9; fn main() { - day21::day21(); + day22::day22(); } pub fn input(day: u8) -> String {