Post

Advent of Code 2024 - Day 2

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use std::{fs::File, io::{self, Read}};

fn str_to_vec_num(str_inputs: &String) -> Vec<Vec<i32>> {
    let mut inputs: Vec<Vec<i32>> = Vec::new();

    for line in str_inputs.lines() {
        let mut row: Vec<i32> = Vec::new();

        for num in line.split_whitespace() {
            match num.parse::<i32>() {
                Ok(n) => row.push(n),
                Err(e) => println!("Failed to parse {} : {}", num, e),
            }
        }
        inputs.push(row);
    }

    inputs
}

fn is_increase(num_line: &Vec<i32>) -> bool {
    let mut prev_num: i32 = 0;

    for &num in num_line {
        if num > prev_num {
            prev_num = num;
        } else {
            return false;
        }
    }

    true
}

fn is_decrease(num_line: &Vec<i32>) -> bool {
    let mut prev_num: i32 = 100;

    for &num in num_line {
        if num < prev_num {
            prev_num = num;
        } else {
            return false;
        }
    }

    true
}

fn is_good_gab(num_line: &Vec<i32>) -> bool {
    let mut prev_num: i32 = &num_line[0] - 1;

    for &num in num_line {
        let gap: i32 = (prev_num - num).abs();

        if gap < 1 || gap > 3 {
            return false;
        }
        prev_num = num;
    }
    true
}

fn is_safe(num_line: &Vec<i32>) -> bool {
    (is_increase(num_line) || is_decrease(num_line)) && is_good_gab(num_line)
}

fn is_safe_with_dampener(num_line: &Vec<i32>) -> bool {
    if is_safe(num_line) {
        return true;
    }

    for i in 0..num_line.len() {
        let mut temp = num_line.clone();
        temp.remove(i);
        if is_safe(&temp) {
            return true;
        }
    }

    false
}

fn main() -> io::Result<()> {
    let mut file = File::open("input.txt")?;
    let mut str_inputs = String::new();
    let mut inputs: Vec<Vec<i32>>;
    let mut result: i32 = 0;

    file.read_to_string(&mut str_inputs)?;
    inputs = str_to_vec_num(&str_inputs);

    for num_line in inputs {
        if is_safe(&num_line) {
            result += 1; 
        }
    }

    println!("PART 1 : {}", result);

    result = 0;
    file.read_to_string(&mut str_inputs)?;
    inputs = str_to_vec_num(&str_inputs);

    for num_line in inputs {
        if is_safe_with_dampener(&num_line) {
            result += 1;
        }
    }

    println!("PART 2 : {}", result);

    Ok(())
}
This post is licensed under CC BY 4.0 by the author.