aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-12-12 14:54:20 +0000
committerGitHub <noreply@github.com>2023-12-12 14:54:20 +0000
commit87643d44b36bfa49ad35ef3ba51f5d50bd9cd007 (patch)
treedb9538c3e0cf9777015e64a78b7265ca346bd549
parent4d6177e9e98feabf99890f95cedcbd85b354bf97 (diff)
parent3839b4b035697af7edd9ac1ad6c720ab6cd003e0 (diff)
downloadperlweeklychallenge-club-87643d44b36bfa49ad35ef3ba51f5d50bd9cd007.tar.gz
perlweeklychallenge-club-87643d44b36bfa49ad35ef3ba51f5d50bd9cd007.tar.bz2
perlweeklychallenge-club-87643d44b36bfa49ad35ef3ba51f5d50bd9cd007.zip
Merge pull request #9232 from Firedrake/rogerbw-challenge-247
RogerBW solutions for challenge no. 247
-rwxr-xr-xchallenge-247/roger-bell-west/javascript/ch-1.js52
-rwxr-xr-xchallenge-247/roger-bell-west/javascript/ch-2.js32
-rw-r--r--challenge-247/roger-bell-west/kotlin/ch-1.kt50
-rw-r--r--challenge-247/roger-bell-west/kotlin/ch-2.kt31
-rwxr-xr-xchallenge-247/roger-bell-west/lua/ch-1.lua69
-rwxr-xr-xchallenge-247/roger-bell-west/lua/ch-2.lua40
-rwxr-xr-xchallenge-247/roger-bell-west/perl/ch-1.pl45
-rwxr-xr-xchallenge-247/roger-bell-west/perl/ch-2.pl23
-rw-r--r--challenge-247/roger-bell-west/postscript/ch-1.ps192
-rw-r--r--challenge-247/roger-bell-west/postscript/ch-2.ps272
-rwxr-xr-xchallenge-247/roger-bell-west/python/ch-1.py40
-rwxr-xr-xchallenge-247/roger-bell-west/python/ch-2.py25
-rwxr-xr-xchallenge-247/roger-bell-west/raku/ch-1.p643
-rwxr-xr-xchallenge-247/roger-bell-west/raku/ch-2.p619
-rwxr-xr-xchallenge-247/roger-bell-west/ruby/ch-1.rb52
-rwxr-xr-xchallenge-247/roger-bell-west/ruby/ch-2.rb31
-rwxr-xr-xchallenge-247/roger-bell-west/rust/ch-1.rs61
-rwxr-xr-xchallenge-247/roger-bell-west/rust/ch-2.rs30
-rw-r--r--challenge-247/roger-bell-west/scala/ch-1.scala51
-rw-r--r--challenge-247/roger-bell-west/scala/ch-2.scala33
-rw-r--r--challenge-247/roger-bell-west/tests.yaml22
21 files changed, 1213 insertions, 0 deletions
diff --git a/challenge-247/roger-bell-west/javascript/ch-1.js b/challenge-247/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..e63be00da6
--- /dev/null
+++ b/challenge-247/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,52 @@
+#! /usr/bin/node
+
+"use strict"
+
+function secretsanta(name) {
+ let family = [];
+ for (let n of name) {
+ let surname = n.split(" ");
+ family.push(surname[surname.length - 1]);
+ }
+ let receivers = new Set(Array(name.length).fill().map((element, index) => index));
+ let gifting = [];
+ for (let giver = 0; giver < name.length; giver++) {
+ let done = false;
+ let r = 0;
+ for (let recipient of receivers) {
+ if (family[giver] != family[recipient]) {
+ r = recipient;
+ done = true;
+ break;
+ }
+ }
+ if (!done) {
+ for (let recipient of receivers) {
+ if (recipient != giver) {
+ r = recipient;
+ break;
+ }
+ }
+ }
+ receivers.delete(r)
+ gifting.push([name[giver], name[r]]);
+ }
+ for (let p of gifting) {
+ console.log("%s -> %s", p[0], p[1]);
+ }
+ console.log("");
+ return true;
+}
+
+if (secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar', 'Mrs. Anwar', 'Mr. Conway', 'Mr. Cross'])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar'])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-247/roger-bell-west/javascript/ch-2.js b/challenge-247/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..6ba8875493
--- /dev/null
+++ b/challenge-247/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,32 @@
+#! /usr/bin/node
+
+"use strict"
+
+function mostfrequentletterpair(s) {
+ let f = new Map;
+ for (let i = 0; i < s.length - 1; i++) {
+ let pair = s.substring(i, i + 2);
+ if (f.has(pair)) {
+ f.set(pair,f.get(pair)+1);
+ } else {
+ f.set(pair,1);
+ }
+ }
+ const m = Math.max(...f.values());
+ let l = Array.from(f.keys()).filter(i => f.get(i) == m);
+ l.sort();
+ return l[0];
+}
+
+if (mostfrequentletterpair('abcdbca') == 'bc') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (mostfrequentletterpair('cdeabeabfcdfabgcd') == 'ab') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-247/roger-bell-west/kotlin/ch-1.kt b/challenge-247/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..9aab0e29d7
--- /dev/null
+++ b/challenge-247/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,50 @@
+fun secretsanta(name: List<String>): Boolean {
+ val family: List<String> = name.map{n -> n.split(" ").last()}.toList()
+ var receivers = generateSequence(0) { it + 1 }.take(name.size).toMutableSet()
+ var gifting = ArrayList<List<String>>()
+ for (giver in 0 .. name.size - 1) {
+ var done = false
+ var r = 0
+ for (recipient in receivers) {
+ if (family[giver] != family[recipient]) {
+ r = recipient
+ done = true
+ break
+ }
+ }
+ if (!done) {
+ for (recipient in receivers) {
+ if (giver != recipient) {
+ r = recipient
+ break
+ }
+ }
+ }
+ receivers.remove(r)
+ gifting.add(listOf(name[giver], name[r]))
+ }
+ for (p in gifting) {
+ print(p[0])
+ print(" -> ")
+ println(p[1])
+ }
+ println("")
+ return true;
+}
+
+fun main() {
+
+ if (secretsanta(listOf("Mr. Wall", "Mrs. Wall", "Mr. Anwar", "Mrs. Anwar", "Mr. Conway", "Mr. Cross"))) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (secretsanta(listOf("Mr. Wall", "Mrs. Wall", "Mr. Anwar"))) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-247/roger-bell-west/kotlin/ch-2.kt b/challenge-247/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..6ada6d0aa3
--- /dev/null
+++ b/challenge-247/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,31 @@
+ fun mostfrequentletterpair(s: String): String {
+ var f = mutableMapOf<String, Int>()
+ for ( i in 0 .. s.length - 2 ) {
+ val ss = s.substring(i,i + 2)
+ var nv = 1
+ if (f.containsKey(ss)) {
+ nv = 1 + f.getValue(ss)
+ }
+ f[ss] = nv
+ }
+ val m = f.values.maxOrNull()!!
+ val l = f.keys.filter{i -> f[i] == m}.toList().sorted()
+ return l[0]
+ }
+
+fun main() {
+
+ if (mostfrequentletterpair("abcdbca") == "bc") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (mostfrequentletterpair("cdeabeabfcdfabgcd") == "ab") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-247/roger-bell-west/lua/ch-1.lua b/challenge-247/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..9b1bf20f97
--- /dev/null
+++ b/challenge-247/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,69 @@
+#! /usr/bin/lua
+
+-- bart at https://stackoverflow.com/questions/1426954/split-string-in-lua
+function split(inputstr, sep)
+ sep=sep or '%s'
+ local t={}
+ for field,s in string.gmatch(inputstr, "([^"..sep.."]*)("..sep.."?)") do
+ table.insert(t,field)
+ if s=="" then
+ return t
+ end
+ end
+end
+
+function secretsanta(name)
+ local family = {}
+ for _, n in ipairs(name) do
+ local surname = split(n, " ")
+ table.insert(family, surname[#surname])
+ end
+ local receivers = {}
+ for n = 1, #name do
+ receivers[n] = true
+ end
+ local gifting = {}
+ for giver = 1, #name do
+ local done = false
+ local r = 0
+ for recipient, _ in pairs(receivers) do
+ if family[giver] ~= family[recipient] then
+ r = recipient
+ done = true
+ break
+ end
+ end
+ if not done then
+ for recipient, _ in pairs(receivers) do
+ if giver ~= recipient then
+ r = recipient
+ break
+ end
+ end
+ end
+ receivers[r] = nil
+ table.insert(gifting, {name[giver], name[r]})
+ end
+ for _, p in ipairs(gifting) do
+ io.write(p[1])
+ io.write(" -> ")
+ print(p[2])
+ end
+ print("")
+ return true
+end
+
+if secretsanta({"Mr. Wall", "Mrs. Wall", "Mr. Anwar", "Mrs. Anwar", "Mr. Conway", "Mr. Cross"}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if secretsanta({"Mr. Wall", "Mrs. Wall", "Mr. Anwar"}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-247/roger-bell-west/lua/ch-2.lua b/challenge-247/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..e3bccde3d7
--- /dev/null
+++ b/challenge-247/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,40 @@
+#! /usr/bin/lua
+
+function mostfrequentletterpair(s)
+ local f = {}
+ local m = 0
+ for i = 0,string.len(s) - 1 do
+ pair = string.sub(s, i, i + 1)
+ if f[pair] == nil then
+ f[pair] = 1
+ else
+ f[pair] = f[pair] + 1
+ if f[pair] > m then
+ m = f[pair]
+ end
+ end
+ end
+ local l = {}
+ for k, v in pairs(f) do
+ if v == m then
+ table.insert(l, k)
+ end
+ end
+ table.sort(l)
+ return l[1]
+end
+
+if mostfrequentletterpair("abcdbca") == "bc" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if mostfrequentletterpair("cdeabeabfcdfabgcd") == "ab" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-247/roger-bell-west/perl/ch-1.pl b/challenge-247/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..79bec4edbe
--- /dev/null
+++ b/challenge-247/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,45 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 2;
+
+is(secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar', 'Mrs. Anwar', 'Mr. Conway', 'Mr. Cross']), 1, 'example 1');
+is(secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar']), 1, 'example 2');
+
+sub secretsanta($name) {
+ my @family;
+ foreach my $n (@{$name}) {
+ push @family, (split(' ', $n))[-1];
+ }
+ my %receivers = map {$_ => 1} (0 .. $#{$name});
+ my @gifting;
+ foreach my $giver (0 .. $#{$name}) {
+ my $done = 0;
+ my $r = 0;
+ foreach my $recipient (keys %receivers) {
+ if ($family[$giver] ne $family[$recipient]) {
+ $r = $recipient;
+ $done = 1;
+ last;
+ }
+ }
+ if (!$done) {
+ foreach my $recipient (keys %receivers) {
+ if ($recipient != $giver) {
+ $r = $recipient;
+ last;
+ }
+ }
+ }
+ delete $receivers{$r};
+ push @gifting, [$name->[$giver], $name->[$r]];
+ }
+ foreach my $p (@gifting) {
+ print("$p->[0] -> $p->[1]\n");
+ }
+ print "\n";
+ return 1;
+}
diff --git a/challenge-247/roger-bell-west/perl/ch-2.pl b/challenge-247/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..cb015363d1
--- /dev/null
+++ b/challenge-247/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,23 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 2;
+
+is(mostfrequentletterpair('abcdbca'), 'bc', 'example 1');
+is(mostfrequentletterpair('cdeabeabfcdfabgcd'), 'ab', 'example 2');
+
+use List::Util qw(max);
+
+sub mostfrequentletterpair($s) {
+ my %f;
+ foreach my $i (0 .. length($s) - 2) {
+ my $pair = substr($s, $i, 2);
+ $f{$pair}++;
+ }
+ my $m = max(values %f);
+ my @l = sort {$a cmp $b} grep {$f{$_} == $m} keys %f;
+ return $l[0];
+}
diff --git a/challenge-247/roger-bell-west/postscript/ch-1.ps b/challenge-247/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..a10b6de394
--- /dev/null
+++ b/challenge-247/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,192 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/strsplit % (ajbjc) (j) -> [ (a) (b) (c) ]
+{
+ 1 dict begin
+ /sep exch def
+ [ exch
+ {
+ dup length 0 eq {
+ pop
+ exit
+ } {
+ sep search {
+ exch pop
+ dup length 0 eq {
+ pop
+ } {
+ exch
+ } ifelse
+ } {
+ ()
+ } ifelse
+ } ifelse
+ } loop
+ ]
+ end
+} bind def
+
+/deepeq {
+ 2 dict begin
+ /a exch def
+ /b exch def
+ a type b type eq {
+ a type /dicttype eq {
+ a length b length eq {
+ <<
+ a {
+ pop
+ true
+ } forall
+ b {
+ pop
+ true
+ } forall
+ >>
+ true exch
+ {
+ pop
+ dup a exch known {
+ dup b exch known {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ } if
+ } {
+ false
+ } ifelse
+ } {
+ false
+ } ifelse
+ } forall
+ } {
+ false
+ } ifelse
+ } {
+ a type dup /arraytype eq exch /stringtype eq or {
+ a length b length eq {
+ true
+ 0 1 a length 1 sub {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ exit
+ } if
+ } for
+ } {
+ false
+ } ifelse
+ } {
+ a b eq
+ } ifelse
+ } ifelse
+ } {
+ false
+ } ifelse
+ end
+} bind def
+
+/apush.right { % [a b] c -> [a b c]
+ exch
+ [ exch aload length 2 add -1 roll ]
+} bind def
+
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/keys { % dict -> array of dict keys
+ [ exch
+ {
+ pop
+ } forall
+ ]
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+/toset { % array -> dict of (value, true)
+ << exch
+ {
+ true
+ } forall
+ >>
+} bind def
+
+
+% end included library code
+
+/secretsanta {
+ 0 dict begin
+ /name exch def
+ /family [
+ name {
+ ( ) strsplit 1 get
+ } forall
+ ] def
+ /receivers [ 0 1 name length 1 sub { } for ] toset def
+ /gifting 0 array def
+ 0 1 name length 1 sub {
+ /giver exch def
+ /done false def
+ /r 0 def
+ receivers keys {
+ /recipient exch def
+ family giver get family recipient get deepeq not {
+ /r recipient def
+ /done true def
+ exit
+ } if
+ } forall
+ done not {
+ receivers keys {
+ /recipient exch def
+ recipient giver ne {
+ /r recipient def
+ exit
+ } if
+ } forall
+ } if
+ receivers r undef
+ /gifting gifting [ name giver get name r get ] apush.right def
+ } for
+ gifting {
+ /p exch def
+ p 0 get print
+ ( -> ) print
+ p 1 get =
+ } forall
+ () =
+ true
+ end
+} bind def
+
+(secretsanta) test.start
+[(Mr. Wall) (Mrs. Wall) (Mr. Anwar) (Mrs. Anwar) (Mr. Conway) (Mr. Cross)] secretsanta test
+[(Mr. Wall) (Mrs. Wall) (Mr. Anwar)] secretsanta test
+test.end
diff --git a/challenge-247/roger-bell-west/postscript/ch-2.ps b/challenge-247/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..b9b43b7204
--- /dev/null
+++ b/challenge-247/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,272 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/reduce { % array proc -> value
+ 2 dict begin
+ /p exch def
+ /a exch def
+ a 0 get
+ 1 1 a length 1 sub {
+ a exch get
+ p
+ } for
+ end
+} bind def
+
+/filter { % array proc(bool) -> array
+ 1 dict begin
+ /p exch def
+ [ exch
+ {
+ dup p not
+ {
+ pop
+ } if
+ } forall
+ ]
+ end
+} bind def
+
+/quicksort.swap {
+ 2 dict begin
+ /bi exch def
+ /ai exch def
+ arr ai get
+ arr bi get
+ arr exch ai exch put
+ arr exch bi exch put
+ end
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+/quicksort {
+ { quicksort.cmp } quicksort.with_comparator
+} bind def
+
+/quicksort.main { % lo hi -> (null)
+ 3 dict begin
+ /hi exch def
+ /lo exch def
+ /xit false def
+ lo 0 lt {
+ /xit true def
+ } if
+ hi 0 lt {
+ /xit true def
+ } if
+ lo hi ge {
+ /xit true def
+ } if
+ xit not {
+ /p quicksort.partition def
+ lo p quicksort.main
+ p 1 add hi quicksort.main
+ } if
+ end
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/deepeq {
+ 2 dict begin
+ /a exch def
+ /b exch def
+ a type b type eq {
+ a type /dicttype eq {
+ a length b length eq {
+ <<
+ a {
+ pop
+ true
+ } forall
+ b {
+ pop
+ true
+ } forall
+ >>
+ true exch
+ {
+ pop
+ dup a exch known {
+ dup b exch known {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ } if
+ } {
+ false
+ } ifelse
+ } {
+ false
+ } ifelse
+ } forall
+ } {
+ false
+ } ifelse
+ } {
+ a type dup /arraytype eq exch /stringtype eq or {
+ a length b length eq {
+ true
+ 0 1 a length 1 sub {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ exit
+ } if
+ } for
+ } {
+ false
+ } ifelse
+ } {
+ a b eq
+ } ifelse
+ } ifelse
+ } {
+ false
+ } ifelse
+ end
+} bind def
+
+/map { % array proc -> array
+ 2 dict begin
+ /p exch def
+ [ exch
+ {
+ p
+ } forall
+ ]
+ end
+} bind def
+
+/quicksort.with_comparator { % [ a c b ] { comparator } -> [ a b c ]
+ 2 dict begin
+ /cmp exch def
+ /arr exch def
+ arr length 0 gt {
+ 0 arr length 1 sub quicksort.main
+ } if
+ arr
+ end
+} bind def
+
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/dget {
+ 3 1 roll
+ 2 copy
+ known {
+ get exch pop
+ } {
+ pop pop
+ } ifelse
+} bind def
+
+/values { % dict -> array of dict values
+ [ exch
+ {
+ exch pop
+ } forall
+ ]
+} bind def
+
+/keys { % dict -> array of dict keys
+ [ exch
+ {
+ pop
+ } forall
+ ]
+} bind def
+
+/quicksort.cmp {
+ 2 copy
+ lt {
+ pop pop -1
+ } {
+ gt {
+ 1
+ } {
+ 0
+ } ifelse
+ } ifelse
+} bind def
+
+/listmax {
+ { max } reduce
+} bind def
+
+/quicksort.partition {
+ 3 dict begin
+ /pivot arr hi lo add 2 idiv get def
+ /i lo 1 sub def
+ /j hi 1 add def
+ {
+ {
+ /i i 1 add def
+ arr i get pivot cmp 0 ge {
+ exit
+ } if
+ } loop
+ {
+ /j j 1 sub def
+ arr j get pivot cmp 0 le {
+ exit
+ } if
+ } loop
+ i j ge {
+ j
+ exit
+ } if
+ i j quicksort.swap
+ } loop
+ end
+} bind def
+
+
+% end included library code
+
+/mostfrequentletterpair {
+ 0 dict begin
+ /s exch def
+ /f 0 dict def
+ 0 1 s length 2 sub {
+ s exch 2 getinterval /pair exch def
+ f pair 0 dget 1 add f exch pair exch put
+ } for
+ /m f values listmax def
+ f keys
+ { f exch get m eq } filter
+ { (..) cvs } map
+ quicksort
+ 0 get
+ end
+} bind def
+
+(mostfrequentletterpair) test.start
+(abcdbca) mostfrequentletterpair (bc) deepeq test
+(cdeabeabfcdfabgcd) mostfrequentletterpair (ab) deepeq test
+test.end
diff --git a/challenge-247/roger-bell-west/python/ch-1.py b/challenge-247/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..930bf8cccc
--- /dev/null
+++ b/challenge-247/roger-bell-west/python/ch-1.py
@@ -0,0 +1,40 @@
+#! /usr/bin/python3
+
+def secretsanta(name):
+ family = []
+ for n in name:
+ surname = n.split(" ")[-1]
+ family.append(surname)
+ receivers = set(range(len(name)))
+ gifting = []
+ for giver in range(len(name)):
+ done = False
+ r = 0
+ for recipient in receivers:
+ if family[giver] != family[recipient]:
+ r = recipient
+ done = True
+ break
+ if not done:
+ for recipient in receivers:
+ if recipient != giver:
+ r = recipient
+ break
+ receivers.discard(r)
+ gifting.append([name[giver], name[r]])
+ for p in gifting:
+ print(p[0] + " -> " + p[1])
+ print("")
+ return True
+
+import unittest
+
+class TestSecretsanta(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(secretsanta(["Mr. Wall", "Mrs. Wall", "Mr. Anwar", "Mrs. Anwar", "Mr. Conway", "Mr. Cross"]), True, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(secretsanta(["Mr. Wall", "Mrs. Wall", "Mr. Anwar"]), True, 'example 2')
+
+unittest.main()
diff --git a/challenge-247/roger-bell-west/python/ch-2.py b/challenge-247/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..1f152b7172
--- /dev/null
+++ b/challenge-247/roger-bell-west/python/ch-2.py
@@ -0,0 +1,25 @@
+#! /usr/bin/python3
+
+from collections import defaultdict
+
+def mostfrequentletterpair(s):
+ f = defaultdict(lambda: 0)
+ for i in range(len(s) - 1):
+ pair = s[i] + s[i+1]
+ f[pair] += 1
+ m = max(f.values())
+ l = [i for i in f.keys() if f[i] == m]
+ l.sort()
+ return l[0]
+
+import unittest
+
+class TestMostfrequentletterpair(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(mostfrequentletterpair("abcdbca"), "bc", 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(mostfrequentletterpair("cdeabeabfcdfabgcd"), "ab", 'example 2')
+
+unittest.main()
diff --git a/challenge-247/roger-bell-west/raku/ch-1.p6 b/challenge-247/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..e8e14bf92a
--- /dev/null
+++ b/challenge-247/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,43 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 2;
+
+is(secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar', 'Mrs. Anwar', 'Mr. Conway', 'Mr. Cross']), True, 'example 1');
+is(secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar']), True, 'example 2');
+
+sub secretsanta(@name) {
+ my @family;
+ for @name -> $n {
+ push @family, comb(/\w+/, $n)[*-1];
+ }
+ my %receivers = SetHash(0 .. @name.end);
+ my @gifting;
+ for (0 .. @name.end) -> $giver {
+ my $done = False;
+ my $r = 0;
+ for %receivers.keys -> $recipient {
+ if (@family[$giver] ne @family[$recipient]) {
+ $r = $recipient;
+ $done = True;
+ last;
+ }
+ }
+ if (!$done) {
+ for %receivers.keys -> $recipient {
+ if ($recipient != $giver) {
+ $r = $recipient;
+ last;
+ }
+ }
+ }
+ %receivers{$r}:delete;
+ push @gifting, [@name[$giver], @name[$r]];
+ }
+ for @gifting -> @p {
+ say("@p[0] -> @p[1]");
+ }
+ say "";
+ return True;
+}
diff --git a/challenge-247/roger-bell-west/raku/ch-2.p6 b/challenge-247/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..4e9fc0839b
--- /dev/null
+++ b/challenge-247/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,19 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 2;
+
+is(mostfrequentletterpair('abcdbca'), 'bc', 'example 1');
+is(mostfrequentletterpair('cdeabeabfcdfabgcd'), 'ab', 'example 2');
+
+sub mostfrequentletterpair($s) {
+ my %f;
+ for (0 .. chars($s) - 2) -> $i {
+ my $pair = substr($s, $i, 2);
+ %f{$pair}++;
+ }
+ my $m = max(values %f);
+ my @l = %f.keys.grep({%f{$_} == $m}).sort({$^a cmp $^b});
+ return @l[0];
+}
diff --git a/challenge-247/roger-bell-west/ruby/ch-1.rb b/challenge-247/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..1831fed5fe
--- /dev/null
+++ b/challenge-247/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,52 @@
+#! /usr/bin/ruby
<