Add day22

This commit is contained in:
Adrian Groh 2024-12-22 15:12:25 +01:00
parent 6dc6f04368
commit 0af0645dda
Signed by: Gobidev
GPG Key ID: 3AA3153E98B0D771
3 changed files with 200 additions and 0 deletions

119
day22/Cargo.lock generated Normal file
View File

@ -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",
]

7
day22/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "day22"
version = "0.1.0"
edition = "2021"
[dependencies]
ahash = "0.8.11"

74
day22/src/main.rs Normal file
View File

@ -0,0 +1,74 @@
use ahash::{AHashMap, AHashSet};
fn parse(input: &str) -> Vec<usize> {
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<isize>> = 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::<isize>().cmp(&b.1.iter().sum::<isize>()))
.unwrap()
.0,
)
.unwrap()
.iter()
.sum()
}
fn main() {
let input = parse(include_str!("../input.txt"));
println!("{}", part1(&input));
println!("{}", part2(&input));
}