aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2023-04-24 01:02:37 +0100
committerGitHub <noreply@github.com>2023-04-24 01:02:37 +0100
commitacacb42d46a7c67c2643241a5ee18c3f2eb644dd (patch)
tree48a2e8e5f5c3ca71ae5dbfd2ed92d90572977642
parent5d3214f0f44aa76e4dc9376add47ce3bcf4b9816 (diff)
parent4b1ad15a0bb16f5c70279342e004befdb7a8ad73 (diff)
downloadperlweeklychallenge-club-acacb42d46a7c67c2643241a5ee18c3f2eb644dd.tar.gz
perlweeklychallenge-club-acacb42d46a7c67c2643241a5ee18c3f2eb644dd.tar.bz2
perlweeklychallenge-club-acacb42d46a7c67c2643241a5ee18c3f2eb644dd.zip
Merge pull request #7960 from BarrOff/barroff-212
feat: add solutions for challenge 212 from BarrOff
-rw-r--r--challenge-212/barroff/raku/ch-1.raku31
-rw-r--r--challenge-212/barroff/raku/ch-2.raku39
2 files changed, 70 insertions, 0 deletions
diff --git a/challenge-212/barroff/raku/ch-1.raku b/challenge-212/barroff/raku/ch-1.raku
new file mode 100644
index 0000000000..3cfe286c97
--- /dev/null
+++ b/challenge-212/barroff/raku/ch-1.raku
@@ -0,0 +1,31 @@
+#!/usr/bin/env raku
+
+use v6.d;
+
+multi sub shift-letter(Str $s where $s ∈ 'a' .. 'z', Int $n --> Str) {
+ my @number-to-letter = ('a' .. 'z').List;
+ my %letter-to-number = @number-to-letter.antipairs.hash;
+ my $new-number = (%letter-to-number{$s} + $n) % @number-to-letter.elems;
+ return @number-to-letter[$new-number];
+}
+
+multi sub shift-letter(Str $s where $s ∈ 'A' .. 'Z', Int $n --> Str) {
+ my @number-to-letter = ('A' .. 'Z').List;
+ my %letter-to-number = @number-to-letter.antipairs.hash;
+ my $new-number = (%letter-to-number{$s} + $n) % @number-to-letter.elems;
+ return @number-to-letter[$new-number];
+}
+
+sub jumping-letters(Str $letters where $letters ~~ / ^ <[a..zA..Z]>+ $ /,
+ Int @shifts where $letters.chars == @shifts.elems --> Str) {
+ map({ shift-letter($_[0], $_[1]) }, ($letters.comb Z @shifts).List).join;
+}
+
+#| Run test cases
+multi sub MAIN('test') {
+ use Test;
+ plan 2;
+
+ is jumping-letters('Perl', Array[Int].new((2,22,19,9))), 'Raku', 'works for "Perl"';
+ is jumping-letters('Raku', Array[Int].new((24,4,7,17))), 'Perl', 'works for "Raku"';
+}
diff --git a/challenge-212/barroff/raku/ch-2.raku b/challenge-212/barroff/raku/ch-2.raku
new file mode 100644
index 0000000000..f7e32d03d7
--- /dev/null
+++ b/challenge-212/barroff/raku/ch-2.raku
@@ -0,0 +1,39 @@
+#!/usr/bin/env raku
+
+use v6.d;
+
+sub get-smallest-key(BagHash $bh --> Int) {
+ $bh.keys.min;
+}
+
+sub rearrange-groups(Int @numbers, Int $size) {
+ return -1 if @numbers.elems % $size ≠ 0;
+ my $remains = BagHash(@numbers);
+ my (Int $first-element, Range $range);
+ my @groups = gather {
+ while $remains {
+ $first-element = get-smallest-key($remains);
+ $range = $first-element .. $first-element + $size - 1;
+ 0 < map({ $remains{$_} }, $range.List).all
+ ?? take $range.List
+ !! return -1;
+ map({ $remains{$_}-- }, $range.List);
+ }
+ }
+ return @groups;
+}
+
+
+#| Run test cases
+multi sub MAIN('test') {
+ use Test;
+ plan 4;
+
+ is rearrange-groups(Array[Int].new(1,2,3,5,1,2,7,6,3), 3),
+ ((1,2,3), (1,2,3), (5,6,7)), 'Works for (1,2,3,5,1,2,7,6,3)';
+ is rearrange-groups(Array[Int].new(1,2,3), 2), -1, 'Works for (1,2,3)';
+ is rearrange-groups(Array[Int].new(1,2,4,3,5,3), 3),
+ ((1,2,3), (3,4,5)), 'Works for (1,2,4,3,5,3)';
+ is rearrange-groups(Array[Int].new(1,5,2,6,4,7), 3),
+ -1, 'Works for (1,5,2,6,4,7)';
+}