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;
|
mod day2;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
mod day20;
|
mod day20;
|
||||||
|
#[allow(dead_code)]
|
||||||
mod day21;
|
mod day21;
|
||||||
|
mod day22;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
mod day3;
|
mod day3;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -43,7 +45,7 @@ mod day8;
|
||||||
mod day9;
|
mod day9;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
day21::day21();
|
day22::day22();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn input(day: u8) -> String {
|
pub fn input(day: u8) -> String {
|
||||||
|
|
Loading…
Reference in New Issue