aboutsummaryrefslogtreecommitdiff
path: root/challenge-346
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-11-09 14:04:20 +0000
committerGitHub <noreply@github.com>2025-11-09 14:04:20 +0000
commit1152a1cf6455e24d207aeebe3a24566f73098dd2 (patch)
treec7d2e070e6f8f69c7299db3267f2caef355af7cd /challenge-346
parent44cbc0073e8831a63657c714d78e04aa32cee549 (diff)
parent39834f5821185b33f2b2bbc1fec85089b39ae81a (diff)
downloadperlweeklychallenge-club-1152a1cf6455e24d207aeebe3a24566f73098dd2.tar.gz
perlweeklychallenge-club-1152a1cf6455e24d207aeebe3a24566f73098dd2.tar.bz2
perlweeklychallenge-club-1152a1cf6455e24d207aeebe3a24566f73098dd2.zip
Merge pull request #12987 from arnesom/challenge-346-arne-sommer
week 346 Arne Sommer
Diffstat (limited to 'challenge-346')
-rw-r--r--challenge-346/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-346/arne-sommer/raku/ch-1.raku47
-rwxr-xr-xchallenge-346/arne-sommer/raku/ch-2.raku34
-rwxr-xr-xchallenge-346/arne-sommer/raku/longest-parenthesis47
-rwxr-xr-xchallenge-346/arne-sommer/raku/magic-expression31
-rwxr-xr-xchallenge-346/arne-sommer/raku/magic-expression-faster34
6 files changed, 194 insertions, 0 deletions
diff --git a/challenge-346/arne-sommer/blog.txt b/challenge-346/arne-sommer/blog.txt
new file mode 100644
index 0000000000..0e6c290166
--- /dev/null
+++ b/challenge-346/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/parenthesised-magic.html \ No newline at end of file
diff --git a/challenge-346/arne-sommer/raku/ch-1.raku b/challenge-346/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..5ca9d93fc3
--- /dev/null
+++ b/challenge-346/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,47 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ /^ <[\(\)]>+ $/,
+ :v(:$verbose));
+
+my $balanced := gather
+{
+ for ^($str.chars) -> $i
+ {
+ my $match = "";
+ my $balance = 0;
+
+ for $str.substr($i).comb -> $char
+ {
+ if $char eq "("
+ {
+ $balance++;
+ $match ~= "(";
+ }
+ elsif $balance == 0
+ {
+ last;
+ }
+ else
+ {
+ $balance--;
+ $match ~= ")";
+ }
+
+ take { index => $i, match => $match } if $balance == 0;
+ }
+ }
+}
+
+my $longest = 0;
+
+for $balanced -> $curr
+{
+ my $length = $curr<match>.chars;
+ my $is-max = $length > $longest;
+
+ $longest = $length if $is-max;
+
+ say ": Candidate '{ $curr<match> }' at index $curr<index> { $is-max ?? " -> new max $length" !! "" }" if $verbose;
+}
+
+say $longest;
diff --git a/challenge-346/arne-sommer/raku/ch-2.raku b/challenge-346/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..e5c9b7942d
--- /dev/null
+++ b/challenge-346/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,34 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ /^ <[0..9]>+ $/,
+ Int $target,
+ :v(:$verbose));
+
+my $op-size = $str.chars -1;
+my @ops = (("+", "-", "*", "") xx $op-size).flat;
+my @digits = $str.comb;
+my @matches;
+my %seen;
+
+say ": Operators: { @ops.raku }" if $verbose;
+
+for @ops.combinations($op-size) -> @op
+{
+ my $eval = roundrobin(@digits, @op)>>.join.join;
+
+ next if %seen{$eval}++;
+
+ if $eval ~~ /^0<[0..9]>/ || $eval ~~ /<[+*-]>0<[0..9]>/
+ {
+ say ": $eval has a leading zero; skip" if $verbose;
+ next;
+ }
+
+ my $sum = $eval.EVAL;
+ my $is-equal = $sum == $target;
+ say ": $eval = $sum { $is-equal ?? "OK" !! "(!= $target)" }" if $verbose;
+
+ @matches.push: $eval if $is-equal;
+}
+
+say "({ @matches.map('"' ~ * ~ '"').join(", ") })";
diff --git a/challenge-346/arne-sommer/raku/longest-parenthesis b/challenge-346/arne-sommer/raku/longest-parenthesis
new file mode 100755
index 0000000000..5ca9d93fc3
--- /dev/null
+++ b/challenge-346/arne-sommer/raku/longest-parenthesis
@@ -0,0 +1,47 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ /^ <[\(\)]>+ $/,
+ :v(:$verbose));
+
+my $balanced := gather
+{
+ for ^($str.chars) -> $i
+ {
+ my $match = "";
+ my $balance = 0;
+
+ for $str.substr($i).comb -> $char
+ {
+ if $char eq "("
+ {
+ $balance++;
+ $match ~= "(";
+ }
+ elsif $balance == 0
+ {
+ last;
+ }
+ else
+ {
+ $balance--;
+ $match ~= ")";
+ }
+
+ take { index => $i, match => $match } if $balance == 0;
+ }
+ }
+}
+
+my $longest = 0;
+
+for $balanced -> $curr
+{
+ my $length = $curr<match>.chars;
+ my $is-max = $length > $longest;
+
+ $longest = $length if $is-max;
+
+ say ": Candidate '{ $curr<match> }' at index $curr<index> { $is-max ?? " -> new max $length" !! "" }" if $verbose;
+}
+
+say $longest;
diff --git a/challenge-346/arne-sommer/raku/magic-expression b/challenge-346/arne-sommer/raku/magic-expression
new file mode 100755
index 0000000000..fcf8d3a62f
--- /dev/null
+++ b/challenge-346/arne-sommer/raku/magic-expression
@@ -0,0 +1,31 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ /^ <[0..9]>+ $/,
+ Int $target,
+ :v(:$verbose));
+
+my $op-size = $str.chars -1;
+my @ops = (("+", "-", "*", "") xx $op-size).flat;
+my @digits = $str.comb;
+my @matches;
+
+say ": Operators: { @ops.raku }" if $verbose;
+
+for @ops.combinations($op-size) -> @op
+{
+ my $eval = roundrobin(@digits, @op)>>.join.join;
+
+ if $eval ~~ /^0<[0..9]>/ || $eval ~~ /<[+*-]>0<[0..9]>/
+ {
+ say ": $eval has a leading zero; skip" if $verbose;
+ next;
+ }
+
+ my $sum = $eval.EVAL;
+ my $is-equal = $sum == $target;
+ say ": $eval = $sum { $is-equal ?? "OK" !! "(!= $target)" }" if $verbose;
+
+ @matches.push: $eval if $is-equal;
+}
+
+say "({ @matches.unique.map('"' ~ * ~ '"').join(", ") })";
diff --git a/challenge-346/arne-sommer/raku/magic-expression-faster b/challenge-346/arne-sommer/raku/magic-expression-faster
new file mode 100755
index 0000000000..e5c9b7942d
--- /dev/null
+++ b/challenge-346/arne-sommer/raku/magic-expression-faster
@@ -0,0 +1,34 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ /^ <[0..9]>+ $/,
+ Int $target,
+ :v(:$verbose));
+
+my $op-size = $str.chars -1;
+my @ops = (("+", "-", "*", "") xx $op-size).flat;
+my @digits = $str.comb;
+my @matches;
+my %seen;
+
+say ": Operators: { @ops.raku }" if $verbose;
+
+for @ops.combinations($op-size) -> @op
+{
+ my $eval = roundrobin(@digits, @op)>>.join.join;
+
+ next if %seen{$eval}++;
+
+ if $eval ~~ /^0<[0..9]>/ || $eval ~~ /<[+*-]>0<[0..9]>/
+ {
+ say ": $eval has a leading zero; skip" if $verbose;
+ next;
+ }
+
+ my $sum = $eval.EVAL;
+ my $is-equal = $sum == $target;
+ say ": $eval = $sum { $is-equal ?? "OK" !! "(!= $target)" }" if $verbose;
+
+ @matches.push: $eval if $is-equal;
+}
+
+say "({ @matches.map('"' ~ * ~ '"').join(", ") })";