summaryrefslogtreecommitdiff
path: root/2024/03/rust
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-08-17 17:00:55 +0100
committermhsn <mail@mhsn.net>2025-08-17 17:00:55 +0100
commit64acaacb6fc13007a8c399e95e2984422f1496ca (patch)
tree62437b66b48c6df87dc311a4834a973a413b930b /2024/03/rust
parentd63b65d501b9f0844dbde46037930f727bb115c6 (diff)
downloadaoc-64acaacb6fc13007a8c399e95e2984422f1496ca.tar.gz
aoc-64acaacb6fc13007a8c399e95e2984422f1496ca.zip
rust 2024 03: remove regex and redo
Diffstat (limited to '2024/03/rust')
-rw-r--r--2024/03/rust/Cargo.lock47
-rw-r--r--2024/03/rust/Cargo.toml3
-rw-r--r--2024/03/rust/src/main.rs82
3 files changed, 53 insertions, 79 deletions
diff --git a/2024/03/rust/Cargo.lock b/2024/03/rust/Cargo.lock
index 705a257..a7a6f57 100644
--- a/2024/03/rust/Cargo.lock
+++ b/2024/03/rust/Cargo.lock
@@ -3,52 +3,5 @@
version = 4
[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
name = "aoc_2024-03"
version = "0.1.0"
-dependencies = [
- "regex",
-]
-
-[[package]]
-name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "regex"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
diff --git a/2024/03/rust/Cargo.toml b/2024/03/rust/Cargo.toml
index ba499a8..97ec307 100644
--- a/2024/03/rust/Cargo.toml
+++ b/2024/03/rust/Cargo.toml
@@ -2,6 +2,3 @@
name = "aoc_2024-03"
version = "0.1.0"
edition = "2021"
-
-[dependencies]
-regex = "1.11.1"
diff --git a/2024/03/rust/src/main.rs b/2024/03/rust/src/main.rs
index c2a1a55..b268463 100644
--- a/2024/03/rust/src/main.rs
+++ b/2024/03/rust/src/main.rs
@@ -1,44 +1,68 @@
-use regex::{Captures, Regex};
use std::io::{self, Read};
+#[derive(Debug)]
+enum Instruction {
+ Do,
+ Dont,
+ Mul(u64, u64),
+}
+
+impl From<&Instruction> for u64 {
+ fn from(val: &Instruction) -> Self {
+ match val {
+ Instruction::Mul(x, y) => x * y,
+ _ => 0,
+ }
+ }
+}
+
fn main() -> io::Result<()> {
let mut program = String::new();
io::stdin().read_to_string(&mut program)?;
- let re = Regex::new(r"mul\((\d{1,3}),(\d{1,3})\)").unwrap();
-
- let silver: u64 = re
- .captures_iter(&program)
- .map(self::execute_mul_capture)
- .sum();
+ let instrs = (0..program.len())
+ .filter_map(|idx| {
+ let next = &program[idx..];
+ if next.starts_with("do()") {
+ Some(Instruction::Do)
+ } else if next.starts_with("don't()") {
+ Some(Instruction::Dont)
+ } else if next.starts_with("mul(") {
+ let mut first = 0;
+ let mut curr = 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;
- }
+ for ch in next.bytes().skip(4) {
+ match (ch, curr) {
+ ((b'0'..=b'9'), _) => curr = curr * 10 + (ch - b'0') as u64,
+ (_, 0) => return None,
+ (b',', _) => {
+ first = curr;
+ curr = 0;
+ }
+ (b')', _) => {
+ return Some(Instruction::Mul(first, curr));
+ }
+ _ => return None,
+ };
}
+ None
+ } else {
+ None
}
- _ => unreachable!(),
- }
- }
+ })
+ .collect::<Vec<_>>();
+ let silver: u64 = instrs.iter().map(u64::from).sum();
+ let (gold, _) = instrs
+ .iter()
+ .fold((0 as u64, true), |(acc, on), instr| match (instr, on) {
+ (Instruction::Do, _) => (acc, true),
+ (Instruction::Dont, _) => (acc, false),
+ (Instruction::Mul(_, _), true) => (acc + u64::from(instr), true),
+ _ => (acc, on),
+ });
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()
-}