From 37a4505f451470b91855b369f055261bfe3c1e7c Mon Sep 17 00:00:00 2001 From: Spectre Date: Mon, 23 Dec 2024 23:01:30 +0100 Subject: [PATCH] day22 (spaghetti) --- aoc2024/src/day22.rs | 62 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/aoc2024/src/day22.rs b/aoc2024/src/day22.rs index 16d508f..d0f9b8c 100644 --- a/aoc2024/src/day22.rs +++ b/aoc2024/src/day22.rs @@ -1,13 +1,71 @@ +use std::{collections::HashMap, iter::zip}; + +use itertools::Itertools; use shared::{Solution, Answer}; pub struct Day22; impl Solution for Day22 { fn part_1(&self, input: &str) -> Answer { - Answer::Unimplemented + let data = parse(input); + + let out = data.iter().map(|x| { + let mut y = *x; + for _ in 0..2000 { + y = secret(y); + } + y + }).sum(); + + Answer::Number(out) } fn part_2(&self, input: &str) -> Answer { - Answer::Unimplemented + let data = parse(input); + + let prices = data.iter().map(|x| { + let mut p: [i64; 2001] = [0; 2001]; + p[0] = *x as i64; + for i in 1..=2000 { + p[i] = secret(p[i-1] as u64) as i64; + } + p.map(|z| z%10) + }).collect_vec(); + + let deltas = prices.iter().map(|p| p.windows(2).map(|x| x[1] - x[0]).collect_vec()).collect_vec(); + let ones = prices.iter().map(|p| p.iter().skip(4).collect_vec()).collect_vec(); + + let mut finals: HashMap, i64> = HashMap::new(); + + for (d, p) in zip(deltas, ones) { + let mut prices_per_code: HashMap, i64> = HashMap::new(); + for (i, window) in d.windows(4).enumerate() { + if !prices_per_code.contains_key(window) { prices_per_code.insert(window.to_owned(), *p[i]); }; + } + + prices_per_code.iter() + .for_each(|(key, value)| { match finals.get(key) { + None => finals.insert(key.to_owned(), *value), + Some(x) => finals.insert(key.to_owned(), value + x), + }; } + ); + } + + let out: i64 = finals.into_values().max().unwrap(); + + Answer::Number(out as u64) } } + +fn parse(input: &str) -> Vec { + input.trim() + .lines() + .map(|x| x.parse::().unwrap()) + .collect() +} + +fn secret(x: u64) -> u64 { + let x = ((x * 64) ^ x) % 16777216; + let x = ((x / 32) ^ x) % 16777216; + ((x * 2048) ^ x) % 16777216 +}