From 0af0645dda013dd890c87609f23635bc5147be7b Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Sun, 22 Dec 2024 15:12:25 +0100 Subject: [PATCH] Add day22 --- day22/Cargo.lock | 119 ++++++++++++++++++++++++++++++++++++++++++++++ day22/Cargo.toml | 7 +++ day22/src/main.rs | 74 ++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 day22/Cargo.lock create mode 100644 day22/Cargo.toml create mode 100644 day22/src/main.rs diff --git a/day22/Cargo.lock b/day22/Cargo.lock new file mode 100644 index 0000000..321d47d --- /dev/null +++ b/day22/Cargo.lock @@ -0,0 +1,119 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "day22" +version = "0.1.0" +dependencies = [ + "ahash", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/day22/Cargo.toml b/day22/Cargo.toml new file mode 100644 index 0000000..6baa97b --- /dev/null +++ b/day22/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day22" +version = "0.1.0" +edition = "2021" + +[dependencies] +ahash = "0.8.11" diff --git a/day22/src/main.rs b/day22/src/main.rs new file mode 100644 index 0000000..da515ff --- /dev/null +++ b/day22/src/main.rs @@ -0,0 +1,74 @@ +use ahash::{AHashMap, AHashSet}; + +fn parse(input: &str) -> Vec { + input.lines().map(|l| l.parse().unwrap()).collect() +} + +fn evolve_number(curr: &mut usize) { + *curr ^= *curr << 6; + *curr &= 0xffffff; + *curr ^= *curr >> 5; + *curr &= 0xffffff; + *curr ^= *curr << 11; + *curr &= 0xffffff; +} + +fn part1(numbers: &[usize]) -> usize { + numbers + .iter() + .map(|secret| { + let mut res = *secret; + (0..2000).for_each(|_| evolve_number(&mut res)); + res + }) + .sum() +} + +fn part2(numbers: &[usize]) -> isize { + // kinda slow + let mut sequence_bananas: AHashMap<(isize, isize, isize, isize), Vec> = AHashMap::new(); + for number in numbers { + let mut costs_and_changes: Vec<(isize, isize)> = vec![]; + let mut curr_magic = *number; + for _ in 0..2000 { + let cost = curr_magic % 10; + costs_and_changes.push(( + cost as isize, + costs_and_changes.last().map_or(0, |l| cost as isize - l.0), + )); + evolve_number(&mut curr_magic); + } + let sequence_costs = costs_and_changes + .windows(4) + .skip(1) + .map(|w| ((w[0].1, w[1].1, w[2].1, w[3].1), w[3].0)); + let mut seen_sequences = AHashSet::new(); + for (k, v) in sequence_costs { + if seen_sequences.contains(&k) { + continue; + } + sequence_bananas + .entry(k) + .and_modify(|v2| v2.push(v)) + .or_insert(vec![v]); + seen_sequences.insert(k); + } + } + sequence_bananas + .get( + sequence_bananas + .iter() + .max_by(|a, b| a.1.iter().sum::().cmp(&b.1.iter().sum::())) + .unwrap() + .0, + ) + .unwrap() + .iter() + .sum() +} + +fn main() { + let input = parse(include_str!("../input.txt")); + println!("{}", part1(&input)); + println!("{}", part2(&input)); +}