diff --git a/problems/solving-questions-with-brainpower.rs b/problems/solving-questions-with-brainpower.rs new file mode 100644 index 0000000..91a291b --- /dev/null +++ b/problems/solving-questions-with-brainpower.rs @@ -0,0 +1,71 @@ +use std::cmp; + +#[derive(Debug)] +struct Question { + answered: i64, + skipped: i64, +} + +impl Question { + fn get_with_offset(stack: &Vec, offset: i64) -> i64 { + let i = stack.len() as i64 - offset - 1; + if i < 0 || i >= stack.len() as i64 { + return 0; + } + + stack[i as usize].get() + } + + pub fn new(q: &[i32], stack: &Vec) -> Self { + Self { + answered: q[0] as i64 + Self::get_with_offset(stack, q[1].into()), + skipped: Self::get_with_offset(stack, 0), + } + } + + pub fn get(&self) -> i64 { + cmp::max(self.answered, self.skipped) + } +} + +struct Solution {} +impl Solution { + pub fn most_points(questions: Vec>) -> i64 { + let mut stack: Vec = vec![]; + + for input_q in questions.iter().rev() { + stack.push(Question::new(&input_q, &stack)); + } + + stack.last().unwrap().get() + } +} + +fn main() {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_example_1() { + assert_eq!( + Solution::most_points(vec![vec![3, 2], vec![4, 3], vec![4, 4], vec![2, 5]]), + 5 + ); + } + + #[test] + fn test_example_2() { + assert_eq!( + Solution::most_points(vec![ + vec![1, 1], + vec![2, 2], + vec![3, 3], + vec![4, 4], + vec![5, 5] + ]), + 7 + ); + } +}