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 | |
parent | 56460d6df1324903ce429c619620af33c473dad0 (diff) | |
download | aoc-c01e5271e0af033f0d8275d6c3f83a5e884cfccc.tar.gz aoc-c01e5271e0af033f0d8275d6c3f83a5e884cfccc.zip |
24-11-rs both
Diffstat (limited to '2024/11/rust')
-rw-r--r-- | 2024/11/rust/Cargo.lock | 7 | ||||
-rw-r--r-- | 2024/11/rust/Cargo.toml | 6 | ||||
-rw-r--r-- | 2024/11/rust/src/main.rs | 43 |
3 files changed, 56 insertions, 0 deletions
diff --git a/2024/11/rust/Cargo.lock b/2024/11/rust/Cargo.lock new file mode 100644 index 0000000..22c9989 --- /dev/null +++ b/2024/11/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aoc_2024-11" +version = "0.1.0" diff --git a/2024/11/rust/Cargo.toml b/2024/11/rust/Cargo.toml new file mode 100644 index 0000000..67185f7 --- /dev/null +++ b/2024/11/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "aoc_2024-11" +version = "0.1.0" +edition = "2021" + +[dependencies] 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(()); +} |