aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-275/mark-anderson/raku/ch-1.raku15
-rw-r--r--challenge-275/mark-anderson/raku/ch-2-benchmark.raku55
-rw-r--r--challenge-275/mark-anderson/raku/ch-2.raku21
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)
+}