From 87a17ee467b49dd156cec7571f67dfb4120159b0 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 24 Jun 2024 12:54:34 +0000 Subject: Challenge 275 Solutions (Raku) --- challenge-275/mark-anderson/raku/ch-1.raku | 15 +++++++++++++++ challenge-275/mark-anderson/raku/ch-2.raku | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 challenge-275/mark-anderson/raku/ch-1.raku create mode 100644 challenge-275/mark-anderson/raku/ch-2.raku 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", ), 0; +is broken-keys("Perl and Raku", ), 1; +is broken-keys("Well done team PWC", ), 2; +is broken-keys("The joys of polyglottism", ), 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.raku b/challenge-275/mark-anderson/raku/ch-2.raku new file mode 100644 index 0000000000..412bfea82f --- /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'), 'abgdk'; + +sub replace-digits($s) +{ + my ($head, $tail) = $s.split(/ <.alpha>+ $ /, :v); + + my @result = do for $head.split(/\d+/, :v:skip-empty).batch(2) + { + my $char = .head ~~ / <.alpha> $ /; + $char ~ [~] .tail.comb.map({ chr($char.ord + $_) }) + } + + ([~] @result) ~ ($tail or Empty) +} -- cgit From 0bf1a8f78a7032c192a341803615ce331e30306a Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 24 Jun 2024 13:07:46 +0000 Subject: Challenge 275 Solutions (Raku) --- challenge-275/mark-anderson/raku/ch-2.raku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-275/mark-anderson/raku/ch-2.raku b/challenge-275/mark-anderson/raku/ch-2.raku index 412bfea82f..e88360e34e 100644 --- a/challenge-275/mark-anderson/raku/ch-2.raku +++ b/challenge-275/mark-anderson/raku/ch-2.raku @@ -11,7 +11,7 @@ sub replace-digits($s) { my ($head, $tail) = $s.split(/ <.alpha>+ $ /, :v); - my @result = do for $head.split(/\d+/, :v:skip-empty).batch(2) + my @result = do for $head.split(/ <.digit>+ /, :v:skip-empty).batch(2) { my $char = .head ~~ / <.alpha> $ /; $char ~ [~] .tail.comb.map({ chr($char.ord + $_) }) -- cgit From 514ed2553f66f2a534eb9f98a3b26b7b7a2d91c1 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 24 Jun 2024 16:22:56 +0000 Subject: Challenge 275 Solutions (Raku) --- .../mark-anderson/raku/ch-2-benchmark.raku | 55 ++++++++++++++++++++++ challenge-275/mark-anderson/raku/ch-2.raku | 4 +- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 challenge-275/mark-anderson/raku/ch-2-benchmark.raku 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) -- cgit From 6574ce41758f8ecb16b59e411603930c1c670b8d Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 24 Jun 2024 16:47:09 +0000 Subject: Challenge 275 Solutions (Raku) --- challenge-275/mark-anderson/raku/ch-2-benchmark.raku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-275/mark-anderson/raku/ch-2-benchmark.raku b/challenge-275/mark-anderson/raku/ch-2-benchmark.raku index 7fb8999327..bb44f0f059 100644 --- a/challenge-275/mark-anderson/raku/ch-2-benchmark.raku +++ b/challenge-275/mark-anderson/raku/ch-2-benchmark.raku @@ -15,7 +15,7 @@ my $string = [~] gather for ^100 # 😭 😭 😭 😭 😭 b 10, { replace-digits-old($string) }, - { replace-digits-new($string) } + { replace-digits-new($string) } # Bare: 0.000041032s # Old: 1.344218988s -- cgit