diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-11-07 14:24:50 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-07 14:24:50 +0000 |
| commit | 656d05b04a666534e66a96b49fc11ee7ed8fb097 (patch) | |
| tree | ca8d408f9de174667b2f76414488509da59799d3 /challenge-346/benjamin-andre | |
| parent | 5ae911a64ba61fc9bbbfed00b9cb1609aed4daf9 (diff) | |
| parent | 21dadeb702128e50c5084d653a83d28a175d5f56 (diff) | |
| download | perlweeklychallenge-club-656d05b04a666534e66a96b49fc11ee7ed8fb097.tar.gz perlweeklychallenge-club-656d05b04a666534e66a96b49fc11ee7ed8fb097.tar.bz2 perlweeklychallenge-club-656d05b04a666534e66a96b49fc11ee7ed8fb097.zip | |
Merge pull request #12980 from fer2o3/kachow
feat(346): completed both challenges
Diffstat (limited to 'challenge-346/benjamin-andre')
| -rwxr-xr-x | challenge-346/benjamin-andre/rust/ch-1.rs | 29 | ||||
| -rwxr-xr-x | challenge-346/benjamin-andre/rust/ch-2.rs | 57 |
2 files changed, 86 insertions, 0 deletions
diff --git a/challenge-346/benjamin-andre/rust/ch-1.rs b/challenge-346/benjamin-andre/rust/ch-1.rs new file mode 100755 index 0000000000..9a87c5f34c --- /dev/null +++ b/challenge-346/benjamin-andre/rust/ch-1.rs @@ -0,0 +1,29 @@ +#!/bin/sh +//usr/bin/env rustc --test $0 -o kachow && ./kachow --nocapture; rm -f kachow ; exit + +fn longest_parenthesis(s: &str) -> usize { + let mut stack = vec![-1]; + let mut max_len = 0; + for (i, c) in s.chars().enumerate() { + if c == '(' { + stack.push(i as i32); + } else { + stack.pop(); + if stack.is_empty() { + stack.push(i as i32); + } else { + max_len = max_len.max(i as i32 - stack[stack.len() - 1]); + } + } + } + max_len as usize +} + +#[test] +fn example() { + assert_eq!(longest_parenthesis("(()())"), 6); + assert_eq!(longest_parenthesis(")()())"), 4); + assert_eq!(longest_parenthesis("((()))()(((("), 8); + assert_eq!(longest_parenthesis("))))(()("), 2); + assert_eq!(longest_parenthesis("()(()"), 2); +} diff --git a/challenge-346/benjamin-andre/rust/ch-2.rs b/challenge-346/benjamin-andre/rust/ch-2.rs new file mode 100755 index 0000000000..634ce1cc5a --- /dev/null +++ b/challenge-346/benjamin-andre/rust/ch-2.rs @@ -0,0 +1,57 @@ +#!/bin/sh +//usr/bin/env rustc --test $0 -o kachow && ./kachow --nocapture; rm -f kachow ; exit +fn magic_expression(s: &str, target: i32) -> Vec<String> { + fn eval(expr: &str) -> i32 { + let mut terms = Vec::new(); + let mut current = 0; + let mut op = '+'; + for c in expr.chars().chain(std::iter::once('+')) { + if c.is_ascii_digit() { + current = current * 10 + c.to_digit(10).unwrap() as i32; + } else { + let value = if op == '*' { + terms.pop().unwrap() * current + } else { + current * if op == '-' { -1 } else { 1 } + }; + terms.push(value); + current = 0; + op = c; + } + } + terms.iter().sum() + } + + fn generate(s: &str, pos: usize, expr: String, target: i32, result: &mut Vec<String>) { + if pos == s.len() { + if eval(&expr) == target { + result.push(expr); + } + return; + } + let ch = s.chars().nth(pos).unwrap(); + if pos == 0 { + generate(s, pos + 1, ch.to_string(), target, result); + } else { + for &op in &['+', '-', '*'] { + generate(s, pos + 1, format!("{}{}{}", expr, op, ch), target, result); + } + } + } + + let mut result = Vec::new(); + generate(s, 0, String::new(), target, &mut result); + result +} + +#[test] +fn example() { + assert_eq!(magic_expression("123", 6), vec!["1*2*3", "1+2+3"]); + assert_eq!(magic_expression("105", 5), vec!["1*0+5", "10-5"]); + assert_eq!(magic_expression("232", 8), vec!["2*3+2", "2+3*2"]); + assert_eq!(magic_expression("1234", 10), vec!["1*2*3+4", "1+2+3+4"]); + assert_eq!( + magic_expression("1001", 2), + vec!["1+0*0+1", "1+0+0+1", "1+0-0+1", "1-0*0+1", "1-0+0+1", "1-0-0+1"] + ); +} |
