summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--2024/03/rust/src/main.rs32
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()
+}