diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-11-09 14:04:20 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-09 14:04:20 +0000 |
| commit | 1152a1cf6455e24d207aeebe3a24566f73098dd2 (patch) | |
| tree | c7d2e070e6f8f69c7299db3267f2caef355af7cd /challenge-346 | |
| parent | 44cbc0073e8831a63657c714d78e04aa32cee549 (diff) | |
| parent | 39834f5821185b33f2b2bbc1fec85089b39ae81a (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-346/arne-sommer/raku/ch-1.raku | 47 | ||||
| -rwxr-xr-x | challenge-346/arne-sommer/raku/ch-2.raku | 34 | ||||
| -rwxr-xr-x | challenge-346/arne-sommer/raku/longest-parenthesis | 47 | ||||
| -rwxr-xr-x | challenge-346/arne-sommer/raku/magic-expression | 31 | ||||
| -rwxr-xr-x | challenge-346/arne-sommer/raku/magic-expression-faster | 34 |
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(", ") })"; |
