From 5921b577c0bad37b17d6b068e034d38cad5f578a Mon Sep 17 00:00:00 2001 From: YK Date: Mon, 2 Dec 2024 08:44:42 +0300 Subject: [PATCH] solution: day 2 + add BinaryHeap re-export --- src/days.rs | 2 +- src/days/d2.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/prelude.rs | 7 ++++- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/days/d2.rs diff --git a/src/days.rs b/src/days.rs index e88513f..c31753b 100644 --- a/src/days.rs +++ b/src/days.rs @@ -1,5 +1,5 @@ pub mod d1; -// pub mod d2; +pub mod d2; // pub mod d3; // pub mod d4; // pub mod d5; diff --git a/src/days/d2.rs b/src/days/d2.rs new file mode 100644 index 0000000..a83ecde --- /dev/null +++ b/src/days/d2.rs @@ -0,0 +1,70 @@ +use crate::prelude::*; + +pub type I = Vec>; +pub type O = usize; + +fn _parse (data: &str) -> I { + data.lines().map(|line| line.split_ascii_whitespace().map(|e| p!(e)).collect()).collect() +} + +fn _report_safety (report: &[i32]) -> bool { + let dir = report[0] - report[1]; + if dir.abs() < 1 || dir.abs() > 3 { return false; } + for &[a, b] in (&report[1..]).array_windows() { + let diff = a - b; + let abs = diff.abs(); + if diff.signum() != dir.signum() { return false; } + if abs < 1 || abs > 3 { return false } + } + + true +} + +fn _silver (data: &I) -> O { + data.into_iter().filter(|s| _report_safety(s)).count() +} + +fn _gold (data: &I) -> O { + data.into_iter().filter(|report| { + let mut s = vec![report.to_vec()]; + for i in 0..report.len() { + s.push([&report[..i], &report[i+1..]].concat()); + } + s.iter().any(|report| _report_safety(report)) + + }).count() +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + let data = inc!(2); + _parse(data) + } + + #[test] + fn sample () { + let data = inc!("2_example"); + let data = _parse(data); + + assert_eq!(_gold(&data), 4) + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(&data); + + assert_eq!(ans, 510) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(&data); + + assert_eq!(ans, 553) + } +} diff --git a/src/prelude.rs b/src/prelude.rs index b91437e..3305376 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -2,7 +2,12 @@ pub use crate::utils::*; pub use anyhow::Error; pub use itertools::Itertools; pub use std::{ - collections::{ HashMap as M, HashSet as S, VecDeque as D }, + collections::{ + HashMap as M, + HashSet as S, + VecDeque as D, + BinaryHeap as B, + }, cmp::Ordering as Or, };