diff options
author | Guillermo Ramos | 2024-12-04 10:28:51 +0100 |
---|---|---|
committer | Guillermo Ramos | 2024-12-04 10:51:41 +0100 |
commit | 1c9620d4666fdf41ef751f100dfb17f14133dd35 (patch) | |
tree | ece2ef499492b2426b13bd9b48f98f35a60123c2 /2024_rust/src | |
parent | a42dc9c3efb52a74fc581835f585679e8a5e2bb1 (diff) | |
download | AoC-1c9620d4666fdf41ef751f100dfb17f14133dd35.tar.gz |
2024: move to single Rust crate
Diffstat (limited to '2024_rust/src')
-rw-r--r-- | 2024_rust/src/day1.rs | 45 | ||||
-rw-r--r-- | 2024_rust/src/day2.rs | 65 | ||||
-rw-r--r-- | 2024_rust/src/day3.rs | 33 | ||||
-rw-r--r-- | 2024_rust/src/dayN.rs | 11 | ||||
-rw-r--r-- | 2024_rust/src/main.rs | 10 |
5 files changed, 164 insertions, 0 deletions
diff --git a/2024_rust/src/day1.rs b/2024_rust/src/day1.rs new file mode 100644 index 0000000..0b6c13d --- /dev/null +++ b/2024_rust/src/day1.rs @@ -0,0 +1,45 @@ +pub fn p1(input: &str) -> String { + let mut left: Vec<u32> = vec![]; + let mut right: Vec<u32> = vec![]; + for line in input.lines() { + let mut fields = line.split_whitespace(); + let e = "Wrong file format"; + left.push(fields.next().expect(e).parse().expect(e)); + right.push(fields.next().expect(e).parse().expect(e)); + } + left.sort_unstable(); + right.sort_unstable(); + + let mut distance: u32 = 0; + for i in 0..left.len() { + let l = left[i]; + let r = right[i]; + distance += if l >= r { l - r } else { r - l }; + } + + distance.to_string() +} + +use std::collections::HashMap; + +pub fn p2(input: &str) -> String { + let mut left: Vec<u32> = vec![]; + let mut right: HashMap<u32, u32> = HashMap::new(); + for line in input.lines() { + let mut fields = line.split_whitespace(); + let e = "Wrong file format"; + left.push(fields.next().expect(e).parse().expect(e)); + let r: u32 = fields.next().expect(e).parse().expect(e); + match right.get(&r) { + None => right.insert(r, 1), + Some(v) => right.insert(r, v + 1), + }; + } + + let mut distance: u32 = 0; + for l in left { + distance += l * right.get(&l).unwrap_or(&0); + } + + distance.to_string() +} diff --git a/2024_rust/src/day2.rs b/2024_rust/src/day2.rs new file mode 100644 index 0000000..f809141 --- /dev/null +++ b/2024_rust/src/day2.rs @@ -0,0 +1,65 @@ +#[derive(PartialEq, Clone, Copy)] +enum Direction { + Up, + Down, + Unknown, +} +use Direction::*; + +fn is_safe(levels: &[u32]) -> bool { + let mut direction = Unknown; + for i in 0..levels.len() - 1 { + let [x, y] = levels[i..=i + 1] else { + unreachable!() + }; + let (diff, d) = if x > y { (x - y, Down) } else { (y - x, Up) }; + if direction == Unknown { + direction = d; + } + if diff == 0 || diff > 3 || direction != d { + return false; + } + } + return true; +} + +pub fn p1(input: &str) -> String { + let mut total = 0; + for report in input.lines() { + let levels: Vec<u32> = report + .split_whitespace() + .map(|l| l.parse().unwrap()) + .collect(); + if is_safe(&levels) { + total += 1; + } + } + + total.to_string() +} + +fn is_safe_with_dampener(levels: &[u32]) -> bool { + for i in 0..levels.len() { + let mut levels_without_i: Vec<u32> = levels.to_vec(); + levels_without_i.remove(i); + if is_safe(&levels_without_i) { + return true; + } + } + return false; +} + +pub fn p2(input: &str) -> String { + let mut total = 0; + for report in input.lines() { + let levels: Vec<u32> = report + .split_whitespace() + .map(|l| l.parse().unwrap()) + .collect(); + if is_safe(&levels) || is_safe_with_dampener(&levels) { + total += 1; + } + } + + total.to_string() +} diff --git a/2024_rust/src/day3.rs b/2024_rust/src/day3.rs new file mode 100644 index 0000000..cdcd62a --- /dev/null +++ b/2024_rust/src/day3.rs @@ -0,0 +1,33 @@ +use regex::Regex; + +pub fn p1(input: &str) -> String { + let re = Regex::new(r"mul\(([0-9]{1,3}),([0-9]{1,3})\)").unwrap(); + + let mut result: u32 = 0; + for (_, [x, y]) in re.captures_iter(input).map(|cs| cs.extract()) { + result += x.parse::<u32>().unwrap() * y.parse::<u32>().unwrap(); + } + + result.to_string() +} + +pub fn p2(input: &str) -> String { + let re = Regex::new(r"do\(\)|don't\(\)|mul\(([0-9]{1,3}),([0-9]{1,3})\)").unwrap(); + + let mut doing = true; + let mut result: u32 = 0; + for cs in re.captures_iter(input) { + let mut it = cs.iter().flatten().map(|m| m.as_str()); + match it.next().unwrap() { + "do()" => doing = true, + "don't()" => doing = false, + mul if doing && mul.starts_with("mul") => { + let mut next = || it.next().unwrap().parse::<u32>().unwrap(); + result += next() * next(); + } + _ => (), + } + } + + result.to_string() +} diff --git a/2024_rust/src/dayN.rs b/2024_rust/src/dayN.rs new file mode 100644 index 0000000..d325291 --- /dev/null +++ b/2024_rust/src/dayN.rs @@ -0,0 +1,11 @@ +pub fn p1(input: &str) -> String { + let result = "TODO"; + + result.to_string() +} + +pub fn p2(input: &str) -> String { + let result = "TODO"; + + result.to_string() +} diff --git a/2024_rust/src/main.rs b/2024_rust/src/main.rs new file mode 100644 index 0000000..ed94ec2 --- /dev/null +++ b/2024_rust/src/main.rs @@ -0,0 +1,10 @@ +mod day3; +use day3 as current_day; +const INPUT_FILE: &str = "inputs/3"; + +fn main() { + let input = std::fs::read_to_string(INPUT_FILE).unwrap(); + + println!("Result (P1): {}", current_day::p1(&input)); + println!("Result (P2): {}", current_day::p2(&input)); +} |