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] 4 points 1 month ago* (last edited 1 month ago)

#Rust

initially, for part two I was trying to ignore a bad pair not a bad value - read the question!

Only installed Rust on Sunday, day 1 was a mess, today was more controlled. Need to look at some of the rust solutions for std library methods I don't know about.

very focussed on getting it to actually compile/work over making it short or nice!

long!`

pub mod task_2 {

pub fn task_1(input: &str) -> i32{
    let mut valid_count = 0;

    let reports = process_input(input);

    for report in reports{
        let valid = is_report_valid(report);

        if valid{
            valid_count += 1;
        }
    }

    println!("Valid count: {}", valid_count);
    valid_count
}

pub fn task_2(input: &str) -> i32{
    let mut valid_count = 0;

    let reports = process_input(input);

    for report in reports{
        let mut valid = is_report_valid(report.clone());

        if !valid
        {
            for position_to_delete in 0..report.len()
            {
                let mut updated_report = report.clone();
                updated_report.remove(position_to_delete);
                valid = is_report_valid(updated_report);

                if valid { break; }
            }
        }

        if valid{
            valid_count += 1;
        }
    }

    println!("Valid count: {}", valid_count);
    valid_count
}

fn is_report_valid(report:Vec<i32>) -> bool{
    let mut increasing = false;
    let mut decreasing = false;
    let mut valid = true;

    for position in 1..report.len(){
        if report[position-1] > report[position]
        {
            decreasing = true;
        }
        else if report[position-1] < report[position]
        {
            increasing = true;
        }
        else
        {
            valid = false;
            break;
        }

        if (report[position-1] - report[position]).abs() > 3
        {
            valid = false;
            break;
        }

        if increasing && decreasing
        {
            valid = false;
            break;
        }
    }

    return valid;
}

pub fn process_input(input: &str) -> Vec<Vec<i32>>{
    let mut reports: Vec<Vec<i32>> = Vec::new();
    for report_string in input.split("\n"){
        let mut report: Vec<i32> = Vec::new();
        for value in report_string.split_whitespace() {
            report.push(value.parse::<i32>().unwrap());
        }
        reports.push(report);
    }

    return reports;
}

}

`