summaryrefslogtreecommitdiff
path: root/2024_rust/src/bin/day2.rs
diff options
context:
space:
mode:
Diffstat (limited to '2024_rust/src/bin/day2.rs')
-rw-r--r--2024_rust/src/bin/day2.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/2024_rust/src/bin/day2.rs b/2024_rust/src/bin/day2.rs
new file mode 100644
index 0000000..92d288f
--- /dev/null
+++ b/2024_rust/src/bin/day2.rs
@@ -0,0 +1,69 @@
+#[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;
+}
+
+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;
+}
+
+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()
+}
+
+fn main() {
+ aoc2024::run_day("2", p1, p2);
+}