diff options
| author | mhsn <mail@mhsn.net> | 2026-03-18 21:48:13 +0000 |
|---|---|---|
| committer | mhsn <mail@mhsn.net> | 2026-03-18 21:48:13 +0000 |
| commit | 498eacd32e3812951d6955b5159f190717860345 (patch) | |
| tree | 4077566169175f6aa11fff09b674ac337090c4fc | |
| parent | e6600d91e1feaaca62a8a2dc542b116dbba887c3 (diff) | |
| download | puzzles-498eacd32e3812951d6955b5159f190717860345.tar.gz puzzles-498eacd32e3812951d6955b5159f190717860345.zip | |
25-11 rust
| -rw-r--r-- | 2025/11/rust/Cargo.lock | 7 | ||||
| -rw-r--r-- | 2025/11/rust/Cargo.toml | 6 | ||||
| -rw-r--r-- | 2025/11/rust/src/main.rs | 84 |
3 files changed, 97 insertions, 0 deletions
diff --git a/2025/11/rust/Cargo.lock b/2025/11/rust/Cargo.lock new file mode 100644 index 0000000..ab53f99 --- /dev/null +++ b/2025/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_2025-11" +version = "0.1.0" diff --git a/2025/11/rust/Cargo.toml b/2025/11/rust/Cargo.toml new file mode 100644 index 0000000..9fbcc03 --- /dev/null +++ b/2025/11/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "aoc_2025-11" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/2025/11/rust/src/main.rs b/2025/11/rust/src/main.rs new file mode 100644 index 0000000..522d7ad --- /dev/null +++ b/2025/11/rust/src/main.rs @@ -0,0 +1,84 @@ +use std::{cell::RefCell, collections::HashMap, io, rc::Rc}; + +#[derive(PartialEq, Eq, Hash, Debug)] +struct Node { + device: String, + dac: bool, + fft: bool, +} + +fn main() { + let adj = io::stdin() + .lines() + .flatten() + .map(|line| { + let (k, v) = line.split_once(": ").unwrap(); + ( + String::from(k), + String::from(v) + .split_whitespace() + .map(String::from) + .collect(), + ) + }) + .collect::<HashMap<String, Vec<String>>>(); + + let cache = Rc::new(RefCell::new(HashMap::new())); + + let silver = paths_from( + Node { + device: String::from("you"), + dac: true, + fft: true, + }, + &adj, + Rc::clone(&cache), + ); + let gold = paths_from( + Node { + device: String::from("svr"), + dac: false, + fft: false, + }, + &adj, + Rc::clone(&cache), + ); + + println!("silver: {silver}"); + println!("gold: {gold}"); +} + +fn paths_from( + curr: Node, + adj: &HashMap<String, Vec<String>>, + cache: Rc<RefCell<HashMap<Node, usize>>>, +) -> usize { + if curr.device == "out" { + if curr.dac && curr.fft { + return 1; + } + return 0; + } + + let Some(&v) = cache.borrow().get(&curr) else { + let paths = adj + .get(&curr.device) + .unwrap() + .iter() + .map(|n| { + paths_from( + Node { + device: n.clone(), + dac: curr.dac || curr.device == "dac", + fft: curr.fft || curr.device == "fft", + }, + adj, + Rc::clone(&cache), + ) + }) + .sum(); + cache.borrow_mut().insert(curr, paths); + return paths; + }; + return v; +} |
