From 5b1f4051837ac839807b7f007c0992877735af33 Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Mon, 2 Dec 2024 08:31:52 +0100 Subject: [PATCH] Add day2 --- day2/Cargo.lock | 7 +++++++ day2/Cargo.toml | 6 ++++++ day2/src/main.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 day2/Cargo.lock create mode 100644 day2/Cargo.toml create mode 100644 day2/src/main.rs diff --git a/day2/Cargo.lock b/day2/Cargo.lock new file mode 100644 index 0000000..63c2f60 --- /dev/null +++ b/day2/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day2" +version = "0.1.0" diff --git a/day2/Cargo.toml b/day2/Cargo.toml new file mode 100644 index 0000000..cd3d088 --- /dev/null +++ b/day2/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day2" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/day2/src/main.rs b/day2/src/main.rs new file mode 100644 index 0000000..8c94b18 --- /dev/null +++ b/day2/src/main.rs @@ -0,0 +1,52 @@ +fn parse(input: &str) -> Vec> { + input + .lines() + .map(|line| { + line.split_whitespace() + .map(|level| level.parse::().unwrap()) + .collect() + }) + .collect() +} + +fn is_safe(report: &[u32]) -> bool { + let pairs: Vec<(u32, u32)> = report + .windows(2) + .map(|w| (*w.first().unwrap(), *w.get(1).unwrap())) + .collect(); + pairs.iter().all(|(x, y)| x < y && x + 3 >= *y) + || pairs.iter().all(|(x, y)| x > y && *x <= y + 3) +} + +fn part1(parsed_input: &[Vec]) -> u32 { + parsed_input + .iter() + .filter(|report| is_safe(report)) + .count() as u32 +} + +fn part2(parsed_input: &[Vec]) -> u32 { + let mut res = 0; + for report in parsed_input { + if is_safe(report) { + res += 1; + continue; + } + for idx in 0..report.len() { + let mut modified_report = report.clone(); + modified_report.remove(idx); + if is_safe(&modified_report) { + res += 1; + break; + } + } + } + res +} + +fn main() { + let input = include_str!("../input.txt"); + let parsed_input = parse(input); + println!("{}", part1(&parsed_input)); + println!("{}", part2(&parsed_input)); +}