diff options
author | mhsn <mail@mhsn.net> | 2025-04-29 21:03:54 +0100 |
---|---|---|
committer | mhsn <mail@mhsn.net> | 2025-04-29 21:03:54 +0100 |
commit | f4707afdef709b9b8c1767c4b43b315cf448994f (patch) | |
tree | 31b1044e3ae5f7e40301442826facef0983e7431 | |
parent | c7c9a61b15e876b464bf06bf7bb06f8bfb396ad9 (diff) | |
download | aoc-f4707afdef709b9b8c1767c4b43b315cf448994f.tar.gz aoc-f4707afdef709b9b8c1767c4b43b315cf448994f.zip |
2024-03 rust p2
-rw-r--r-- | 2024/03/rust/src/main.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/2024/03/rust/src/main.rs b/2024/03/rust/src/main.rs index 6ea29b3..c2a1a55 100644 --- a/2024/03/rust/src/main.rs +++ b/2024/03/rust/src/main.rs @@ -1,4 +1,4 @@ -use regex::Regex; +use regex::{Captures, Regex}; use std::io::{self, Read}; fn main() -> io::Result<()> { @@ -9,12 +9,36 @@ fn main() -> io::Result<()> { let silver: u64 = re .captures_iter(&program) - .map(|c| c.extract()) - .map(|(_, [x, y])| x.parse::<u64>().unwrap() * y.parse::<u64>().unwrap()) + .map(self::execute_mul_capture) .sum(); - let gold: u64 = 0; + + let gold_re = Regex::new(r"(mul)\(\d{1,3},\d{1,3}\)|(do)\(\)|(don't)\(\)").unwrap(); + + let mut captures = gold_re.captures_iter(&program).map(|c| c.extract::<1>()); + + let mut gold: u64 = 0; + while let Some((func, [name])) = captures.next() { + match name { + "mul" => gold += execute_mul_capture(re.captures(func).unwrap()), + "do" => (), + "don't" => { + while let Some((_, [n])) = captures.next() { + if n == "do" { + break; + } + } + } + _ => unreachable!(), + } + } + println!("silver: {silver}"); println!("gold: {gold}"); return Ok(()); } + +fn execute_mul_capture(captures: Captures) -> u64 { + let (_, [x, y]) = captures.extract(); + x.parse::<u64>().unwrap() * y.parse::<u64>().unwrap() +} |