Day 22 (catching up!)

This commit is contained in:
sepia 2024-12-23 00:55:21 -06:00
parent 3ca6745fb1
commit 1aa90ba9db
2 changed files with 67 additions and 1 deletions

64
src/day22.rs Normal file
View File

@ -0,0 +1,64 @@
use std::collections::{HashMap, HashSet};
type Sequence = (i8, i8, i8, i8);
pub fn day22() {
let initial_numbers: Vec<u64> = crate::input(22)
.lines()
.map(|x| x.parse().unwrap())
.collect();
let mut total_sequence_values: HashMap<Sequence, u64> = HashMap::new();
for &vendor_secret in initial_numbers.iter() {
let price_data = price_data(vendor_secret);
let mut seen_sequences: HashSet<Sequence> = 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
}

View File

@ -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 {