mirror of
https://github.com/LeMoonStar/AoC24.git
synced 2025-07-07 11:25:32 +02:00
Compare commits
3 commits
b2c8337177
...
703c429bcf
Author | SHA1 | Date | |
---|---|---|---|
703c429bcf | |||
37cf778b8c | |||
3b942efd71 |
6 changed files with 112 additions and 15 deletions
39
Cargo.lock
generated
39
Cargo.lock
generated
|
@ -17,6 +17,15 @@ version = "2.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "1.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.12.1"
|
||||
|
@ -43,6 +52,7 @@ dependencies = [
|
|||
"colored",
|
||||
"lazy_static",
|
||||
"mut_static",
|
||||
"regex",
|
||||
"reqwest",
|
||||
]
|
||||
|
||||
|
@ -837,6 +847,35 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[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"
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.11.27"
|
||||
|
|
|
@ -12,6 +12,7 @@ aoc-macro = {path="aoc-macro"}
|
|||
reqwest = { version = "0.11", features=["cookies", "blocking"] }
|
||||
mut_static="5.0"
|
||||
lazy_static="1.4"
|
||||
regex = "1.11"
|
||||
|
||||
[profile.release]
|
||||
opt-level = 3
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
[](https://adventofcode.com/2024/about)
|
||||
[](https://en.wikipedia.org/wiki/Rust_(programming_language))
|
||||
[](https://mit-license.org/)
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
> ⚠️ This README is copied from my previous years solution. It is not fully adopted to 2024 yet.
|
||||
|
||||
|
|
|
@ -22,12 +22,12 @@ impl Report {
|
|||
|
||||
if !Self::safe_comparison(self.0[i - 1], self.0[i], &mut direction) {
|
||||
if tolerance > 0 {
|
||||
if (i + 1 >= self.0.len()) {
|
||||
if i + 1 >= self.0.len() {
|
||||
return true;
|
||||
}
|
||||
|
||||
tolerance -= 1;
|
||||
if !Self::safe_comparison(self.0[i - 1], self.0[i + 1], &mut direction) {
|
||||
if Self::safe_comparison(self.0[i - 1], self.0[i + 1], &mut direction) {
|
||||
skip = true;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1,32 +1,88 @@
|
|||
use super::{Answer, Day, DayImpl};
|
||||
use regex::Regex;
|
||||
|
||||
const CURRENT_DAY: u8 = 3;
|
||||
|
||||
type Data = Vec<u64>;
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Command {
|
||||
command: String,
|
||||
parameters: Vec<u64>,
|
||||
}
|
||||
|
||||
impl Command {
|
||||
pub fn run(&self) -> u64 {
|
||||
if self.command != "mul" || self.parameters.len() < 2 {
|
||||
return 0;
|
||||
}
|
||||
self.parameters[0] * self.parameters[1]
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Program(Vec<Command>);
|
||||
|
||||
impl Program {
|
||||
pub fn do_all_multiplications(&self) -> u64 {
|
||||
self.0.iter().map(|v| v.run()).sum()
|
||||
}
|
||||
|
||||
pub fn run(&self) -> u64 {
|
||||
let mut enabled = true;
|
||||
|
||||
self.0
|
||||
.iter()
|
||||
.map(|v| {
|
||||
if v.command == "don't" {
|
||||
enabled = false;
|
||||
} else if v.command == "do" {
|
||||
enabled = true;
|
||||
} else if enabled {
|
||||
return v.run();
|
||||
}
|
||||
0
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&str> for Program {
|
||||
fn from(value: &str) -> Self {
|
||||
let pattern: Regex = Regex::new(r"(do|don't|mul)\(((?:\d+,?)*)\)").unwrap();
|
||||
|
||||
let mut commands = vec![];
|
||||
for (_, [command, parameters]) in pattern.captures_iter(value).map(|c| c.extract()) {
|
||||
commands.push(Command {
|
||||
command: command.to_string(),
|
||||
parameters: parameters
|
||||
.split(",")
|
||||
.map(|v| v.parse().unwrap_or(0))
|
||||
.collect(),
|
||||
});
|
||||
}
|
||||
|
||||
Self(commands)
|
||||
}
|
||||
}
|
||||
|
||||
type Data = Program;
|
||||
impl DayImpl<Data> for Day<CURRENT_DAY> {
|
||||
fn init_test() -> (Self, Data) {
|
||||
Self::init(include_str!("test_inputs/test03.txt"))
|
||||
}
|
||||
|
||||
fn expected_results() -> (Answer, Answer) {
|
||||
(Answer::Number(0), Answer::Number(0))
|
||||
(Answer::Number(161), Answer::Number(0))
|
||||
}
|
||||
|
||||
fn init(input: &str) -> (Self, Data) {
|
||||
(
|
||||
Self {},
|
||||
input
|
||||
.lines()
|
||||
.map(|v| v.parse::<u64>().expect("error while parsing input."))
|
||||
.collect(),
|
||||
)
|
||||
(Self {}, input.into())
|
||||
}
|
||||
|
||||
fn one(&self, data: &mut Data) -> Answer {
|
||||
Answer::Number(data.len() as u64)
|
||||
Answer::Number(data.do_all_multiplications())
|
||||
}
|
||||
|
||||
fn two(&self, data: &mut Data) -> Answer {
|
||||
Answer::Number(data.len() as u64)
|
||||
Answer::Number(data.run())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
|
Loading…
Add table
Add a link
Reference in a new issue