summaryrefslogtreecommitdiff
path: root/2024/Rust/src/day2.rs
diff options
context:
space:
mode:
authoromagdy <omar.professional8777@gmail.com>2024-12-02 19:30:22 +0200
committeromagdy <omar.professional8777@gmail.com>2024-12-02 19:30:22 +0200
commit3afbdd0736fc965f2c6ee7016005d1760965a448 (patch)
tree20db7d507e0d03d7073b6cf3657736367bb66368 /2024/Rust/src/day2.rs
parent4deecf57c602155a550521b23587851b54d12f25 (diff)
downloadaoc-3afbdd0736fc965f2c6ee7016005d1760965a448.tar.xz
aoc-3afbdd0736fc965f2c6ee7016005d1760965a448.zip
Day 2 done.
Diffstat (limited to '2024/Rust/src/day2.rs')
-rw-r--r--2024/Rust/src/day2.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/2024/Rust/src/day2.rs b/2024/Rust/src/day2.rs
new file mode 100644
index 0000000..22dd5dd
--- /dev/null
+++ b/2024/Rust/src/day2.rs
@@ -0,0 +1,70 @@
+type Reports = Vec<Vec<i32>>;
+
+fn parse_input(data: &str) -> Reports {
+ data.lines()
+ .map(|line| {
+ line.split(" ")
+ .map(|x| x.parse::<i32>().unwrap())
+ .collect::<Vec<i32>>()
+ })
+ .collect()
+}
+
+fn is_safe_recursive(report: &[i32]) -> bool {
+ match report {
+ [] => false,
+ [_] => false,
+ [a, b] => (1..=3).contains(&(a - b).abs()),
+ [a, b, rest @ ..] => (1..=3).contains(&(a - b).abs()) && is_safe_recursive(rest),
+ }
+}
+
+fn is_safe(report: &Vec<i32>) -> bool {
+ let increasing = report[0] < report[1];
+ for i in 0..report.len() - 1 {
+ if increasing {
+ let diff = report[i + 1] - report[i];
+ if report[i] >= report[i + 1] || diff > 3 || diff < 1 {
+ return false;
+ }
+ } else {
+ let diff = report[i] - report[i + 1];
+ if report[i] <= report[i + 1] || diff > 3 || diff < 1 {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+fn solve_part_one(data: &str) -> usize {
+ let reports = parse_input(data);
+ reports.iter().filter(|&report| is_safe(report)).count()
+}
+
+fn solve_part_two(data: &str) -> usize {
+ let reports = parse_input(data);
+ let mut cnt: usize = 0;
+ reports
+ .iter()
+ .filter(|&report| !is_safe(report))
+ .for_each(|report| {
+ for i in 0..report.len() {
+ let mut report_copy = report.clone();
+ report_copy.remove(i);
+ if is_safe(&report_copy) {
+ cnt += 1;
+ break;
+ }
+ }
+ });
+ cnt + reports.iter().filter(|&report| is_safe(report)).count()
+}
+fn main() {
+ let test_1 = include_str!("../input/day_2.test");
+ let prod = include_str!("../input/day_2.prod");
+ println!("part_1 test: {:?}", solve_part_one(test_1));
+ println!("part_1 prod {:?}", solve_part_one(prod));
+ println!("part_2 test: {:?}", solve_part_two(test_1));
+ println!("part_2 prod {:?}", solve_part_two(prod));
+}