From c01e5271e0af033f0d8275d6c3f83a5e884cfccc Mon Sep 17 00:00:00 2001 From: mhsn Date: Tue, 2 Sep 2025 19:32:03 +0000 Subject: 24-11-rs both --- 2024/11/rust/Cargo.lock | 7 +++++++ 2024/11/rust/Cargo.toml | 6 ++++++ 2024/11/rust/src/main.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 2024/11/rust/Cargo.lock create mode 100644 2024/11/rust/Cargo.toml create mode 100644 2024/11/rust/src/main.rs 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::().unwrap()) + .collect::>(); + + 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(()); +} -- cgit v1.2.3