Day 2: Red-Nosed Reports
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 3 points
Rust
use crate::utils::read_lines;
pub fn solution1() {
let reports = get_reports();
let safe_reports = reports
.filter(|report| report.windows(3).all(window_is_valid))
.count();
println!("Number of safe reports = {safe_reports}");
}
pub fn solution2() {
let reports = get_reports();
let safe_reports = reports
.filter(|report| {
(0..report.len()).any(|i| {
[&report[0..i], &report[i + 1..]]
.concat()
.windows(3)
.all(window_is_valid)
})
})
.count();
println!("Number of safe reports = {safe_reports}");
}
fn window_is_valid(window: &[usize]) -> bool {
matches!(window[0].abs_diff(window[1]), 1..=3)
&& matches!(window[1].abs_diff(window[2]), 1..=3)
&& ((window[0] > window[1] && window[1] > window[2])
|| (window[0] < window[1] && window[1] < window[2]))
}
fn get_reports() -> impl Iterator<Item = Vec<usize>> {
read_lines("src/day2/input.txt").map(|line| {
line.split_ascii_whitespace()
.map(|level| {
level
.parse()
.expect("Reactor level is always valid integer")
})
.collect()
})
}
Definitely trickier than yesterday’s. I feel like the windows
solution isn’t the best, but it was what came to mind and ended up working for me.