diff options
| author | Mark Anderson <mark@andemark.io> | 2024-06-24 16:22:56 +0000 |
|---|---|---|
| committer | Mark Anderson <mark@andemark.io> | 2024-06-24 16:22:56 +0000 |
| commit | 514ed2553f66f2a534eb9f98a3b26b7b7a2d91c1 (patch) | |
| tree | 3b675708f0de3de47ca60a7e721d76bc0a4c7b03 | |
| parent | 0bf1a8f78a7032c192a341803615ce331e30306a (diff) | |
| download | perlweeklychallenge-club-514ed2553f66f2a534eb9f98a3b26b7b7a2d91c1.tar.gz perlweeklychallenge-club-514ed2553f66f2a534eb9f98a3b26b7b7a2d91c1.tar.bz2 perlweeklychallenge-club-514ed2553f66f2a534eb9f98a3b26b7b7a2d91c1.zip | |
Challenge 275 Solutions (Raku)
| -rw-r--r-- | challenge-275/mark-anderson/raku/ch-2-benchmark.raku | 55 | ||||
| -rw-r--r-- | challenge-275/mark-anderson/raku/ch-2.raku | 4 |
2 files changed, 57 insertions, 2 deletions
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..7fb8999327 --- /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 index e88360e34e..2ef1b3b45d 100644 --- a/challenge-275/mark-anderson/raku/ch-2.raku +++ b/challenge-275/mark-anderson/raku/ch-2.raku @@ -5,7 +5,7 @@ is replace-digits('a1c1e1'), 'abcdef'; is replace-digits('a1b2c3d4'), 'abbdcfdh'; is replace-digits('b2b'), 'bdb'; is replace-digits('a16z'), 'abgz'; -is replace-digits('a16bzd7'), 'abgdk'; +is replace-digits('a16bzd7'), 'abgbzdk'; sub replace-digits($s) { @@ -14,7 +14,7 @@ sub replace-digits($s) my @result = do for $head.split(/ <.digit>+ /, :v:skip-empty).batch(2) { my $char = .head ~~ / <.alpha> $ /; - $char ~ [~] .tail.comb.map({ chr($char.ord + $_) }) + .head ~ [~] .tail.comb.map({ chr($char.ord + $_) }) } ([~] @result) ~ ($tail or Empty) |
