aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-12-12 14:51:24 +0000
committerGitHub <noreply@github.com>2023-12-12 14:51:24 +0000
commit9556fdb8663e49dfe91304305a04479c10b43870 (patch)
tree6685e59cd7d4040f50f98bd28f7f3751f7eaf4b3
parent98df168725aa587bd4db1e24018dae1ca77b29da (diff)
parent80ae4abbbd0c764ed3452bcb9261a37d76faf7b5 (diff)
downloadperlweeklychallenge-club-9556fdb8663e49dfe91304305a04479c10b43870.tar.gz
perlweeklychallenge-club-9556fdb8663e49dfe91304305a04479c10b43870.tar.bz2
perlweeklychallenge-club-9556fdb8663e49dfe91304305a04479c10b43870.zip
Merge pull request #9224 from andemark/challenge-247
Challenge 247 Solutions (Raku)
-rw-r--r--challenge-247/mark-anderson/raku/ch-1.raku58
-rw-r--r--challenge-247/mark-anderson/raku/ch-2.raku26
2 files changed, 84 insertions, 0 deletions
diff --git a/challenge-247/mark-anderson/raku/ch-1.raku b/challenge-247/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..3e3e059503
--- /dev/null
+++ b/challenge-247/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,58 @@
+#!/usr/bin/env raku
+use Test;
+
+is-deeply secret-santa(["Mr. Wall", "Mrs. Wall", "Mr. Anwar",
+ "Mrs. Anwar", "Mr. Conway", "Mr. Cross"]),
+ {
+ "Mrs. Anwar" => "Mr. Conway",
+ "Mr. Conway" => "Mr. Cross",
+ "Mr. Cross" => "Mrs. Wall",
+ "Mrs. Wall" => "Mr. Anwar",
+ "Mr. Anwar" => "Mr. Wall",
+ "Mr. Wall" => "Mrs. Anwar"
+ }
+
+is-deeply secret-santa(["Mr. Wall", "Mrs. Wall", "Mr. Anwar"]),
+ {
+ "Mr. Anwar" => "Mrs. Wall",
+ "Mr. Wall" => "Mr. Anwar",
+ "Mrs. Wall" => "Mr. Wall"
+ }
+
+# Example from Peter Campbell Smith
+is-deeply secret-santa(["Rudolph Reindeer", "Dasher Reindeer",
+ "Dancer Reindeer", "Prancer Reindeer",
+ "Vixen Reindeer", "Comet Reindeer",
+ "Cupid Reindeer", "Donner Reindeer",
+ "Blitzen Reindeer", "Santa Claus",
+ "Mrs. Claus", "Subordinate Claus"]),
+ {
+ "Donner Reindeer" => "Mrs. Claus",
+ "Blitzen Reindeer" => "Subordinate Claus",
+ "Cupid Reindeer" => "Santa Claus",
+ "Dancer Reindeer" => "Dasher Reindeer",
+ "Comet Reindeer" => "Vixen Reindeer",
+ "Dasher Reindeer" => "Rudolph Reindeer",
+ "Vixen Reindeer" => "Prancer Reindeer",
+ "Rudolph Reindeer" => "Blitzen Reindeer",
+ "Prancer Reindeer" => "Dancer Reindeer",
+ "Santa Claus" => "Comet Reindeer",
+ "Subordinate Claus" => "Donner Reindeer",
+ "Mrs. Claus" => "Cupid Reindeer",
+ }
+
+sub secret-santa(@names)
+{
+ my %surname = @names.classify({ .words[1] });
+
+ my @r = gather given %surname.values.sort.Array
+ {
+ while .elems
+ {
+ take .head.pop;
+ .head ?? $_ .= rotate !! .shift
+ }
+ }
+
+ @r.push(@r.head).rotor(2 => -1).map({ .pairup.head }).Hash
+}
diff --git a/challenge-247/mark-anderson/raku/ch-2.raku b/challenge-247/mark-anderson/raku/ch-2.raku
new file mode 100644
index 0000000000..82ab53feb8
--- /dev/null
+++ b/challenge-247/mark-anderson/raku/ch-2.raku
@@ -0,0 +1,26 @@
+#!/usr/bin/env raku
+use Test;
+
+is most-freq-pair("abcdbca"), "bc";
+is most-freq-pair("cdeabeabfcdfabgcd"), "ab";
+
+say most-freq-pair([~] ("a".."z").roll(100_000));
+
+multi most-freq-pair($str where .chars < 100_000)
+{
+ ($str ~~ m:ov/../)>>.Str.Bag.maxpairs.sort.head.key
+}
+
+multi most-freq-pair($str)
+{
+ my $len = ($str.chars / $*KERNEL.cpu-cores).ceiling;
+
+ my @promises = (^$*KERNEL.cpu-cores).map(
+ {
+ start { ($str.substr(($len * $_), $len+1) ~~ m:ov/../)>>.Str.Bag }
+ });
+
+ await @promises;
+
+ ([(+)] @promises>>.result).maxpairs.sort.head.key
+}