diff options
Diffstat (limited to '2024/2/p1.rs')
| -rw-r--r-- | 2024/2/p1.rs | 38 | 
1 files changed, 38 insertions, 0 deletions
| diff --git a/2024/2/p1.rs b/2024/2/p1.rs new file mode 100644 index 0000000..4e4df46 --- /dev/null +++ b/2024/2/p1.rs @@ -0,0 +1,38 @@ +const INPUT_FILE: &str = "input"; + +#[derive(PartialEq, Clone, Copy)] +enum Direction { +    Up, +    Down, +    Unknown, +} +use Direction::*; + +fn is_safe(levels: &[u32]) -> bool { +    let mut direction = Unknown; +    for i in 0..levels.len()-1 { +        let [x, y] = levels[i..=i+1] else { panic!("unreachable") }; +        let (diff, d) = if x > y { (x-y, Down) } else { (y-x, Up) }; +        if direction == Unknown { +            direction = d; +        } +        if diff == 0 || diff > 3 || direction != d { +            return false; +        } +    } +    return true; +} + +fn main() { +    let input = std::fs::read_to_string(INPUT_FILE).unwrap(); + +    let mut total = 0; +    for report in input.lines() { +        let levels: Vec<u32> = +            report.split_whitespace().map(|l| l.parse().unwrap()).collect(); +        if is_safe(&levels) { +            total += 1; +        } +    } +    println!("Levels! {:?}", total); +} | 
