From 56167154e412f67b86fe19cd6fd201868c0d0476 Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 19 Dec 2022 10:58:05 +0000 Subject: Solutions for challenge #196 --- challenge-196/roger-bell-west/javascript/ch-1.js | 81 ++++++++++++++ challenge-196/roger-bell-west/javascript/ch-2.js | 70 ++++++++++++ challenge-196/roger-bell-west/kotlin/ch-1.kt | 52 +++++++++ challenge-196/roger-bell-west/kotlin/ch-2.kt | 41 +++++++ challenge-196/roger-bell-west/lua/ch-1.lua | 65 +++++++++++ challenge-196/roger-bell-west/lua/ch-2.lua | 62 +++++++++++ challenge-196/roger-bell-west/perl/ch-1.pl | 30 ++++++ challenge-196/roger-bell-west/perl/ch-2.pl | 31 ++++++ challenge-196/roger-bell-west/postscript/ch-1.ps | 132 +++++++++++++++++++++++ challenge-196/roger-bell-west/postscript/ch-2.ps | 124 +++++++++++++++++++++ challenge-196/roger-bell-west/python/ch-1.py | 34 ++++++ challenge-196/roger-bell-west/python/ch-2.py | 30 ++++++ challenge-196/roger-bell-west/raku/ch-1.p6 | 28 +++++ challenge-196/roger-bell-west/raku/ch-2.p6 | 29 +++++ challenge-196/roger-bell-west/ruby/ch-1.rb | 45 ++++++++ challenge-196/roger-bell-west/ruby/ch-2.rb | 37 +++++++ challenge-196/roger-bell-west/rust/ch-1.rs | 39 +++++++ challenge-196/roger-bell-west/rust/ch-2.rs | 39 +++++++ 18 files changed, 969 insertions(+) create mode 100755 challenge-196/roger-bell-west/javascript/ch-1.js create mode 100755 challenge-196/roger-bell-west/javascript/ch-2.js create mode 100644 challenge-196/roger-bell-west/kotlin/ch-1.kt create mode 100644 challenge-196/roger-bell-west/kotlin/ch-2.kt create mode 100755 challenge-196/roger-bell-west/lua/ch-1.lua create mode 100755 challenge-196/roger-bell-west/lua/ch-2.lua create mode 100755 challenge-196/roger-bell-west/perl/ch-1.pl create mode 100755 challenge-196/roger-bell-west/perl/ch-2.pl create mode 100644 challenge-196/roger-bell-west/postscript/ch-1.ps create mode 100644 challenge-196/roger-bell-west/postscript/ch-2.ps create mode 100755 challenge-196/roger-bell-west/python/ch-1.py create mode 100755 challenge-196/roger-bell-west/python/ch-2.py create mode 100755 challenge-196/roger-bell-west/raku/ch-1.p6 create mode 100755 challenge-196/roger-bell-west/raku/ch-2.p6 create mode 100755 challenge-196/roger-bell-west/ruby/ch-1.rb create mode 100755 challenge-196/roger-bell-west/ruby/ch-2.rb create mode 100755 challenge-196/roger-bell-west/rust/ch-1.rs create mode 100755 challenge-196/roger-bell-west/rust/ch-2.rs 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): List { + var o = ArrayList() + 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()) { + 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): List> { + var o = ArrayList>() + 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) -> Vec { + 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-2.rs new file mode 100755 index 0000000000..6ebff610fc --- /dev/null +++ b/challenge-196/roger-bell-west/rust/ch-2.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!(rangelist(vec![1, 3, 4, 5, 7]), vec![vec![3, 5]]); +} + +#[test] +fn test_ex2() { + assert_eq!(rangelist(vec![1, 2, 3, 6, 7, 9]), vec![vec![1, 3], vec![6, 7]]); +} + +#[test] +fn test_ex3() { + assert_eq!( + rangelist(vec![0, 1, 2, 4, 5, 6, 8, 9]), + vec![vec![0, 2], vec![4, 6], vec![8, 9]] + ); +} + +fn rangelist(l: Vec) -> Vec> { + let mut o = Vec::new(); + let mut start = l[0]; + let mut prev = start; + for &v in l.iter().skip(1) { + if v != prev + 1 { + if prev > start { + o.push(vec![start, prev]); + } + start = v; + } + prev = v; + } + if prev > start { + o.push(vec![start, prev]); + } + o +} -- cgit