diff --git a/problems/the-number-of-weak-characters-in-the-game.rs b/problems/the-number-of-weak-characters-in-the-game.rs new file mode 100644 index 0000000..b01428c --- /dev/null +++ b/problems/the-number-of-weak-characters-in-the-game.rs @@ -0,0 +1,125 @@ +#[derive(Debug, PartialEq, Eq)] +struct Property { + attack: i32, + defense: i32, +} + +impl Property { + fn is_weak(&self, rhs: &Property) -> bool { + self.attack < rhs.attack && self.defense < rhs.defense + } +} + +impl From<&Vec> for Property { + fn from(v: &Vec) -> Self { + Self { + attack: v[0], + defense: v[1], + } + } +} + +impl PartialOrd for Property { + fn partial_cmp(&self, other: &Self) -> Option { + match self.attack.partial_cmp(&other.attack) { + Some(core::cmp::Ordering::Equal) => other.defense.partial_cmp(&self.defense), + ord => ord, + } + } +} + +impl Ord for Property { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + if self.attack != other.attack { + self.attack.cmp(&other.attack) + } else { + other.defense.cmp(&self.defense) + } + } +} + +struct Acc { + max: i32, + count: i32, +} + +impl Acc { + fn new(m: i32) -> Acc { + Acc { max: m, count: 0 } + } + + fn update(self, p: &Property) -> Acc { + if p.defense < self.max { + Acc { + max: self.max, + count: self.count + 1, + } + } else { + Acc { + max: p.defense, + count: self.count, + } + } + } +} + +impl Solution { + pub fn number_of_weak_characters(properties: Vec>) -> i32 { + let mut properties: Vec = properties.iter().map(From::from).collect(); + properties.sort(); + + properties + .iter() + .rfold(Acc::new(properties.last().unwrap().defense), Acc::update) + .count + } +} +struct Solution {} + +fn main() { + println!("Hello World!"); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_example() { + assert_eq!( + Solution::number_of_weak_characters(vec![vec![5, 5], vec![6, 3], vec![3, 6]]), + 0 + ); + } + + #[test] + fn test_another_example() { + assert_eq!( + Solution::number_of_weak_characters(vec![vec![2, 2], vec![3, 3]]), + 1 + ); + } + + #[test] + fn test_another_another_example() { + assert_eq!( + Solution::number_of_weak_characters(vec![vec![1, 5], vec![10, 4], vec![4, 3]]), + 1 + ); + } + + #[test] + fn test_bigger_example() { + assert_eq!( + Solution::number_of_weak_characters(vec![ + vec![1, 5], + vec![10, 4], + vec![4, 3], + vec![2, 6], + vec![1, 1], + vec![10, 6] + ]), + 3 + ); + } +}