diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-04-24 01:02:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-24 01:02:37 +0100 |
| commit | acacb42d46a7c67c2643241a5ee18c3f2eb644dd (patch) | |
| tree | 48a2e8e5f5c3ca71ae5dbfd2ed92d90572977642 | |
| parent | 5d3214f0f44aa76e4dc9376add47ce3bcf4b9816 (diff) | |
| parent | 4b1ad15a0bb16f5c70279342e004befdb7a8ad73 (diff) | |
| download | perlweeklychallenge-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.raku | 31 | ||||
| -rw-r--r-- | challenge-212/barroff/raku/ch-2.raku | 39 |
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)'; +} |
