From 49650c8a28bf90eb0503d78eb70d220ef2704c6a Mon Sep 17 00:00:00 2001 From: YK Date: Tue, 3 Dec 2024 22:58:22 +0300 Subject: [PATCH] solution: day 3 --- src/days.rs | 2 +- src/days/d3.rs | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/days/d3.rs diff --git a/src/days.rs b/src/days.rs index c31753b..0958165 100644 --- a/src/days.rs +++ b/src/days.rs @@ -1,6 +1,6 @@ pub mod d1; pub mod d2; -// pub mod d3; +pub mod d3; // pub mod d4; // pub mod d5; // pub mod d6; diff --git a/src/days/d3.rs b/src/days/d3.rs new file mode 100644 index 0000000..10d25d1 --- /dev/null +++ b/src/days/d3.rs @@ -0,0 +1,102 @@ +#![allow(unused_imports)] +use crate::prelude::*; + +pub type I = &'static str; +pub type O = u64; + +fn _silver (data: I) -> O { + let mut sum = 0; + + let mut data = data; + + while let Some(f) = data.find("mul(") { + data = &data[f..]; + let start = 4; + let Some(fin) = data.find(')') else { break }; + let inside = &data[start..fin]; + if let Some((left, right)) = inside.split_once(',') { + if let Ok(left) = left.parse::() && let Ok(right) = right.parse::() { + sum += left * right; + } else { + data = &data[start..]; + continue; + } + } else { + data = &data[start..]; + continue; + } + data = &data[fin+1..]; + } + sum +} + +fn _gold (data: I) -> O { + let mut sum = 0; + let mut enabled = true; + let mut data = data; + + loop { + let mul = data.find("mul(").unwrap_or(usize::MAX); + let _do = data.find("do()").unwrap_or(usize::MAX); + let dont = data.find("don't()").unwrap_or(usize::MAX); + + if [mul, _do, dont].iter().all(|&e| e == usize::MAX) { + break; + } + + let next = mul.min(_do).min(dont); + + if next == mul { + data = &data[next..]; + let start = 4; + let Some(fin) = data.find(')') else { break }; + let inside = &data[start..fin]; + if let Some((left, right)) = inside.split_once(',') { + if let Ok(left) = left.parse::() && let Ok(right) = right.parse::() { + if enabled { + sum += left * right; + } + } else { + data = &data[start..]; + continue; + } + } else { + data = &data[start..]; + continue; + } + data = &data[fin+1..]; + } else if next == _do { + enabled = true; + data = &data[next+4..]; + } else if next == dont { + enabled = false; + data = &data[next+7..]; + } + } + sum +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> &'static str { + inc!(3) + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(data); + + assert_eq!(ans, 181345830) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(data); + + assert_eq!(ans, 98729041) + } +}