diff options
| -rw-r--r-- | challenge-275/mark-anderson/raku/ch-1.raku | 15 | ||||
| -rw-r--r-- | challenge-275/mark-anderson/raku/ch-2-benchmark.raku | 55 | ||||
| -rw-r--r-- | challenge-275/mark-anderson/raku/ch-2.raku | 21 |
3 files changed, 91 insertions, 0 deletions
diff --git a/challenge-275/mark-anderson/raku/ch-1.raku b/challenge-275/mark-anderson/raku/ch-1.raku new file mode 100644 index 0000000000..2fd24dc19a --- /dev/null +++ b/challenge-275/mark-anderson/raku/ch-1.raku @@ -0,0 +1,15 @@ +#!/usr/bin/env raku +use Test; + +is broken-keys("Perl Weekly Challenger", <l a>), 0; +is broken-keys("Perl and Raku", <a>), 1; +is broken-keys("Well done team PWC", <l o>), 2; +is broken-keys("The joys of polyglottism", <T>), 2; + +sub broken-keys +{ + my $s = $^a.fc; + my $k = $^b>>.fc; + + + $s.words.grep({ .comb.any !~~ $k.any }) +} diff --git a/challenge-275/mark-anderson/raku/ch-2-benchmark.raku b/challenge-275/mark-anderson/raku/ch-2-benchmark.raku new file mode 100644 index 0000000000..bb44f0f059 --- /dev/null +++ b/challenge-275/mark-anderson/raku/ch-2-benchmark.raku @@ -0,0 +1,55 @@ +#!/usr/bin/env raku +use Benchy; + +my $string = [~] gather for ^100 +{ + my $n = (1..100).pick; + my @chars = ('a'..'z').Array.roll($n); + take [~] @chars; + + $n = (1..100).pick; + my @digits = (^10).Array.roll($n); + take [~] @digits +} + +# 😠😠😠😠😠+ +b 10, { replace-digits-old($string) }, + { replace-digits-new($string) } + +# Bare: 0.000041032s +# Old: 1.344218988s +# New: 5.990887955s +# OLD version is 4.46x faster + +sub replace-digits-old($s) +{ + my $last-c; + + [~] gather for $s.comb -> $c + { + if $c ~~ 0..9 + { + take chr($last-c.ord + $c) + } + + else + { + $last-c = $c; + take $c + } + } +} + +sub replace-digits-new($s) +{ + my ($head, $tail) = $s.split(/ <.alpha>+ $ /, :v); + + my @result = do for $head.split(/ <.digit>+ /, :v:skip-empty).batch(2) + { + my $char = .head ~~ / <.alpha> $ /; + .head ~ [~] .tail.comb.map({ chr($char.ord + $_) }) + } + + ([~] @result) ~ ($tail or Empty) +} diff --git a/challenge-275/mark-anderson/raku/ch-2.raku b/challenge-275/mark-anderson/raku/ch-2.raku new file mode 100644 index 0000000000..2ef1b3b45d --- /dev/null +++ b/challenge-275/mark-anderson/raku/ch-2.raku @@ -0,0 +1,21 @@ +#!/usr/bin/env raku +use Test; + +is replace-digits('a1c1e1'), 'abcdef'; +is replace-digits('a1b2c3d4'), 'abbdcfdh'; +is replace-digits('b2b'), 'bdb'; +is replace-digits('a16z'), 'abgz'; +is replace-digits('a16bzd7'), 'abgbzdk'; + +sub replace-digits($s) +{ + my ($head, $tail) = $s.split(/ <.alpha>+ $ /, :v); + + my @result = do for $head.split(/ <.digit>+ /, :v:skip-empty).batch(2) + { + my $char = .head ~~ / <.alpha> $ /; + .head ~ [~] .tail.comb.map({ chr($char.ord + $_) }) + } + + ([~] @result) ~ ($tail or Empty) +} |
