problems(rs): add „1996. The Number of Weak Characters in the Game“
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
9f4f02ac24
commit
d7f8f4fd7b
1 changed files with 125 additions and 0 deletions
125
problems/the-number-of-weak-characters-in-the-game.rs
Normal file
125
problems/the-number-of-weak-characters-in-the-game.rs
Normal file
|
@ -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<i32>> for Property {
|
||||
fn from(v: &Vec<i32>) -> Self {
|
||||
Self {
|
||||
attack: v[0],
|
||||
defense: v[1],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Property {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
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<Vec<i32>>) -> i32 {
|
||||
let mut properties: Vec<Property> = 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
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue