aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaldhar H. Vyas <jaldhar@braincells.com>2025-11-08 23:49:16 -0500
committerJaldhar H. Vyas <jaldhar@braincells.com>2025-11-09 00:31:29 -0500
commitbd02a583c6f7c87daa8ab51dfe8dcd0033ee0770 (patch)
tree53b3603049ba1b554d7fee361f21be1505aec1bd
parentf4f27bf66e78dacae8759f64053b36bd1995b34f (diff)
downloadperlweeklychallenge-club-bd02a583c6f7c87daa8ab51dfe8dcd0033ee0770.tar.gz
perlweeklychallenge-club-bd02a583c6f7c87daa8ab51dfe8dcd0033ee0770.tar.bz2
perlweeklychallenge-club-bd02a583c6f7c87daa8ab51dfe8dcd0033ee0770.zip
Challenge 346 by Jaldhar H. Vyas.
-rw-r--r--challenge-346/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-346/jaldhar-h-vyas/perl/ch-1.pl26
-rwxr-xr-xchallenge-346/jaldhar-h-vyas/perl/ch-2.pl49
-rwxr-xr-xchallenge-346/jaldhar-h-vyas/raku/ch-1.raku26
-rwxr-xr-xchallenge-346/jaldhar-h-vyas/raku/ch-2.raku59
5 files changed, 161 insertions, 0 deletions
diff --git a/challenge-346/jaldhar-h-vyas/blog.txt b/challenge-346/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..a42660d3d3
--- /dev/null
+++ b/challenge-346/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2025/11/perl_weekly_challenge_week_346.html
diff --git a/challenge-346/jaldhar-h-vyas/perl/ch-1.pl b/challenge-346/jaldhar-h-vyas/perl/ch-1.pl
new file mode 100755
index 0000000000..0cecc0ccf6
--- /dev/null
+++ b/challenge-346/jaldhar-h-vyas/perl/ch-1.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+use 5.038;
+use warnings;
+
+my $str = shift;
+my $max = 0;
+my @stack = (-1);
+my @chars = split //, $str;
+
+for my $i (keys @chars) {
+ if ($chars[$i] eq q{(}) {
+ push @stack, $i;
+ } else {
+ pop @stack;
+ unless (scalar @stack) {
+ push @stack, $i;
+ } else {
+ my $len = $i - $stack[-1];
+ if ($len > $max) {
+ $max = $len;
+ }
+ }
+ }
+}
+
+say $max;
diff --git a/challenge-346/jaldhar-h-vyas/perl/ch-2.pl b/challenge-346/jaldhar-h-vyas/perl/ch-2.pl
new file mode 100755
index 0000000000..0fbab92be9
--- /dev/null
+++ b/challenge-346/jaldhar-h-vyas/perl/ch-2.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+use 5.038;
+use warnings;
+use feature qw/ class /;
+no warnings qw/ experimental::class /;
+
+class DepthFirstSearch {
+ field $str :param;
+ field $target :param;
+ field $n = length($str);
+ field @result = ();
+
+ method find() {
+ $self->search(0, '', 0, 0);
+ return @result;
+ }
+
+ method search($i, $expr, $current, $previous) {
+ if ($i == $n) {
+ if ($current == $target) {
+ push @result, $expr;
+ }
+ return $self;
+ }
+
+ for my $len (1 .. ($n - $i)) {
+ my $part = substr($str, $i, $len);
+ next if length($part) > 1 && $part =~ /^0/;
+ my $num = int($part);
+
+ if ($i == 0) {
+ $self->search($i + $len, $part, $num, $num);
+ } else {
+ $self->search(
+ $i + $len, $expr . '*' . $part,
+ $current - $previous + $previous * $num, $previous * $num);
+ $self->search($i + $len, $expr . '+' . $part,
+ $current + $num, $num);
+ $self->search($i + $len, $expr . '-' . $part,
+ $current - $num, -$num);
+ }
+ }
+ return $self;
+ }
+}
+
+my ($str, $target) = @ARGV;
+my $dfs = DepthFirstSearch->new(str => $str, target => $target);
+say q{(}, (join q{, }, map { "\"$_\"" } $dfs->find), q{)}; \ No newline at end of file
diff --git a/challenge-346/jaldhar-h-vyas/raku/ch-1.raku b/challenge-346/jaldhar-h-vyas/raku/ch-1.raku
new file mode 100755
index 0000000000..ccf2418a51
--- /dev/null
+++ b/challenge-346/jaldhar-h-vyas/raku/ch-1.raku
@@ -0,0 +1,26 @@
+#!/usr/bin/raku
+
+sub MAIN(
+ $str
+) {
+ my $max = 0;
+ my @stack = (-1);
+
+ for $str.comb.kv -> $i, $c {
+ if $c eq q{(} {
+ @stack.push($i);
+ } else {
+ @stack.pop;
+ if @stack.elems == 0 {
+ @stack.push($i);
+ } else {
+ my $len = $i - @stack[*-1];
+ if $len > $max {
+ $max = $len;
+ }
+ }
+ }
+ }
+
+ say $max;
+}
diff --git a/challenge-346/jaldhar-h-vyas/raku/ch-2.raku b/challenge-346/jaldhar-h-vyas/raku/ch-2.raku
new file mode 100755
index 0000000000..3ebc937650
--- /dev/null
+++ b/challenge-346/jaldhar-h-vyas/raku/ch-2.raku
@@ -0,0 +1,59 @@
+#!/usr/bin/raku
+
+class DepthFirstSearch {
+ has Str $.str is required;
+ has Int $.target is required;
+ has Int $!n;
+ has @!result;
+
+ submethod BUILD(:$str, :$target) {
+ $!str = $str;
+ $!target = $target;
+ $!n = $str.chars;
+ @!result = ();
+ }
+
+ method find() {
+ self!search(0, q{}, 0, 0);
+ return @!result;
+ }
+
+ method !search($i, $expr, $current, $previous) {
+ if $i == $!n {
+ if $current == $!target {
+ @!result.push($expr);
+ }
+ return self;
+ }
+
+ for 1 .. ($!n - $i) -> $len {
+ my $part = $!str.substr($i, $len);
+ if $part.chars > 1 && $part ~~ /^0/ {
+ next;
+ }
+ my $num = $part.Int;
+
+ if $i == 0 {
+ self!search($i + $len, $part, $num, $num);
+ } else {
+ self!search(
+ $i + $len, $expr ~ '*' ~ $part,
+ $current - $previous + $previous * $num, $previous * $num);
+ self!search($i + $len, $expr ~ '+' ~ $part,
+ $current + $num, $num);
+ self!search($i + $len, $expr ~ '-' ~ $part,
+ $current - $num, -$num);
+ }
+ }
+ return self;
+ }
+}
+
+sub MAIN(
+ $str,
+ $target
+) {
+ my $dfs = DepthFirstSearch.new(str => $str, target => $target);
+ say q{(}, $dfs.find.map({ "\"$_\"" }).join(q{, }), q{)};
+}
+