day 3, rust
This commit is contained in:
Generated
+61
@@ -0,0 +1,61 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "aoc2024-03"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"peg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f"
|
||||
dependencies = [
|
||||
"peg-macros",
|
||||
"peg-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg-macros"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426"
|
||||
dependencies = [
|
||||
"peg-runtime",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg-runtime"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.92"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||
@@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "aoc2024-03"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
peg="0.8.4"
|
||||
@@ -0,0 +1,20 @@
|
||||
peg::parser! {
|
||||
grammar mul() for str {
|
||||
rule number() -> u32
|
||||
= n:$(['0'..='9']+) {? n.parse().or(Err("u32")) }
|
||||
|
||||
rule mul_fn() -> u32
|
||||
= "mul(" a:number() "," b:number() ")" { a * b }
|
||||
|
||||
rule step() -> u32
|
||||
= n:mul_fn() { n }
|
||||
/ [_] { 0 }
|
||||
|
||||
pub rule program() -> u32
|
||||
= x:step()+ { x.iter().sum() }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse(a: &str) -> u32 {
|
||||
mul::program(a).unwrap()
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
mod first;
|
||||
mod second;
|
||||
|
||||
fn main() {
|
||||
let raw = std::fs::read_to_string("input.txt").expect("Couldn't read input");
|
||||
let first = first::parse(&raw);
|
||||
println!("{}", first);
|
||||
let second: u32 = second::parse(&raw)
|
||||
.iter()
|
||||
.scan(true, |p, i| match i {
|
||||
second::Item::Do => {
|
||||
*p = true;
|
||||
Some(None)
|
||||
}
|
||||
second::Item::Dont => {
|
||||
*p = false;
|
||||
Some(None)
|
||||
}
|
||||
second::Item::Mul(n) => {
|
||||
if *p {
|
||||
Some(Some(n))
|
||||
} else {
|
||||
Some(None)
|
||||
}
|
||||
}
|
||||
})
|
||||
.flatten()
|
||||
.sum();
|
||||
println!("{}", second);
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
pub enum Item {
|
||||
Do,
|
||||
Dont,
|
||||
Mul(u32),
|
||||
}
|
||||
|
||||
peg::parser! {
|
||||
grammar mul() for str {
|
||||
rule number() -> u32
|
||||
= n:$(['0'..='9']+) {? n.parse().or(Err("u32")) }
|
||||
|
||||
rule mul_fn() -> Item
|
||||
= "mul(" a:number() "," b:number() ")" { Item::Mul(a * b) }
|
||||
|
||||
rule do_fn() -> Item
|
||||
= "do()" { Item::Do }
|
||||
|
||||
rule dont_fn() -> Item
|
||||
= "don't()" { Item::Dont }
|
||||
|
||||
rule step() -> Option<Item>
|
||||
= n:mul_fn() { Some(n) }
|
||||
/ n:do_fn() { Some(n) }
|
||||
/ n:dont_fn() { Some(n) }
|
||||
/ [_] { None }
|
||||
|
||||
pub rule program() -> Vec<Item>
|
||||
= x:step()+ { x.into_iter().flatten().collect() }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse(a: &str) -> Vec<Item> {
|
||||
mul::program(a).unwrap()
|
||||
}
|
||||
Reference in New Issue
Block a user