diff options
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 + +require 'set' + +def secretsanta(name) + family = [] + name.each do |n| + family.push(n.split(' ')[-1]) + end + receivers = Set.new(Array.new(name.length) {|i| i}) + gifting = [] + 0.upto(name.length - 1) do |giver| + done = false + r = 0 + receivers.each do |recipient| + if family[giver] != family[recipient] then + r = recipient + done = true + break + end + end + if !done then + receivers.each do |recipient| + if giver != recipient then + r = recipient + break + end + end + end + receivers.delete(r) + gifting.push([name[giver], name[r]]) + end + gifting.each do |p| + print("#{p[0]} -> #{p[1]}\n") + end + print("\n") + return true +end + +require 'test/unit' + +class TestSecretsanta < Test::Unit::TestCase + + def test_ex1 + assert_equal(true, secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar', 'Mrs. Anwar', 'Mr. Conway', 'Mr. Cross'])) + end + + def test_ex2 + assert_equal(true, secretsanta(['Mr. Wall', 'Mrs. Wall', 'Mr. Anwar'])) + end + +end diff --git a/challenge-247/roger-bell-west/ruby/ch-2.rb b/challenge-247/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..9464e6c613 |
