diff --git a/rs/bag-of-tokens.rs b/rs/bag-of-tokens.rs new file mode 100644 index 0000000..17bc310 --- /dev/null +++ b/rs/bag-of-tokens.rs @@ -0,0 +1,56 @@ +struct Solution {} +impl Solution { + pub fn bag_of_tokens_score(mut tokens: Vec, mut power: i32) -> i32 { + if tokens.is_empty() { + return 0; + } + + tokens.sort_unstable(); + + let mut i = 0; + let mut j = tokens.len() - 1; + + let mut score = 0; + while i <= j { + if power >= tokens[i] { + // can trade score for power + power -= tokens[i]; + score += 1; + i += 1; + } else if i < j && score > 0 { + // can trade power for score + score -= 1; + power += tokens[j]; + j -= 1; + } else { + // no further action is possible + break; + } + } + + score + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_1() { + assert_eq!(Solution::bag_of_tokens_score(vec![100], 50), 0); + } + + #[test] + fn example_2() { + assert_eq!(Solution::bag_of_tokens_score(vec![200, 100], 150), 1); + } + + #[test] + fn example_3() { + assert_eq!( + Solution::bag_of_tokens_score(vec![100, 200, 300, 400], 200), + 2 + ); + } +}