From bddc0e3ddd407e0e96a4161478c372893f9f3f79 Mon Sep 17 00:00:00 2001 From: YK Date: Mon, 2 Dec 2024 08:44:42 +0300 Subject: [PATCH] add BinaryHeap re-export --- src/days/d2.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/prelude.rs | 7 ++++- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/days/d2.rs 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, };