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