aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2022-12-19 10:58:05 +0000
committerRoger Bell_West <roger@firedrake.org>2022-12-19 10:58:05 +0000
commit56167154e412f67b86fe19cd6fd201868c0d0476 (patch)
tree7c8e0e72810f4176bd212d69cdaa329421330c43
parentd0495985bdee0af409e7301b6b37dd6fe063f4d7 (diff)
downloadperlweeklychallenge-club-56167154e412f67b86fe19cd6fd201868c0d0476.tar.gz
perlweeklychallenge-club-56167154e412f67b86fe19cd6fd201868c0d0476.tar.bz2
perlweeklychallenge-club-56167154e412f67b86fe19cd6fd201868c0d0476.zip
Solutions for challenge #196
-rwxr-xr-xchallenge-196/roger-bell-west/javascript/ch-1.js81
-rwxr-xr-xchallenge-196/roger-bell-west/javascript/ch-2.js70
-rw-r--r--challenge-196/roger-bell-west/kotlin/ch-1.kt52
-rw-r--r--challenge-196/roger-bell-west/kotlin/ch-2.kt41
-rwxr-xr-xchallenge-196/roger-bell-west/lua/ch-1.lua65
-rwxr-xr-xchallenge-196/roger-bell-west/lua/ch-2.lua62
-rwxr-xr-xchallenge-196/roger-bell-west/perl/ch-1.pl30
-rwxr-xr-xchallenge-196/roger-bell-west/perl/ch-2.pl31
-rw-r--r--challenge-196/roger-bell-west/postscript/ch-1.ps132
-rw-r--r--challenge-196/roger-bell-west/postscript/ch-2.ps124
-rwxr-xr-xchallenge-196/roger-bell-west/python/ch-1.py34
-rwxr-xr-xchallenge-196/roger-bell-west/python/ch-2.py30
-rwxr-xr-xchallenge-196/roger-bell-west/raku/ch-1.p628
-rwxr-xr-xchallenge-196/roger-bell-west/raku/ch-2.p629
-rwxr-xr-xchallenge-196/roger-bell-west/ruby/ch-1.rb45
-rwxr-xr-xchallenge-196/roger-bell-west/ruby/ch-2.rb37
-rwxr-xr-xchallenge-196/roger-bell-west/rust/ch-1.rs39
-rwxr-xr-xchallenge-196/roger-bell-west/rust/ch-2.rs39
18 files changed, 969 insertions, 0 deletions
diff --git a/challenge-196/roger-bell-west/javascript/ch-1.js b/challenge-196/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..1e849d686e
--- /dev/null
+++ b/challenge-196/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,81 @@
+#! /usr/bin/node
+
+"use strict"
+
+// by Frank Tan
+// https://stackoverflow.com/questions/38400594/javascript-deep-comparison
+function deepEqual(a,b)
+{
+ if( (typeof a == 'object' && a != null) &&
+ (typeof b == 'object' && b != null) )
+ {
+ var count = [0,0];
+ for( var key in a) count[0]++;
+ for( var key in b) count[1]++;
+ if( count[0]-count[1] != 0) {return false;}
+ for( var key in a)
+ {
+ if(!(key in b) || !deepEqual(a[key],b[key])) {return false;}
+ }
+ for( var key in b)
+ {
+ if(!(key in a) || !deepEqual(b[key],a[key])) {return false;}
+ }
+ return true;
+ }
+ else
+ {
+ return a === b;
+ }
+}
+
+function pattern132(l) {
+ let o = [];
+ for (let a = 0; a < l.length-2; a++) {
+ for (let b = a+1; b < l.length-1; b++) {
+ if (l[a] < l[b]) {
+ for (let c = b+1; c < l.length; c++) {
+ if (l[b] > l[c] && l[a] < l[c]) {
+ o = [l[a], l[b], l[c]]
+ break
+ }
+ }
+ }
+ if (o.length > 0) {
+ break
+ }
+ }
+ if (o.length > 0) {
+ break
+ }
+ }
+ return o;
+}
+
+if (deepEqual(pattern132([3, 1, 4, 2]), [1, 4, 2])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(pattern132([1, 2, 3, 4]), [])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(pattern132([1, 3, 2, 4, 6, 5]), [1, 3, 2])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(pattern132([1, 3, 4, 2]), [1, 3, 2])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-196/roger-bell-west/javascript/ch-2.js b/challenge-196/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..6a6650fa70
--- /dev/null
+++ b/challenge-196/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,70 @@
+#! /usr/bin/node
+
+"use strict"
+
+// by Frank Tan
+// https://stackoverflow.com/questions/38400594/javascript-deep-comparison
+function deepEqual(a,b)
+{
+ if( (typeof a == 'object' && a != null) &&
+ (typeof b == 'object' && b != null) )
+ {
+ var count = [0,0];
+ for( var key in a) count[0]++;
+ for( var key in b) count[1]++;
+ if( count[0]-count[1] != 0) {return false;}
+ for( var key in a)
+ {
+ if(!(key in b) || !deepEqual(a[key],b[key])) {return false;}
+ }
+ for( var key in b)
+ {
+ if(!(key in a) || !deepEqual(b[key],a[key])) {return false;}
+ }
+ return true;
+ }
+ else
+ {
+ return a === b;
+ }
+}
+
+function rangelist(l) {
+ let o = [];
+ let start = l[0];
+ let prev = start;
+ for (let v of l.slice(1)) {
+ if (v != prev + 1) {
+ if (prev > start) {
+ o.push([start, prev]);
+ }
+ start = v;
+ }
+ prev = v;
+ }
+ if (prev > start) {
+ o.push([start, prev]);
+ }
+ return o;
+}
+
+if (deepEqual(rangelist([1, 3, 4, 5, 7]), [[3, 5]])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(rangelist([1, 2, 3, 6, 7, 9]), [[1, 3], [6, 7]])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(rangelist([0, 1, 2, 4, 5, 6, 8, 9]), [[0, 2], [4, 6], [8, 9]])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-196/roger-bell-west/kotlin/ch-1.kt b/challenge-196/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..c50967a018
--- /dev/null
+++ b/challenge-196/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,52 @@
+fun pattern132(l: List<Int>): List<Int> {
+ var o = ArrayList<Int>()
+ for (a in 0..l.size-3) {
+ for (b in a+1..l.size-2) {
+ if (l[a] < l[b]) {
+ for (c in b+1..l.size-1) {
+ if (l[b] > l[c] && l[a] < l[c]) {
+ o = arrayListOf(l[a], l[b], l[c])
+ break
+ }
+ }
+ }
+ if (o.size > 0) {
+ break
+ }
+ }
+ if (o.size > 0) {
+ break
+ }
+ }
+ return o.toList()
+}
+
+fun main() {
+ if (pattern132(listOf(3, 1, 4, 2)) == listOf(1, 4, 2)) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+
+ if (pattern132(listOf(1, 2, 3, 4)) == emptyList<Int>()) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+
+ if (pattern132(listOf(1, 3, 2, 4, 6, 5)) == listOf(1, 3, 2)) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+
+ if (pattern132(listOf(1, 3, 4, 2)) == listOf(1, 3, 2)) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-196/roger-bell-west/kotlin/ch-2.kt b/challenge-196/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..88d9015059
--- /dev/null
+++ b/challenge-196/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,41 @@
+fun rangelist(l: List<Int>): List<List<Int>> {
+ var o = ArrayList<List<Int>>()
+ var start = l[0]
+ var prev = start
+ for (v in l.drop(1)) {
+ if (v != prev + 1) {
+ if (prev > start) {
+ o.add(listOf(start, prev))
+ }
+ start = v
+ }
+ prev = v
+ }
+ if (prev > start) {
+ o.add(listOf(start, prev))
+ }
+ return o.toList()
+}
+
+fun main() {
+ if (rangelist(listOf(1, 3, 4, 5, 7)) == listOf(listOf(3, 5))) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (rangelist(listOf(1, 2, 3, 6, 7, 9)) ==
+ listOf(listOf(1, 3), listOf(6, 7))) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (rangelist(listOf(0, 1, 2, 4, 5, 6, 8, 9)) ==
+ listOf(listOf(0, 2), listOf(4, 6), listOf(8, 9))) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-196/roger-bell-west/lua/ch-1.lua b/challenge-196/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..df1f8cbced
--- /dev/null
+++ b/challenge-196/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,65 @@
+#! /usr/bin/lua
+function recursive_compare(t1,t2)
+ if t1==t2 then return true end
+ if (type(t1)~="table") then return false end
+ local mt1 = getmetatable(t1)
+ local mt2 = getmetatable(t2)
+ if( not recursive_compare(mt1,mt2) ) then return false end
+ for k1,v1 in pairs(t1) do
+ local v2 = t2[k1]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+ for k2,v2 in pairs(t2) do
+ local v1 = t1[k2]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+ return true
+end
+
+function pattern132(l)
+ local o = {}
+ for a = 1, #l-2 do
+ for b = a+1, #l-1 do
+ if l[a] < l[b] then
+ for c = b+1, #l do
+ if l[b] > l[c] and l[a] < l[c] then
+ o = {l[a], l[b], l[c]}
+ break
+ end
+ end
+ end
+ if #o > 0 then
+ break
+ end
+ end
+ if #o > 0 then
+ break
+ end
+ end
+ return o
+end
+
+if recursive_compare(pattern132({3, 1, 4, 2}), {1, 4, 2}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+if recursive_compare(pattern132({1, 2, 3, 4}), {}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+if recursive_compare(pattern132({1, 3, 2, 4, 6, 5}), {1, 3, 2}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+if recursive_compare(pattern132({1, 3, 4, 2}), {1, 3, 2}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-196/roger-bell-west/lua/ch-2.lua b/challenge-196/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..720f832be0
--- /dev/null
+++ b/challenge-196/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,62 @@
+#! /usr/bin/lua
+
+-- by Michael Anderson at
+-- https://stackoverflow.com/questions/8722620/comparing-two-index-tables-by-index-value-in-lua
+function recursive_compare(t1,t2)
+ if t1==t2 then return true end
+ if (type(t1)~="table") then return false end
+ local mt1 = getmetatable(t1)
+ local mt2 = getmetatable(t2)
+ if( not recursive_compare(mt1,mt2) ) then return false end
+ for k1,v1 in pairs(t1) do
+ local v2 = t2[k1]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+ for k2,v2 in pairs(t2) do
+ local v1 = t1[k2]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+ return true
+end
+
+function rangelist(l)
+ local o = {}
+ local start = l[1]
+ local prev = start
+ for i, v in ipairs(l) do
+ if i > 1 then
+ if v ~= prev + 1 then
+ if prev > start then
+ table.insert(o, {start, prev})
+ end
+ start = v
+ end
+ prev = v
+ end
+ end
+ if prev > start then
+ table.insert(o, {start, prev})
+ end
+ return o
+end
+
+if recursive_compare(rangelist({1, 3, 4, 5, 7}), {{3, 5}}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if recursive_compare(rangelist({1, 2, 3, 6, 7, 9}), {{1, 3}, {6, 7}}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if recursive_compare(rangelist({0, 1, 2, 4, 5, 6, 8, 9}), {{0, 2}, {4, 6}, {8, 9}}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-196/roger-bell-west/perl/ch-1.pl b/challenge-196/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..e94392a764
--- /dev/null
+++ b/challenge-196/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 => 4;
+
+is_deeply(pattern132([3, 1, 4, 2]), [1, 4, 2], 'example 1');
+is_deeply(pattern132([1, 2, 3, 4]), [], 'example 2');
+is_deeply(pattern132([1, 3, 2, 4, 6, 5]), [1, 3, 2], 'example 3');
+is_deeply(pattern132([1, 3, 4, 2]), [1, 3, 2], 'example 4');
+
+sub pattern132($l) {
+ my $o = [];
+ OUTER:
+ foreach my $a (0..$#{$l}-2) {
+ foreach my $b ($a+1..$#{$l}-1) {
+ if ($l->[$a] < $l->[$b]) {
+ foreach my $c ($b+1..$#{$l}) {
+ if ($l->[$b] > $l->[$c] && $l->[$a] < $l->[$c]) {
+ $o = [$l->[$a], $l->[$b], $l->[$c]];
+ last OUTER;
+ }
+ }
+ }
+ }
+ }
+ return $o;
+}
diff --git a/challenge-196/roger-bell-west/perl/ch-2.pl b/challenge-196/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..c1c43fb17a
--- /dev/null
+++ b/challenge-196/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is_deeply(rangelist([1, 3, 4, 5, 7]), [[3, 5]], 'example 1');
+is_deeply(rangelist([1, 2, 3, 6, 7, 9]), [[1, 3], [6, 7]], 'example 2');
+is_deeply(rangelist([0, 1, 2, 4, 5, 6, 8, 9]),
+ [[0, 2], [4, 6], [8, 9]], 'example 3');
+
+sub rangelist($l) {
+ my @o;
+ my $start = $l->[0];
+ my $prev = $start;
+ foreach my $v (@{$l}[1..$#{$l}]) {
+ if ($v != $prev + 1) {
+ if ($prev > $start) {
+ push @o, [$start, $prev];
+ }
+ $start = $v;
+ }
+ $prev = $v;
+ }
+ if ($prev > $start) {
+ push @o, [$start, $prev];
+ }
+ return \@o;
+}
diff --git a/challenge-196/roger-bell-west/postscript/ch-1.ps b/challenge-196/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..2d3d58636b
--- /dev/null
+++ b/challenge-196/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,132 @@
+%!PS
+
+% begin included library code
+% see https://github.com/Firedrake/postscript-libraries/
+/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
+
+/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
+
+/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
+
+/pattern132 {
+ 5 dict begin
+ /l exch def
+ /o 0 array def
+ 0 1 l length 3 sub {
+ /a exch def
+ a 1 add 1 l length 2 sub {
+ /b exch def
+ l a get l b get lt {
+ b 1 add 1 l length 1 sub {
+ /c exch def
+ l b get l c get gt
+ l a get l c get lt and {
+ /o [ l a get l b get l c get ] def
+ exit
+ } if
+ } for
+ } if
+ o length 0 gt {
+ exit
+ } if
+ } for
+ o length 0 gt {
+ exit
+ } if
+ } for
+ o
+ end
+} bind def
+
+(pattern132) test.start
+[ 3 1 4 2 ] pattern132 [ 1 4 2 ] deepeq test
+[ 1 2 3 4 ] pattern132 [ ] deepeq test
+[ 1 3 2 4 6 5 ] pattern132 [ 1 3 2 ] deepeq test
+[ 1 3 4 2 ] pattern132 [ 1 3 2 ] deepeq test
+test.end
diff --git a/challenge-196/roger-bell-west/postscript/ch-2.ps b/challenge-196/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..141fbb5737
--- /dev/null
+++ b/challenge-196/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,124 @@
+%!PS
+
+% begin included library code
+% see https://github.com/Firedrake/postscript-libraries/
+/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
+
+/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
+
+/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
+
+/rangelist {
+ 4 dict begin
+ /l exch def
+ /start l 0 get def
+ /prev start def
+ [
+ l 1 l length 1 sub getinterval {
+ /v exch def
+ v prev 1 add ne {
+ prev start gt {
+ [ start prev ]
+ } if
+ /start v def
+ } if
+ /prev v def
+ } forall
+ prev start gt {
+ [ start prev ]
+ } if
+ ]
+ end
+} bind def
+
+(rangelist) test.start
+[ 1 3 4 5 7 ] rangelist [ [ 3 5 ] ] deepeq test
+[ 1 2 3 6 7 9 ] rangelist [ [ 1 3 ] [ 6 7 ] ] deepeq test
+[ 0 1 2 4 5 6 8 9 ] rangelist [ [ 0 2 ] [ 4 6 ] [ 8 9 ] ] deepeq test
+test.end
diff --git a/challenge-196/roger-bell-west/python/ch-1.py b/challenge-196/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..8cdc462919
--- /dev/null
+++ b/challenge-196/roger-bell-west/python/ch-1.py
@@ -0,0 +1,34 @@
+#! /usr/bin/python3
+
+import unittest
+
+def pattern132(l):
+ o = []
+ for a in range(0, len(l) - 2):
+ for b in range(a + 1, len(l) - 1):
+ if l[a] < l[b]:
+ for c in range(b + 1, len(l)):
+ if l[b] > l[c] and l[a] < l[c]:
+ o = [l[a], l[b], l[c]]
+ break
+ if len(o) > 0:
+ break
+ if len(o) > 0:
+ break
+ return o
+
+class TestPattern132(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(pattern132([3, 1, 4, 2]), [1, 4, 2], 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(pattern132([1, 2, 3, 4]), [], 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(pattern132([1, 3, 2, 4, 6, 5]), [1, 3, 2], 'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(pattern132([1, 3, 4, 2]), [1, 3, 2], 'example 4')
+
+unittest.main()
diff --git a/challenge-196/roger-bell-west/python/ch-2.py b/challenge-196/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..caece39ab6
--- /dev/null
+++ b/challenge-196/roger-bell-west/python/ch-2.py
@@ -0,0 +1,30 @@
+#! /usr/bin/python3
+
+import unittest
+
+def rangelist(l):
+ o = []
+ start = l[0]
+ prev = start
+ for v in l[1:]:
+ if v != prev + 1:
+ if prev > start:
+ o.append([start, prev])
+ start = v
+ prev = v
+ if prev > start:
+ o.append([start, prev])
+ return o
+
+class TestRangelist(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(rangelist([1, 3, 4, 5, 7]), [[3, 5]], 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(rangelist([1, 2, 3, 6, 7, 9]), [[1, 3], [6, 7]], 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(rangelist([0, 1, 2, 4, 5, 6, 8, 9]), [[0, 2], [4, 6], [8, 9]], 'example 3')
+
+unittest.main()
diff --git a/challenge-196/roger-bell-west/raku/ch-1.p6 b/challenge-196/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..76b893074b
--- /dev/null
+++ b/challenge-196/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,28 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 4;
+
+is-deeply(pattern132([3, 1, 4, 2]), [1, 4, 2], 'example 1');
+is-deeply(pattern132([1, 2, 3, 4]), [], 'example 2');
+is-deeply(pattern132([1, 3, 2, 4, 6, 5]), [1, 3, 2], 'example 3');
+is-deeply(pattern132([1, 3, 4, 2]), [1, 3, 2], 'example 4');
+
+sub pattern132(@l) {
+ my @o = [];
+ OLOOP:
+ for (0..@l.elems-3) -> $a {
+ for ($a+1..@l.elems-2) -> $b {
+ if (@l[$a] < @l[$b]) {
+ for ($b+1..@l.elems-1) -> $c {
+ if (@l[$b] > @l[$c] && @l[$a] < @l[$c]) {
+ @o = [@l[$a], @l[$b], @l[$c]];
+ last OLOOP;
+ }
+ }
+ }
+ }
+ }
+ return @o;
+}
diff --git a/challenge-196/roger-bell-west/raku/ch-2.p6 b/challenge-196/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..4ca03d53d5
--- /dev/null
+++ b/challenge-196/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,29 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 3;
+
+is-deeply(rangelist([1, 3, 4, 5, 7]), [[3, 5],], 'example 1');
+is-deeply(rangelist([1, 2, 3, 6, 7, 9]), [[1, 3], [6, 7]], 'example 2');
+is-deeply(rangelist([0, 1, 2, 4, 5, 6, 8, 9]),
+ [[0, 2], [4, 6], [8, 9]], 'example 3');
+
+sub rangelist(@l) {
+ my @o;
+ my $start = @l[0];
+ my $prev = $start;
+ for (@l[1..*-1]) -> $v {
+ if ($v != $prev + 1) {
+ if ($prev > $start) {
+ push @o, [$start, $prev];
+ }
+ $start = $v;
+ }
+ $prev = $v;
+ }
+ if ($prev > $start) {
+ push @o, [$start, $prev];
+ }
+ return @o;
+}
diff --git a/challenge-196/roger-bell-west/ruby/ch-1.rb b/challenge-196/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..68aa927a4d
--- /dev/null
+++ b/challenge-196/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,45 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def pattern132(l)
+ o = []
+ 0.upto(l.length-3) do |a|
+ (a+1).upto(l.length-2) do |b|
+ if l[a] < l[b] then
+ (b+1).upto(l.length-1) do |c|
+ if l[b] > l[c] && l[a] < l[c] then
+ o = [l[a], l[b], l[c]]
+ break
+ end
+ end
+ end
+ if o.length > 0 then
+ break
+ end
+ end
+ if o.length > 0 then
+ break
+ end
+ end
+ return o
+end
+
+class TestPattern132 < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal([1, 4, 2], pattern132([3, 1, 4, 2]))
+ end
+
+ def test_ex2
+ assert_equal([], pattern132([1, 2, 3, 4]))
+ end
+
+ def test_ex3
+ assert_equal([1, 3, 2], pattern132([1, 3, 2, 4, 6, 5]))
+ end
+
+ def test_ex4
+ assert_equal([1, 3, 2], pattern132([1, 3, 4, 2]))
+ end
+end
diff --git a/challenge-196/roger-bell-west/ruby/ch-2.rb b/challenge-196/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..f33c64d4bb
--- /dev/null
+++ b/challenge-196/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,37 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def rangelist(l)
+ o = []
+ start = l[0]
+ prev = start
+ l.slice(1, l.length-1).each do |v|
+ if v != prev + 1 then
+ if prev > start then
+ o.push([start, prev])
+ end
+ start = v
+ end
+ prev = v
+ end
+ if prev > start then
+ o.push([start, prev])
+ end
+ return o
+end
+
+class TestRangeList < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal([[3, 5]], rangelist([1, 3, 4, 5, 7]))
+ end
+
+ def test_ex2
+ assert_equal([[1, 3], [6, 7]], rangelist([1, 2, 3, 6, 7, 9]))
+ end
+
+ def test_ex3
+ assert_equal([[0, 2], [4, 6], [8, 9]], rangelist([0, 1, 2, 4, 5, 6, 8, 9]))
+ end
+end
diff --git a/challenge-196/roger-bell-west/rust/ch-1.rs b/challenge-196/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..9b0db5eb4d
--- /dev/null
+++ b/challenge-196/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,39 @@
+#! /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!(pattern132(vec![3, 1, 4, 2]), vec![1, 4, 2]);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(pattern132(vec![1, 2, 3, 4]), vec![]);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(pattern132(vec![1, 3, 2, 4, 6, 5]), vec![1, 3, 2]);
+}
+
+#[test]
+fn test_ex4() {
+ assert_eq!(pattern132(vec![1, 3, 4, 2]), vec![1, 3, 2]);
+}
+
+fn pattern132(l: Vec<isize>) -> Vec<isize> {
+ let mut o = Vec::new();
+ 'outer: for a in 0..=l.len() - 3 {
+ for b in a + 1..=l.len() - 2 {
+ if l[a] < l[b] {
+ for c in b + 1..=l.len() - 1 {
+ if l[b] > l[c] && l[a] < l[c] {
+ o = vec![l[a], l[b], l[c]];
+ break 'outer;
+ }
+ }
+ }
+ }
+ }
+ o
+}
diff --git a/challenge-196/roger-bell-west/rust/ch-2.rs b/challenge-196/roger-bell-west/rust/ch