aboutsummaryrefslogtreecommitdiff
path: root/challenge-346/benjamin-andre
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-11-07 14:24:50 +0000
committerGitHub <noreply@github.com>2025-11-07 14:24:50 +0000
commit656d05b04a666534e66a96b49fc11ee7ed8fb097 (patch)
treeca8d408f9de174667b2f76414488509da59799d3 /challenge-346/benjamin-andre
parent5ae911a64ba61fc9bbbfed00b9cb1609aed4daf9 (diff)
parent21dadeb702128e50c5084d653a83d28a175d5f56 (diff)
downloadperlweeklychallenge-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-xchallenge-346/benjamin-andre/rust/ch-1.rs29
-rwxr-xr-xchallenge-346/benjamin-andre/rust/ch-2.rs57
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"]
+ );
+}