diff options
Diffstat (limited to 'src/bin/day2.rs')
| -rw-r--r-- | src/bin/day2.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/bin/day2.rs b/src/bin/day2.rs new file mode 100644 index 0000000..e34b8b0 --- /dev/null +++ b/src/bin/day2.rs @@ -0,0 +1,52 @@ +static DAY: u8 = 2; + +fn main() { + let input = advent::read_lines(DAY); + println!("{DAY}a: {}", safe_reports(&input)); + println!("{DAY}b: {}", 0); +} + +fn is_report_safe(report: &[i32]) -> bool { + let increasing = report[1] - report[0] > 0; + for number in report.iter().as_slice().windows(2) { + let diff = number[1] - number[0]; + if diff.abs() < 1 || diff.abs() > 3 { + return false; + } + if (diff > 0) != increasing { + return false; + } + } + true +} + +fn safe_reports(input: &[String]) -> usize { + let mut reports = Vec::new(); + for line in input { + let numbers = line.split(" ") + .map(|x| x.parse::<i32>().unwrap()) + .collect::<Vec<_>>(); + reports.push(numbers); + } + reports.iter() + .filter(|x| is_report_safe(x)) + .count() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [ + "7 6 4 2 1", + "1 2 7 8 9", + "9 7 6 2 1", + "1 3 2 4 5", + "8 6 4 4 1", + "1 3 6 7 9", + ].iter().map(|&x| String::from(x)).collect::<Vec<_>>(); + assert_eq!(safe_reports(&input), 2); + } +} |
