aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2024-06-11 12:21:48 +0100
committerRoger Bell_West <roger@firedrake.org>2024-06-11 12:21:48 +0100
commit06746b83fc7bc829d1a836eb44fbae8308b88484 (patch)
tree34812f8890968b70e11c2fdfb111381af3ea20a3
parent514530d6be7cc5067a95a11ebedff9e0d4d46cfe (diff)
downloadperlweeklychallenge-club-06746b83fc7bc829d1a836eb44fbae8308b88484.tar.gz
perlweeklychallenge-club-06746b83fc7bc829d1a836eb44fbae8308b88484.tar.bz2
perlweeklychallenge-club-06746b83fc7bc829d1a836eb44fbae8308b88484.zip
RogerBW solutions for challenge no. 273
-rwxr-xr-xchallenge-273/roger-bell-west/crystal/ch-1.cr29
-rwxr-xr-xchallenge-273/roger-bell-west/crystal/ch-2.cr29
-rwxr-xr-xchallenge-273/roger-bell-west/javascript/ch-1.js46
-rwxr-xr-xchallenge-273/roger-bell-west/javascript/ch-2.js40
-rw-r--r--challenge-273/roger-bell-west/kotlin/ch-1.kt46
-rw-r--r--challenge-273/roger-bell-west/kotlin/ch-2.kt40
-rwxr-xr-xchallenge-273/roger-bell-west/lua/ch-1.lua53
-rwxr-xr-xchallenge-273/roger-bell-west/lua/ch-2.lua43
-rwxr-xr-xchallenge-273/roger-bell-west/perl/ch-1.pl25
-rwxr-xr-xchallenge-273/roger-bell-west/perl/ch-2.pl24
-rw-r--r--challenge-273/roger-bell-west/postscript/ch-1.ps74
-rw-r--r--challenge-273/roger-bell-west/postscript/ch-2.ps96
-rwxr-xr-xchallenge-273/roger-bell-west/python/ch-1.py30
-rwxr-xr-xchallenge-273/roger-bell-west/python/ch-2.py28
-rwxr-xr-xchallenge-273/roger-bell-west/raku/ch-1.p618
-rwxr-xr-xchallenge-273/roger-bell-west/raku/ch-2.p622
-rwxr-xr-xchallenge-273/roger-bell-west/ruby/ch-1.rb37
-rwxr-xr-xchallenge-273/roger-bell-west/ruby/ch-2.rb35
-rwxr-xr-xchallenge-273/roger-bell-west/rust/ch-1.rs38
-rwxr-xr-xchallenge-273/roger-bell-west/rust/ch-2.rs34
-rw-r--r--challenge-273/roger-bell-west/scala/ch-1.scala47
-rw-r--r--challenge-273/roger-bell-west/scala/ch-2.scala41
-rw-r--r--challenge-273/roger-bell-west/tests.json72
23 files changed, 947 insertions, 0 deletions
diff --git a/challenge-273/roger-bell-west/crystal/ch-1.cr b/challenge-273/roger-bell-west/crystal/ch-1.cr
new file mode 100755
index 0000000000..58a2a6ce89
--- /dev/null
+++ b/challenge-273/roger-bell-west/crystal/ch-1.cr
@@ -0,0 +1,29 @@
+#! /usr/bin/crystal
+
+def percentageofcharacter(a, c)
+ d = a.size
+ n = 100 * a.count(c)
+ (n + d // 2) // d
+end
+
+require "spec"
+describe "" do
+ it "test_ex1" do
+ percentageofcharacter("perl", 'e').should eq 25
+ end
+ it "test_ex2" do
+ percentageofcharacter("java", 'a').should eq 50
+ end
+ it "test_ex3" do
+ percentageofcharacter("python", 'm').should eq 0
+ end
+ it "test_ex4" do
+ percentageofcharacter("ada", 'a').should eq 67
+ end
+ it "test_ex5" do
+ percentageofcharacter("ballerina", 'l').should eq 22
+ end
+ it "test_ex6" do
+ percentageofcharacter("analitik", 'k').should eq 13
+ end
+end
diff --git a/challenge-273/roger-bell-west/crystal/ch-2.cr b/challenge-273/roger-bell-west/crystal/ch-2.cr
new file mode 100755
index 0000000000..7b282b563c
--- /dev/null
+++ b/challenge-273/roger-bell-west/crystal/ch-2.cr
@@ -0,0 +1,29 @@
+#! /usr/bin/crystal
+
+def baftera(a)
+ firstb = a.index('b')
+ if firstb.nil?
+ return false
+ end
+ lasta = a.rindex('a')
+ if lasta.nil?
+ return true
+ end
+ lasta < firstb
+end
+
+require "spec"
+describe "" do
+ it "test_ex1" do
+ baftera("aabb").should eq true
+ end
+ it "test_ex2" do
+ baftera("abab").should eq false
+ end
+ it "test_ex3" do
+ baftera("aaa").should eq false
+ end
+ it "test_ex4" do
+ baftera("bbb").should eq true
+ end
+end
diff --git a/challenge-273/roger-bell-west/javascript/ch-1.js b/challenge-273/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..0274196058
--- /dev/null
+++ b/challenge-273/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,46 @@
+#! /usr/bin/node
+
+"use strict"
+
+function percentageofcharacter(a, c) {
+ const d = a.length;
+ const n = 100 * a.split("").filter(n => n == c).length;
+ return Math.floor(n / d + 0.5);
+}
+
+if (percentageofcharacter('perl', 'e') == 25) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (percentageofcharacter('java', 'a') == 50) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (percentageofcharacter('python', 'm') == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (percentageofcharacter('ada', 'a') == 67) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (percentageofcharacter('ballerina', 'l') == 22) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (percentageofcharacter('analitik', 'k') == 13) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-273/roger-bell-west/javascript/ch-2.js b/challenge-273/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..b18f6bd4f2
--- /dev/null
+++ b/challenge-273/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,40 @@
+#! /usr/bin/node
+
+"use strict"
+
+function baftera(a) {
+ const firstb = a.indexOf('b');
+ if (firstb == -1) {
+ return false;
+ }
+ const lasta = a.lastIndexOf('a');
+ if (lasta == -1) {
+ return true;
+ }
+ return lasta < firstb;
+}
+
+if (baftera('aabb')) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (!baftera('abab')) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (!baftera('aaa')) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (baftera('bbb')) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-273/roger-bell-west/kotlin/ch-1.kt b/challenge-273/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..fc516bd49e
--- /dev/null
+++ b/challenge-273/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,46 @@
+fun percentageofcharacter(a: String, c: Char): Int {
+ val d = a.length
+ val n = 100 * a.count({it == c})
+ return (n + d / 2) / d
+}
+
+fun main() {
+
+ if (percentageofcharacter("perl", 'e') == 25) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("java", 'a') == 50) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("python", 'm') == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("ada", 'a') == 67) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("ballerina", 'l') == 22) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("analitik", 'k') == 13) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-273/roger-bell-west/kotlin/ch-2.kt b/challenge-273/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..eaf28624be
--- /dev/null
+++ b/challenge-273/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,40 @@
+fun baftera(a: String): Boolean {
+ val firstb = a.indexOf('b')
+ val lasta = a.lastIndexOf('a')
+ if (firstb == -1) {
+ return false
+ }
+ if (lasta == -1) {
+ return true
+ }
+ return lasta < firstb
+}
+
+fun main() {
+
+ if (baftera("aabb")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (!baftera("abab")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (!baftera("aaa")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (baftera("bbb")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-273/roger-bell-west/lua/ch-1.lua b/challenge-273/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..a1d9901f03
--- /dev/null
+++ b/challenge-273/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,53 @@
+#! /usr/bin/lua
+
+function percentageofcharacter(a, c)
+ local d = string.len(a)
+ local n = 0
+ for w in string.gmatch(a, c) do
+ n = n + 1
+ end
+ return (100 * n + d // 2) // d
+end
+
+if percentageofcharacter("perl", "e") == 25 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if percentageofcharacter("java", "a") == 50 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if percentageofcharacter("python", "m") == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if percentageofcharacter("ada", "a") == 67 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if percentageofcharacter("ballerina", "l") == 22 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if percentageofcharacter("analitik", "k") == 13 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-273/roger-bell-west/lua/ch-2.lua b/challenge-273/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..08a8f84ce9
--- /dev/null
+++ b/challenge-273/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,43 @@
+#! /usr/bin/lua
+
+function baftera(a)
+ local firstb = string.find(a, "b")
+ local lasta = string.find(string.reverse(a), "a")
+ if firstb == nil then
+ return false
+ end
+ if lasta == nil then
+ return true
+ end
+ lasta = string.len(a) + 1 - lasta
+ return lasta < firstb
+end
+
+if baftera("aabb") then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if not baftera("abab") then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if not baftera("aaa") then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if baftera("bbb") then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-273/roger-bell-west/perl/ch-1.pl b/challenge-273/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..96934c3419
--- /dev/null
+++ b/challenge-273/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,25 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 6;
+
+is(percentageofcharacter('perl', 'e'), 25, 'example 1');
+is(percentageofcharacter('java', 'a'), 50, 'example 2');
+is(percentageofcharacter('python', 'm'), 0, 'example 3');
+is(percentageofcharacter('ada', 'a'), 67, 'example 4');
+is(percentageofcharacter('ballerina', 'l'), 22, 'example 5');
+is(percentageofcharacter('analitik', 'k'), 13, 'example 6');
+
+use integer;
+sub percentageofcharacter($a, $c) {
+ my $d = length($a);
+ my $n = 0;
+ while ($a =~ /$c/g) {
+ $n++;
+ }
+ $n *= 100;
+ return ($n + $d / 2) / $d;
+}
diff --git a/challenge-273/roger-bell-west/perl/ch-2.pl b/challenge-273/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..bb6637c504
--- /dev/null
+++ b/challenge-273/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 4;
+
+is(baftera('aabb'), 1, 'example 1');
+is(baftera('abab'), 0, 'example 2');
+is(baftera('aaa'), 0, 'example 3');
+is(baftera('bbb'), 1, 'example 4');
+
+sub baftera($a) {
+ my $firstb = index($a, "b");
+ if ($firstb == -1) {
+ return 0;
+ }
+ my $lasta = rindex($a, "a");
+ if ($lasta == -1) {
+ return 1;
+ }
+ return ($lasta < $firstb)?1:0;
+}
diff --git a/challenge-273/roger-bell-west/postscript/ch-1.ps b/challenge-273/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..390955dce0
--- /dev/null
+++ b/challenge-273/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,74 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/s2a {
+ [ exch { } 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
+
+/filter { % array proc(bool) -> array
+ 1 dict begin
+ /p exch def
+ [ exch
+ {
+ dup p not
+ {
+ pop
+ } if
+ } forall
+ ]
+ end
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} 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
+
+
+% end included library code
+
+/percentageofcharacter {
+ 0 dict begin
+ /c exch s2a 0 get def
+ /a exch def
+ /d a length def
+ /n a s2a { c eq } filter length 100 mul def
+ n d 2 idiv add d idiv
+ end
+} bind def
+
+(percentageofcharacter) test.start
+(perl) (e) percentageofcharacter 25 eq test
+(java) (a) percentageofcharacter 50 eq test
+(python) (m) percentageofcharacter 0 eq test
+(ada) (a) percentageofcharacter 67 eq test
+(ballerina) (l) percentageofcharacter 22 eq test
+(analitik) (k) percentageofcharacter 13 eq test
+test.end
diff --git a/challenge-273/roger-bell-west/postscript/ch-2.ps b/challenge-273/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..26b2acb631
--- /dev/null
+++ b/challenge-273/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,96 @@
+%!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
+
+/reverse {
+ 1 dict begin
+ dup length /l exch def
+ [ exch
+ aload pop
+ 2 1 l {
+ -1 roll
+ } for
+ ]
+ 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
+
+/s2a {
+ [ exch { } 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
+
+/a2s {
+ 2 dict begin
+ /i exch def
+ i length dup string /o exch def
+ 1 sub 0 exch 1 exch {
+ dup i 3 -1 roll get o 3 1 roll put
+ } for
+ o
+ end
+} bind def
+
+
+% end included library code
+
+/baftera {
+ 0 dict begin
+ /a exch def
+ /firstb a (b) search {
+ 3 1 roll pop pop length
+ } {
+ pop -1
+ } ifelse def
+ /lasta a s2a reverse a2s (a) search {
+ 3 1 roll pop pop length a length 1 sub exch sub
+ } {
+ pop -1
+ } ifelse def
+ firstb -1 eq {
+ false
+ } {
+ lasta -1 eq {
+ true
+ } {
+ lasta firstb lt
+ } ifelse
+ } ifelse
+ end
+} bind def
+
+(baftera) test.start
+(aabb) baftera test
+(abab) baftera not test
+(aaa) baftera not test
+(bbb) baftera test
+test.end
diff --git a/challenge-273/roger-bell-west/python/ch-1.py b/challenge-273/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..5ff897f70f
--- /dev/null
+++ b/challenge-273/roger-bell-west/python/ch-1.py
@@ -0,0 +1,30 @@
+#! /usr/bin/python3
+
+def percentageofcharacter(a, c):
+ d = len(a)
+ n = 100 * a.count(c)
+ return (n + d // 2) // d
+
+import unittest
+
+class TestPercentageofcharacter(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(percentageofcharacter("perl", "e"), 25, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(percentageofcharacter("java", "a"), 50, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(percentageofcharacter("python", "m"), 0, 'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(percentageofcharacter("ada", "a"), 67, 'example 4')
+
+ def test_ex5(self):
+ self.assertEqual(percentageofcharacter("ballerina", "l"), 22, 'example 5')
+
+ def test_ex6(self):
+ self.assertEqual(percentageofcharacter("analitik", "k"), 13, 'example 6')
+
+unittest.main()
diff --git a/challenge-273/roger-bell-west/python/ch-2.py b/challenge-273/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..460a57a0e7
--- /dev/null
+++ b/challenge-273/roger-bell-west/python/ch-2.py
@@ -0,0 +1,28 @@
+#! /usr/bin/python3
+
+def baftera(a):
+ firstb = a.find("b")
+ if firstb == -1:
+ return False
+ lasta = a.rfind("a")
+ if lasta == -1:
+ return True
+ return lasta < firstb
+
+import unittest
+
+class TestBaftera(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(baftera("aabb"), True, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(baftera("abab"), False, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(baftera("aaa"), False, 'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(baftera("bbb"), True, 'example 4')
+
+unittest.main()
diff --git a/challenge-273/roger-bell-west/raku/ch-1.p6 b/challenge-273/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..89454c7c93
--- /dev/null
+++ b/challenge-273/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,18 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 6;
+
+is(percentageofcharacter('perl', 'e'), 25, 'example 1');
+is(percentageofcharacter('java', 'a'), 50, 'example 2');
+is(percentageofcharacter('python', 'm'), 0, 'example 3');
+is(percentageofcharacter('ada', 'a'), 67, 'example 4');
+is(percentageofcharacter('ballerina', 'l'), 22, 'example 5');
+is(percentageofcharacter('analitik', 'k'), 13, 'example 6');
+
+sub percentageofcharacter($a, $c) {
+ my $d = $a.chars;
+ my $n = 100 * $a.match($c, :exhaustive).elems;
+ return ($n + $d div 2) div $d;
+}
diff --git a/challenge-273/roger-bell-west/raku/ch-2.p6 b/challenge-273/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..899a331eeb
--- /dev/null
+++ b/challenge-273/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,22 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 4;
+
+is(baftera('aabb'), True, 'example 1');
+is(baftera('abab'), False, 'example 2');
+is(baftera('aaa'), False, 'example 3');
+is(baftera('bbb'), True, 'example 4');
+
+sub baftera($a) {
+ my $firstb = index($a, "b");
+ if (!$firstb.defined) {
+ return False;
+ }
+ my $lasta = rindex($a, "a");
+ if (!$lasta.defined) {
+ return True;
+ }
+ return $lasta < $firstb;
+}
diff --git a/challenge-273/roger-bell-west/ruby/ch-1.rb b/challenge-273/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..bdbb468350
--- /dev/null
+++ b/challenge-273/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,37 @@
+#! /usr/bin/ruby
+
+def percentageofcharacter(a, c)
+ d = a.size
+ n = 100 * a.count(c)
+ (n + d.div(2)).div(d)
+end
+
+require 'test/unit'
+
+class TestPercentageofcharacter < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(25, percentageofcharacter('perl', 'e'))
+ end
+
+ def test_ex2
+ assert_equal(50, percentageofcharacter('java', 'a'))
+ end
+
+ def test_ex3
+ assert_equal(0, percentageofcharacter('python', 'm'))
+ end
+
+ def test_ex4
+ assert_equal(67, percentageofcharacter('ada', 'a'))
+ end
+
+ def test_ex5
+ assert_equal(22, percentageofcharacter('ballerina', 'l'))
+ end
+
+ def test_ex6
+ assert_equal(13, percentageofcharacter('analitik', 'k'))
+ end
+
+end
diff --git a/challenge-273/roger-bell-west/ruby/ch-2.rb b/challenge-273/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..d22f18a978
--- /dev/null
+++ b/challenge-273/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,35 @@
+#! /usr/bin/ruby
+
+def baftera(a)
+ firstb = a.index('b')
+ if firstb.nil?
+ return false
+ end
+ lasta = a.rindex('a')
+ if lasta.nil?
+ return true
+ end
+ lasta < firstb
+end
+
+require 'test/unit'
+
+class TestBaftera < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(true, baftera('aabb'))
+ end
+
+ def test_ex2
+ assert_equal(false, baftera('abab'))
+ end
+
+ def test_ex3
+ assert_equal(false, baftera('aaa'))
+ end
+
+ def test_ex4
+ assert_equal(true, baftera('bbb'))
+ end
+
+end
diff --git a/challenge-273/roger-bell-west/rust/ch-1.rs b/challenge-273/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..d56dd40ffc
--- /dev/null
+++ b/challenge-273/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,38 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(percentageofcharacter("perl", 'e'), 25);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(percentageofcharacter("java", 'a'), 50);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(percentageofcharacter("python", 'm'), 0);
+}
+
+#[test]
+fn test_ex4() {
+ assert_eq!(percentageofcharacter("ada", 'a'), 67);
+}
+
+#[test]
+fn test_ex5() {
+ assert_eq!(percentageofcharacter("ballerina", 'l'), 22);
+}
+
+#[test]
+fn test_ex6() {
+ assert_eq!(percentageofcharacter("analitik", 'k'), 13);
+}
+
+fn percentageofcharacter(a: &str, c: char) -> u8 {
+ let d = a.len();
+ let n = 100 * a.match_indices(c).count();
+ ((n + d / 2) / d) as u8
+}
diff --git a/challenge-273/roger-bell-west/rust/ch-2.rs b/challenge-273/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..968323e5e7
--- /dev/null
+++ b/challenge-273/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,34 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(baftera("aabb"), true);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(baftera("abab"), false);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(baftera("aaa"), false);
+}
+
+#[test]
+fn test_ex4() {
+ assert_eq!(baftera("bbb"), true);
+}
+
+fn baftera(a: &str) -> bool {
+ let firstb = a.find('b');
+ if firstb == None {
+ return false;
+ }
+ let lasta = a.rfind('a');
+ if lasta == None {
+ return true;
+ }
+ lasta.unwrap() < firstb.unwrap()
+}
diff --git a/challenge-273/roger-bell-west/scala/ch-1.scala b/challenge-273/roger-bell-west/scala/ch-1.scala
new file mode 100644
index 0000000000..013000d260
--- /dev/null
+++ b/challenge-273/roger-bell-west/scala/ch-1.scala
@@ -0,0 +1,47 @@
+
+object Percentageofcharacter {
+ def percentageofcharacter(a: String, c: Char): Int = {
+ val d = a.length
+ val n = 100 * a.filter(x => x == c).size
+ (n + d / 2) / d
+ }
+ def main(args: Array[String]) {
+ if (percentageofcharacter("perl", 'e') == 25) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("java", 'a') == 50) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("python", 'm') == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("ada", 'a') == 67) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("ballerina", 'l') == 22) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (percentageofcharacter("analitik", 'k') == 13) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-273/roger-bell-west/scala/ch-2.scala b/challenge-273/roger-bell-west/scala/ch-2.scala
new file mode 100644
index 0000000000..64f4f35662
--- /dev/null
+++ b/challenge-273/roger-bell-west/scala/ch-2.scala
@@ -0,0 +1,41 @@
+
+object Baftera {
+def baftera(a: String): Boolean = {
+ val firstb = a.indexOf('b')
+ val lasta = a.lastIndexOf('a')
+ if (firstb == -1) {
+ return false
+ }
+ if (lasta == -1) {
+ return true
+ }
+ lasta < firstb
+}
+ def main(args: Array[String]) {
+ if (baftera("aabb")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (!baftera("abab")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (!baftera("aaa")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (baftera("bbb")) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-273/roger-bell-west/tests.json b/challenge-273/roger-bell-west/tests.json
new file mode 100644
index 0000000000..95d6a506af
--- /dev/null
+++ b/challenge-273/roger-bell-west/tests.json
@@ -0,0 +1,72 @@
+{
+ "ch-1" : [
+ {
+ "function" : "percentageofcharacter",
+ "multiarg" : true,
+ "arguments" : [
+ "perl",
+ "e"
+ ],
+ "result" : 25
+ },
+ {
+ "multiarg" : true,
+ "arguments" : [
+ "java",
+ "a"
+ ],
+ "result" : 50
+ },
+ {
+ "multiarg" : true,
+ "arguments" : [
+ "python",
+ "m"
+