diff options
author | mhsn <mail@mhsn.net> | 2025-09-02 19:32:03 +0000 |
---|---|---|
committer | mhsn <mail@mhsn.net> | 2025-09-02 19:32:03 +0000 |
commit | c01e5271e0af033f0d8275d6c3f83a5e884cfccc (patch) | |
tree | 3f885c270d6bb4f225ca55efe7a03dda3285cd42 /2024/11/rust/src | |
parent | 56460d6df1324903ce429c619620af33c473dad0 (diff) | |
download | aoc-c01e5271e0af033f0d8275d6c3f83a5e884cfccc.tar.gz aoc-c01e5271e0af033f0d8275d6c3f83a5e884cfccc.zip |
24-11-rs both
Diffstat (limited to '2024/11/rust/src')
-rw-r--r-- | 2024/11/rust/src/main.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/2024/11/rust/src/main.rs b/2024/11/rust/src/main.rs new file mode 100644 index 0000000..e352ec4 --- /dev/null +++ b/2024/11/rust/src/main.rs @@ -0,0 +1,43 @@ +use std::{collections::HashMap, io}; + +fn blink(k @ (s, n): (u64, u64), cache: &mut HashMap<(u64, u64), u64>) -> u64 { + if n == 0 { + return 1; + } + if let Some(v) = cache.get(&k) { + return *v; + } + + // cache this + let v = { + if s == 0 { + return blink((1, n - 1), cache); + } + let digits = s.ilog10() + 1; + let mid = 10u64.pow(digits / 2); + if digits % 2 == 0 { + blink((s / mid, n - 1), cache) + blink((s % mid, n - 1), cache) + } else { + blink((s * 2024, n - 1), cache) + } + }; + + *cache.entry(k).or_insert(v) +} + +fn main() -> io::Result<()> { + let line = io::stdin().lines().flatten().next().unwrap(); + let stones = line + .split_whitespace() + .map(|s| s.parse::<u64>().unwrap()) + .collect::<Vec<_>>(); + + let mut cache = HashMap::new(); + let silver: u64 = stones.iter().map(|s| blink((*s, 25), &mut cache)).sum(); + let gold: u64 = stones.iter().map(|s| blink((*s, 75), &mut cache)).sum(); + + println!("silver: {silver}"); + println!("gold: {gold}"); + + return Ok(()); +} |