59 lines
938 B
Rust
59 lines
938 B
Rust
mod common;
|
|
|
|
use std::env;
|
|
|
|
use common::{PuzzleInputs, Report};
|
|
|
|
|
|
fn main() {
|
|
let input_file = env::args().nth(1).unwrap();
|
|
|
|
let input = PuzzleInputs::parse(input_file);
|
|
|
|
let mut num_safe = 0;
|
|
|
|
for report in &input.reports {
|
|
if let Status::Safe = is_report_safe(report) {
|
|
num_safe += 1;
|
|
}
|
|
}
|
|
|
|
println!("{num_safe}");
|
|
}
|
|
|
|
|
|
#[derive(Debug)]
|
|
enum Status {
|
|
Safe,
|
|
Unsafe,
|
|
}
|
|
|
|
|
|
fn is_report_safe(report: &Report) -> Status {
|
|
let mut order: i32 = 0;
|
|
|
|
for window in report.levels.windows(2) {
|
|
let a = window[0];
|
|
let b = window[1];
|
|
|
|
let diff = b.abs_diff(a);
|
|
|
|
if diff < 1 || diff > 3 {
|
|
return Status::Unsafe;
|
|
}
|
|
|
|
if b > a {
|
|
order += 1;
|
|
} else {
|
|
order -= 1;
|
|
}
|
|
}
|
|
|
|
|
|
if (order.abs() + 1) != (report.levels.len() as i32) {
|
|
return Status::Unsafe;
|
|
}
|
|
|
|
Status::Safe
|
|
}
|