aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-282/roger-bell-west/crystal/ch-1.cr26
-rwxr-xr-xchallenge-282/roger-bell-west/crystal/ch-2.cr27
-rwxr-xr-xchallenge-282/roger-bell-west/javascript/ch-1.js46
-rwxr-xr-xchallenge-282/roger-bell-west/javascript/ch-2.js36
-rw-r--r--challenge-282/roger-bell-west/kotlin/ch-1.kt35
-rw-r--r--challenge-282/roger-bell-west/kotlin/ch-2.kt36
-rwxr-xr-xchallenge-282/roger-bell-west/lua/ch-1.lua57
-rwxr-xr-xchallenge-282/roger-bell-west/lua/ch-2.lua48
-rwxr-xr-xchallenge-282/roger-bell-west/perl/ch-1.pl30
-rwxr-xr-xchallenge-282/roger-bell-west/perl/ch-2.pl26
-rw-r--r--challenge-282/roger-bell-west/postscript/ch-1.ps140
-rw-r--r--challenge-282/roger-bell-west/postscript/ch-2.ps101
-rwxr-xr-xchallenge-282/roger-bell-west/python/ch-1.py39
-rwxr-xr-xchallenge-282/roger-bell-west/python/ch-2.py27
-rwxr-xr-xchallenge-282/roger-bell-west/raku/ch-1.p623
-rwxr-xr-xchallenge-282/roger-bell-west/raku/ch-2.p623
-rwxr-xr-xchallenge-282/roger-bell-west/ruby/ch-1.rb32
-rwxr-xr-xchallenge-282/roger-bell-west/ruby/ch-2.rb33
-rwxr-xr-xchallenge-282/roger-bell-west/rust/ch-1.rs36
-rwxr-xr-xchallenge-282/roger-bell-west/rust/ch-2.rs31
-rw-r--r--challenge-282/roger-bell-west/scala/ch-1.scala38
-rw-r--r--challenge-282/roger-bell-west/scala/ch-2.scala37
-rw-r--r--challenge-282/roger-bell-west/tests.json32
23 files changed, 959 insertions, 0 deletions
diff --git a/challenge-282/roger-bell-west/crystal/ch-1.cr b/challenge-282/roger-bell-west/crystal/ch-1.cr
new file mode 100755
index 0000000000..f3fd6c5fe2
--- /dev/null
+++ b/challenge-282/roger-bell-west/crystal/ch-1.cr
@@ -0,0 +1,26 @@
+#! /usr/bin/crystal
+require "spec"
+describe "goodinteger" do
+ it "test_ex1" do
+ goodinteger(12344456).should eq 444
+ end
+ it "test_ex2" do
+ goodinteger(1233334).should eq -1
+ end
+ it "test_ex3" do
+ goodinteger(10020003).should eq 0
+ end
+end
+
+def goodinteger(a)
+ winsize = 3
+ d = a.to_s.chars
+ d.each_cons(winsize).each_with_index do |cc, offset|
+ if cc[0] == cc[1] && cc[1] == cc[2]
+ if (offset == 0 || d[offset - 1] != cc[0]) && (offset == d.size - winsize || d[offset + winsize] != cc[2])
+ return cc.join("").to_i
+ end
+ end
+ end
+ -1
+end
diff --git a/challenge-282/roger-bell-west/crystal/ch-2.cr b/challenge-282/roger-bell-west/crystal/ch-2.cr
new file mode 100755
index 0000000000..b7b1110f47
--- /dev/null
+++ b/challenge-282/roger-bell-west/crystal/ch-2.cr
@@ -0,0 +1,27 @@
+#! /usr/bin/crystal
+require "spec"
+describe "changingkeys" do
+ it "test_ex1" do
+ changingkeys("pPeERrLl").should eq 3
+ end
+ it "test_ex2" do
+ changingkeys("rRr").should eq 0
+ end
+ it "test_ex3" do
+ changingkeys("GoO").should eq 1
+ end
+end
+
+def changingkeys(a)
+ oc = 'x'
+ out = 0
+ a.downcase.chars.each_with_index do |c, i|
+ if i == 0
+ oc = c
+ elsif c != oc
+ oc = c
+ out += 1
+ end
+ end
+ out
+end
diff --git a/challenge-282/roger-bell-west/javascript/ch-1.js b/challenge-282/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..4c36f7401a
--- /dev/null
+++ b/challenge-282/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,46 @@
+#! /usr/bin/node
+
+"use strict"
+
+// by VLAZ
+// https://stackoverflow.com/a/59322890
+function toWindows(inputArray, size) {
+ return Array.from(
+ {length: inputArray.length - (size - 1)}, //get the appropriate length
+ (_, index) => inputArray.slice(index, index+size) //create the windows
+ )
+}
+
+function goodinteger(a) {
+ const winsize = 3;
+ const d = a.toString().split("");
+ let ex = -1;
+ toWindows(d, winsize).forEach((cc, offset) => {
+ if (ex == -1 && cc[0] == cc[1] && cc[1] == cc[2]) {
+ if ((offset == 0 || d[offset- 1] != cc[0]) &&
+ (offset == d.size - winsize || d[offset + winsize] != cc[2])) {
+ ex = +cc.join("");
+ }
+ }
+ });
+ return ex;
+}
+
+if (goodinteger(12344456) == 444) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (goodinteger(1233334) == -1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (goodinteger(10020003) == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-282/roger-bell-west/javascript/ch-2.js b/challenge-282/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..04423e8aa1
--- /dev/null
+++ b/challenge-282/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,36 @@
+#! /usr/bin/node
+
+"use strict"
+
+function changingkeys(a) {
+ let oc = 'x';
+ let out = 0;
+ a.toLowerCase().split("").forEach((c, i) => {
+ if (i == 0) {
+ oc = c;
+ } else if (c != oc) {
+ oc = c;
+ out ++;
+ }
+ });
+ return out;
+}
+
+if (changingkeys('pPeERrLl') == 3) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (changingkeys('rRr') == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (changingkeys('GoO') == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-282/roger-bell-west/kotlin/ch-1.kt b/challenge-282/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..b2e63d62f2
--- /dev/null
+++ b/challenge-282/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,35 @@
+fun goodinteger(a: Int): Int {
+ val winsize = 3
+ val d = a.toString().toList()
+ d.windowed(size = winsize).forEachIndexed{offset, cc ->
+ if (cc[0] == cc[1] && cc[1] == cc[2]) {
+ if ((offset == 0 || d[offset- 1] != cc[0]) &&
+ (offset == d.size - winsize || d[offset + winsize] != cc[2])) {
+ return cc.joinToString("").toInt()
+ }
+ }
+ }
+ return -1
+}
+
+fun main() {
+ if (goodinteger(12344456) == 444) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (goodinteger(1233334) == -1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (goodinteger(10020003) == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-282/roger-bell-west/kotlin/ch-2.kt b/challenge-282/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..c525861af5
--- /dev/null
+++ b/challenge-282/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,36 @@
+fun changingkeys(a: String): Int {
+ var oc = 'x'
+ var out = 0
+ a.lowercase().forEachIndexed{i, c ->
+ if (i == 0) {
+ oc = c
+ } else if (c != oc) {
+ oc = c
+ out += 1
+ }
+ }
+ return out
+}
+
+fun main() {
+
+ if (changingkeys("pPeERrLl") == 3) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (changingkeys("rRr") == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (changingkeys("GoO") == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-282/roger-bell-west/lua/ch-1.lua b/challenge-282/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..9974154344
--- /dev/null
+++ b/challenge-282/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,57 @@
+#! /usr/bin/lua
+
+function split(t)
+ local cl = {}
+ string.gsub(t,
+ "(.)",
+ function(c)
+ table.insert(cl, c)
+ end
+ )
+ return cl
+end
+
+function join(t)
+ local out=""
+ for i, v in ipairs(t) do
+ out = out .. v
+ end
+ return out
+end
+
+function goodinteger(a)
+ local winsize = 3
+ local d = split(a)
+ for offset = 1, #d - winsize + 1 do
+ local cc = {d[offset], d[offset + 1], d[offset + 2]}
+ if cc[1] == cc[2] and cc[2] == cc[3] then
+ if (offset == 1 or d[offset - 1] ~= cc[1]) and
+ (offset == #d - winsize + 1 or d[offset + winsize] ~= cc[3]) then
+ return join(cc) + 0
+ end
+ end
+ end
+ return -1
+end
+
+if goodinteger(12344456) == 444 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if goodinteger(1233334) == -1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if goodinteger(10020003) == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-282/roger-bell-west/lua/ch-2.lua b/challenge-282/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..7dbb739188
--- /dev/null
+++ b/challenge-282/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,48 @@
+#! /usr/bin/lua
+
+function split(t)
+ local cl = {}
+ string.gsub(t,
+ "(.)",
+ function(c)
+ table.insert(cl, c)
+ end
+ )
+ return cl
+end
+
+function changingkeys(a)
+ local oc = "x"
+ local out = 0
+ for i, c in ipairs(split(string.lower(a))) do
+ if i == 1 then
+ oc = c
+ elseif c ~= oc then
+ oc = c
+ out = out + 1
+ end
+ end
+ return out
+end
+
+if changingkeys("pPeERrLl") == 3 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if changingkeys("rRr") == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if changingkeys("GoO") == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-282/roger-bell-west/perl/ch-1.pl b/challenge-282/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..c6610060dd
--- /dev/null
+++ b/challenge-282/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,30 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(goodinteger(12344456), 444, 'example 1');
+is(goodinteger(1233334), -1, 'example 2');
+is(goodinteger(10020003), 0, 'example 3');
+
+use List::MoreUtils qw(slideatatime);
+
+sub goodinteger($a) {
+ my $winsize = 3;
+ my @d = split('', $a);
+ my $dd = slideatatime 1, $winsize, @d;
+ my $offset = 0;
+ while (my @cc = $dd->()) {
+ if ( scalar @cc == $winsize && $cc[0] eq $cc[1] && $cc[1] eq $cc[2]) {
+ if (($offset == 0 || $d[$offset - 1] ne $cc[0]) &&
+ ($offset == (scalar @d) - $winsize || $d[$offset + $winsize] ne $cc[2])) {
+ return join('', @cc) + 0;
+ }
+ }
+ $offset++;
+ }
+ return -1;
+}
diff --git a/challenge-282/roger-bell-west/perl/ch-2.pl b/challenge-282/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..39ccfb0baa
--- /dev/null
+++ b/challenge-282/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,26 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(changingkeys('pPeERrLl'), 3, 'example 1');
+is(changingkeys('rRr'), 0, 'example 2');
+is(changingkeys('GoO'), 1, 'example 3');
+
+sub changingkeys($a) {
+ my $oc = 'x';
+ my $out = 0;
+ my @s = split('', lc($a));
+ while (my ($i, $c) = each @s) {
+ if ($i == 0) {
+ $oc = $c;
+ } elsif ($c ne $oc) {
+ $oc = $c;
+ $out++;
+ }
+ }
+ return $out;
+}
diff --git a/challenge-282/roger-bell-west/postscript/ch-1.ps b/challenge-282/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..d5cc6be7fc
--- /dev/null
+++ b/challenge-282/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,140 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/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
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/enumerate.array {
+ 1 dict begin
+ /a exch def
+ [
+ 0 1 a length 1 sub {
+ [ exch dup a exch get ]
+ } for
+ ]
+ 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
+
+/s2a {
+ [ exch { } forall ]
+} 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
+
+/rotor {
+ 5 dict begin
+ /delta exch def
+ /size exch def
+ dup length /len exch def
+ /ar exch def
+ /ix 0 def
+ [
+ {
+ ix size add len gt {
+ exit
+ } if
+ ar ix size getinterval
+ /ix ix size delta add add def
+ } loop
+ ]
+ end
+} bind def
+
+/alloccvs {
+ 2 dict begin
+ /n exch def
+ /a 1 def
+ n
+ dup 0 lt {
+ /a a 1 add def
+ neg
+ } if
+ {
+ dup 10 lt {
+ exit
+ } if
+ /a a 1 add def
+ 10 idiv
+ } loop
+ pop
+ n a string cvs
+ end
+} bind def
+
+
+% end included library code
+
+/goodinteger {
+ 0 dict begin
+ /winsize 3 def
+ alloccvs s2a /d exch def
+ -1
+ d winsize 1 winsize sub rotor enumerate.array {
+ aload pop
+ /cc exch def
+ /offset exch def
+ cc 0 get cc 1 get eq cc 1 get cc 2 get eq and {
+ /valid true def
+ offset 0 ne {
+ d offset 1 sub get cc 0 get eq {
+ /valid false def
+ } if
+ } if
+ offset d length winsize sub ne {
+ d offset winsize add get cc 2 get eq {
+ /valid false def
+ } if
+ } if
+ valid {
+ pop
+ cc a2s cvi
+ exit
+ } if
+ } if
+ } forall
+ end
+} bind def
+
+(goodinteger) test.start
+12344456 goodinteger 444 eq test
+1233334 goodinteger -1 eq test
+10020003 goodinteger 0 eq test
+test.end
diff --git a/challenge-282/roger-bell-west/postscript/ch-2.ps b/challenge-282/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..5adf0bef92
--- /dev/null
+++ b/challenge-282/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,101 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/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
+
+/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
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/enumerate.array {
+ 1 dict begin
+ /a exch def
+ [
+ 0 1 a length 1 sub {
+ [ exch dup a exch get ]
+ } for
+ ]
+ end
+} bind def
+
+/tolower {
+ s2a
+ [ exch
+ {
+ dup dup 65 ge exch 90 le and {
+ 32 add
+ } if
+ } forall
+ ] a2s
+} 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
+
+
+% end included library code
+
+/changingkeys {
+ 0 dict begin
+ /oc 0 def
+ /out 0 def
+ tolower s2a enumerate.array {
+ aload pop
+ /c exch def
+ /i exch def
+ i 0 eq {
+ /oc c def
+ } {
+ c oc ne {
+ /oc c def
+ /out out 1 add def
+ } if
+ } ifelse
+ } forall
+ out
+ end
+} bind def
+
+(changingkeys) test.start
+(pPeERrLl) changingkeys 3 eq test
+(rRr) changingkeys 0 eq test
+(GoO) changingkeys 1 eq test
+test.end
diff --git a/challenge-282/roger-bell-west/python/ch-1.py b/challenge-282/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..65f3bff361
--- /dev/null
+++ b/challenge-282/roger-bell-west/python/ch-1.py
@@ -0,0 +1,39 @@
+#! /usr/bin/python3
+
+import collections
+from itertools import islice
+
+# https://docs.python.org/3/library/itertools.html
+def sliding_window(iterable, n):
+ # sliding_window('ABCDEFG', 4) --> ABCD BCDE CDEF DEFG
+ it = iter(iterable)
+ window = collections.deque(islice(it, n), maxlen=n)
+ if len(window) == n:
+ yield tuple(window)
+ for x in it:
+ window.append(x)
+ yield tuple(window)
+
+def goodinteger(a):
+ winsize = 3
+ d = str(a)
+ for offset, cc in enumerate(sliding_window(d, winsize)):
+ if cc[0] == cc[1] and cc[1] == cc[2]:
+ if (offset == 0 or d[offset - 1] != cc[0]) and (offset == len(d) - winsize or d[offset + winsize] != cc[2]):
+ return int("".join(cc))
+ return -1
+
+import unittest
+
+class TestGoodinteger(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(goodinteger(12344456), 444, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(goodinteger(1233334), -1, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(goodinteger(10020003), 0, 'example 3')
+
+unittest.main()
diff --git a/challenge-282/roger-bell-west/python/ch-2.py b/challenge-282/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..ebe05e4c8d
--- /dev/null
+++ b/challenge-282/roger-bell-west/python/ch-2.py
@@ -0,0 +1,27 @@
+#! /usr/bin/python3
+
+def changingkeys(a):
+ oc = "x"
+ out = 0
+ for i, c in enumerate(a.lower()):
+ if i == 0:
+ oc = c
+ elif c != oc:
+ oc = c
+ out += 1
+ return out
+
+import unittest
+
+class TestChangingkeys(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(changingkeys("pPeERrLl"), 3, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(changingkeys("rRr"), 0, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(changingkeys("GoO"), 1, 'example 3')
+
+unittest.main()
diff --git a/challenge-282/roger-bell-west/raku/ch-1.p6 b/challenge-282/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..9bf22afd31
--- /dev/null
+++ b/challenge-282/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 3;
+
+is(goodinteger(12344456), 444, 'example 1');
+is(goodinteger(1233334), -1, 'example 2');
+is(goodinteger(10020003), 0, 'example 3');
+
+sub goodinteger($a) {
+ my $winsize = 3;
+ my @d = $a.comb;
+ for @d.rotor($winsize => 1 - $winsize).kv -> $offset, @cc {
+ if (@cc[0] == @cc[1] && @cc[1] == @cc[2]) {
+ if (($offset == 0 || @d[$offset - 1] != @cc[0]) &&
+ ($offset == @d.elems - $winsize || @d[$offset + $winsize]!= @cc[2])) {
+ return @cc.join('') + 0;
+ }
+ }
+ }
+ -1
+}
diff --git a/challenge-282/roger-bell-west/raku/ch-2.p6 b/challenge-282/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..e6f292ab78
--- /dev/null
+++ b/challenge-282/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 3;
+
+is(changingkeys('pPeERrLl'), 3, 'example 1');
+is(changingkeys('rRr'), 0, 'example 2');
+is(changingkeys('GoO'), 1, 'example 3');
+
+sub changingkeys($a) {
+ my $oc = 'x';
+ my $out = 0;
+ for $a.lc.comb.kv -> $i, $c {
+ if ($i == 0) {
+ $oc = $c;
+ } elsif ($c ne $oc) {
+ $oc = $c;
+ $out++;
+ }
+ }
+ return $out;
+}
diff --git a/challenge-282/roger-bell-west/ruby/ch-1.rb b/challenge-282/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..7cfa7c4919
--- /dev/null
+++ b/challenge-282/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,32 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+class TestGoodinteger < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(444, goodinteger(12344456))
+ end
+
+ def test_ex2
+ assert_equal(-1, goodinteger(1233334))
+ end
+
+ def test_ex3
+ assert_equal(0, goodinteger(10020003))
+ end
+
+end
+
+def goodinteger(a)
+ winsize = 3
+ d = a.to_s.chars
+ d.each_cons(winsize).each_with_index do |cc, offset|
+ if cc[0] == cc[1] && cc[1] == cc[2]
+ if (offset == 0 || d[offset - 1] != cc[0]) && (offset == d.size - winsize || d[offset + winsize] != cc[2])
+ return cc.join("").to_i
+ end
+ end
+ end
+ -1
+end
diff --git a/challenge-282/roger-bell-west/ruby/ch-2.rb b/challenge-282/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..6a28c5241d
--- /dev/null
+++ b/challenge-282/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,33 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+class TestChangingkeys < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(3, changingkeys('pPeERrLl'))
+ end
+
+ def test_ex2
+ assert_equal(0, changingkeys('rRr'))
+ end
+
+ def test_ex3
+ assert_equal(1, changingkeys('GoO'))
+ end
+
+end
+
+def changingkeys(a)
+ oc = 'x'
+ out = 0
+ a.downcase.chars.each_with_index do |c, i|
+ if i == 0
+ oc = c
+ elsif c != oc
+ oc = c
+ out += 1
+ end
+ end
+ out
+end
diff --git a/challenge-282/roger-bell-west/rust/ch-1.rs b/challenge-282/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..a29d508fca
--- /dev/null
+++ b/challenge-282/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,36 @@
+#! /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!(goodinteger(12344456), 444);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(goodinteger(1233334), -1);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(goodinteger(10020003), 0);
+}
+
+fn goodinteger(a: u32) -> i32 {
+ let winsize = 3;
+ let d = a.to_string().chars().collect::<Vec<char>>();
+ for (offset, cc) in d.windows(winsize).enumerate() {
+ if cc[0] == cc[1] && cc[1] == cc[2] {
+ if (offset == 0 || d[offset - 1] != cc[0])
+ && (offset == d.len() - winsize || d[offset + winsize] != cc[2])
+ {
+ return cc
+ .into_iter()
+ .collect::<String>()
+ .parse::<i32>()
+ .unwrap();
+ }
+ }
+ }
+ -1
+}
diff --git a/challenge-282/roger-bell-west/rust/ch-2.rs b/challenge-282/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..a8ae2fc51d
--- /dev/null
+++ b/challenge-282/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,31 @@
+#! /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!(changingkeys("pPeERrLl"), 3);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(changingkeys("rRr"), 0);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(changingkeys("GoO"), 1);
+}
+
+fn changingkeys(a: &str) -> u32 {
+ let mut oc = 'x';
+ let mut out = 0;
+ for (i, c) in a.to_ascii_lowercase().chars().enumerate() {
+ if i == 0 {
+ oc = c;
+ } else if c != oc {
+ oc = c;
+ out += 1;
+ }
+ }
+ out
+}
diff --git a/challenge-282/roger-bell-west/scala/ch-1.scala b/challenge-282/roger-bell-west/scala/ch-1.scala
new file mode 100644
index 0000000000..bb649303f0
--- /dev/null
+++ b/challenge-282/roger-bell-west/scala/ch-1.scala
@@ -0,0 +1,38 @@
+
+object Goodinteger {
+ def goodinteger(a: Int): Int = {
+ val winsize = 3
+ val d = a.toString.split("")
+ var ex = -1
+ for ((cc, offset) <- d.sliding(winsize).zipWithIndex) {
+ if (ex == -1 && cc(0) == cc(1) && cc(1) == cc(2)) {
+ if ((offset == 0 || d(offset- 1) != cc(0)) &&
+ (offset == d.size - winsize || d(offset + winsize) != cc(2))) {
+ ex = cc.mkString("").toInt
+ }
+ }
+ }
+ ex
+ }
+ def main(args: Array[String]) {
+ if (goodinteger(12344456) == 444) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (goodinteger(1233334) == -1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (goodinteger(10020003) == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-282/roger-bell-west/scala/ch-2.scala b/challenge-282/roger-bell-west/scala/ch-2.scala
new file mode 100644
index 0000000000..bf60c75987
--- /dev/null
+++ b/challenge-282/roger-bell-west/scala/ch-2.scala
@@ -0,0 +1,37 @@
+
+object Changingkeys {
+ def changingkeys(a: String): Int = {
+ var oc = 'x'
+ var out = 0
+ for ((c, i) <- a.toLowerCase.zipWithIndex) {
+ if (i == 0) {
+ oc = c
+ } else if (c != oc) {
+ oc = c
+ out += 1
+ }
+ }
+ out
+ }
+ def main(args: Array[String]) {
+ if (changingkeys("pPeERrLl") == 3) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (changingkeys("rRr") == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (changingkeys("GoO") == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-282/roger-bell-west/tests.json b/challenge-282/roger-bell-west/tests.json
new file mode 100644
index 0000000000..6f4b42cc45
--- /dev/null
+++ b/