Day 22 (catching up!)
This commit is contained in:
parent
3ca6745fb1
commit
1aa90ba9db
|
@ -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
|
||||
}
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue