mirror of
https://github.com/mx42/aoc2024.rs.git
synced 2026-01-14 22:09:51 +01:00
feat: add day 2
This commit is contained in:
@@ -18,8 +18,9 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www.
|
|||||||
| Day | Part 1 | Part 2 |
|
| Day | Part 1 | Part 2 |
|
||||||
| :---: | :---: | :---: |
|
| :---: | :---: | :---: |
|
||||||
| [Day 1](./src/bin/01.rs) | `72.0µs` | `76.8µs` |
|
| [Day 1](./src/bin/01.rs) | `72.0µs` | `76.8µs` |
|
||||||
|
| [Day 2](./src/bin/02.rs) | `333.6µs` | `642.1µs` |
|
||||||
|
|
||||||
**Total: 0.15ms**
|
**Total: 1.12ms**
|
||||||
<!--- benchmarking table --->
|
<!--- benchmarking table --->
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
6
data/examples/02.txt
Normal file
6
data/examples/02.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9
|
||||||
88
src/bin/02.rs
Normal file
88
src/bin/02.rs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
advent_of_code::solution!(2);
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
fn validate_input_p1(input: &Vec<u32>) -> bool {
|
||||||
|
input
|
||||||
|
.iter()
|
||||||
|
.fold(
|
||||||
|
(true, 0, None),
|
||||||
|
|(is_good, last, ord): (bool, u32, Option<Ordering>), cur: &u32| match (
|
||||||
|
is_good, last, cur, ord,
|
||||||
|
) {
|
||||||
|
(false, _, _, _) => (false, 0, None),
|
||||||
|
(_, 0, cur, None) => (true, *cur, None),
|
||||||
|
(_, last, cur, None) if last.abs_diff(*cur) < 4 => {
|
||||||
|
(true, *cur, Some(last.cmp(cur)))
|
||||||
|
}
|
||||||
|
(_, last, cur, Some(cmp)) if last.abs_diff(*cur) < 4 && last.cmp(cur) == cmp => {
|
||||||
|
(true, *cur, Some(cmp))
|
||||||
|
}
|
||||||
|
_ => (false, 0, None),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_input_p2(input: &Vec<u32>) -> bool {
|
||||||
|
if validate_input_p1(input) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..input.len() {
|
||||||
|
let mut input2 = input.clone();
|
||||||
|
input2.remove(i);
|
||||||
|
if validate_input_p1(&input2) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<usize> {
|
||||||
|
input
|
||||||
|
.strip_suffix("\n")
|
||||||
|
.unwrap_or(input)
|
||||||
|
.lines()
|
||||||
|
.map(|s| {
|
||||||
|
s.split_whitespace()
|
||||||
|
.map(|nb| nb.parse::<u32>().expect("parsing failed"))
|
||||||
|
.collect::<Vec<u32>>()
|
||||||
|
})
|
||||||
|
.filter(validate_input_p1)
|
||||||
|
.count()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<usize> {
|
||||||
|
input
|
||||||
|
.strip_suffix("\n")
|
||||||
|
.unwrap_or(input)
|
||||||
|
.lines()
|
||||||
|
.map(|s| {
|
||||||
|
s.split_whitespace()
|
||||||
|
.map(|nb| nb.parse::<u32>().expect("parsing failed"))
|
||||||
|
.collect::<Vec<u32>>()
|
||||||
|
})
|
||||||
|
.filter(validate_input_p2)
|
||||||
|
.count()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
|
||||||
|
assert_eq!(result, Some(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
|
||||||
|
assert_eq!(result, Some(4));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user