this post was submitted on 02 Dec 2024
41 points (97.7% liked)

Advent Of Code

920 readers
2 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2024

Solution Threads

M T W T F S S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS
 

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

you are viewing a single comment's thread
view the rest of the comments
[โ€“] [email protected] 3 points 1 month ago

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.