aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-152/roger-bell-west/javascript/ch-1.js24
-rwxr-xr-xchallenge-152/roger-bell-west/javascript/ch-2.js48
-rw-r--r--challenge-152/roger-bell-west/kotlin/ch-1.kt25
-rw-r--r--challenge-152/roger-bell-west/kotlin/ch-2.kt55
-rwxr-xr-xchallenge-152/roger-bell-west/lua/ch-1.lua27
-rwxr-xr-xchallenge-152/roger-bell-west/lua/ch-2.lua42
-rwxr-xr-xchallenge-152/roger-bell-west/perl/ch-1.pl21
-rwxr-xr-xchallenge-152/roger-bell-west/perl/ch-2.pl59
-rw-r--r--challenge-152/roger-bell-west/postscript/ch-1.ps22
-rw-r--r--challenge-152/roger-bell-west/postscript/ch-2.ps65
-rwxr-xr-xchallenge-152/roger-bell-west/python/ch-1.py19
-rwxr-xr-xchallenge-152/roger-bell-west/python/ch-2.py35
-rwxr-xr-xchallenge-152/roger-bell-west/raku/ch-1.p617
-rwxr-xr-xchallenge-152/roger-bell-west/raku/ch-2.p642
-rwxr-xr-xchallenge-152/roger-bell-west/ruby/ch-1.rb23
-rwxr-xr-xchallenge-152/roger-bell-west/ruby/ch-2.rb46
-rwxr-xr-xchallenge-152/roger-bell-west/rust/ch-1.rs38
-rwxr-xr-xchallenge-152/roger-bell-west/rust/ch-2.rs58
18 files changed, 666 insertions, 0 deletions
diff --git a/challenge-152/roger-bell-west/javascript/ch-1.js b/challenge-152/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..59217c6c86
--- /dev/null
+++ b/challenge-152/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,24 @@
+#! /usr/bin/node
+
+function tsp (tree) {
+ let mp=0;
+ for (let r of tree) {
+ mp += Math.min(...r);
+ }
+ return mp;
+}
+
+if (tsp([[1],[5,3],[2,3,4],[7,1,0,2],[6,4,5,2,8]]) == 8) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (tsp([[5],[2,3],[4,1,4],[0,1,2,3],[7,2,4,1,9]]) == 9) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
+
diff --git a/challenge-152/roger-bell-west/javascript/ch-2.js b/challenge-152/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..6a97ee21b0
--- /dev/null
+++ b/challenge-152/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,48 @@
+#! /usr/bin/node
+
+function Rect(xy1,xy2) {
+ let r=Object.create(Rect.methods);
+ r.xy1=[Math.min(xy1[0],xy2[0]),Math.min(xy1[1],xy2[1])];
+ r.xy2=[Math.max(xy1[0],xy2[0]),Math.max(xy1[1],xy2[1])];
+ return r;
+}
+
+Rect.methods = {
+ area() {
+ let area=1;
+ for (let axis=0;axis<=1;axis++) {
+ area *= this.xy2[axis]-this.xy1[axis];
+ }
+ return area;
+ },
+
+ overlap(other) {
+ let area=1;
+ for (let axis=0;axis<=1;axis++) {
+ area *= Math.max(0,
+ Math.min(this.xy2[axis],other.xy2[axis])-
+ Math.max(this.xy1[axis],other.xy1[axis])
+ );
+ }
+ return area;
+ },
+
+ fullarea(other) {
+ return this.area()+other.area()-this.overlap(other);
+ }
+}
+
+if (new Rect([-1,0],[2,2]).fullarea(new Rect([0,-1],[4,4])) == 22) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (new Rect([-3,-1],[1,3]).fullarea(new Rect([-1,-3],[2,2])) == 25) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
+
diff --git a/challenge-152/roger-bell-west/kotlin/ch-1.kt b/challenge-152/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..84bd5bfe8b
--- /dev/null
+++ b/challenge-152/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,25 @@
+fun tsp(tree: List<List<Int>>): Int {
+ var mp=0
+ for (r in tree) {
+ val rt = r.minOrNull()
+ if (rt != null) {
+ mp += rt
+ }
+ }
+ return mp
+}
+
+fun main() {
+ if (tsp(listOf(listOf(1),listOf(5,3),listOf(2,3,4),listOf(7,1,0,2),listOf(6,4,5,2,8))) == 8) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (tsp(listOf(listOf(5),listOf(2,3),listOf(4,1,4),listOf(0,1,2,3),listOf(7,2,4,1,9))) == 9) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-152/roger-bell-west/kotlin/ch-2.kt b/challenge-152/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..c1baafecd8
--- /dev/null
+++ b/challenge-152/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,55 @@
+import kotlin.math.min
+import kotlin.math.max
+
+class Rect(_xy1: List<Int>, _xy2: List<Int>) {
+ val xy1=listOf(
+ min(_xy1[0],_xy2[0]),
+ min(_xy1[1],_xy2[1]),
+ );
+ val xy2=listOf(
+ max(_xy1[0],_xy2[0]),
+ max(_xy1[1],_xy2[1]),
+ );
+
+ fun area(): Int {
+ var area=1
+ for (axis in 0..1) {
+ area *= xy2[axis]-xy1[axis]
+ }
+ return area
+ }
+
+ fun overlap(other: Rect): Int {
+ var area=1
+ for (axis in 0..1) {
+ area *= max(0,
+ min(xy2[axis],other.xy2[axis])-
+ max(xy1[axis],other.xy1[axis])
+ )
+ }
+ return area
+ }
+
+ fun fullarea(other: Rect): Int {
+ return area()+other.area()-overlap(other)
+ }
+}
+
+fun main() {
+ if (Rect(listOf(-1,0),listOf(2,2))
+ .fullarea(Rect(listOf(0,-1),listOf(4,4)))
+ == 22) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (Rect(listOf(-3,-1),listOf(1,3))
+ .fullarea(Rect(listOf(-1,-3),listOf(2,2)))
+ == 25) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-152/roger-bell-west/lua/ch-1.lua b/challenge-152/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..ecb3fb5a2a
--- /dev/null
+++ b/challenge-152/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,27 @@
+#! /usr/bin/lua
+
+function tsp(tree)
+ mp=0
+ for k1,v1 in pairs(tree) do
+ mr=v1[1]
+ for k2,v2 in pairs(v1) do
+ mr=math.min(mr,v2)
+ end
+ mp = mp + mr
+ end
+ return mp
+end
+
+if tsp({{1},{5,3},{2,3,4},{7,1,0,2},{6,4,5,2,8}}) == 8 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if tsp({{5},{2,3},{4,1,4},{0,1,2,3},{7,2,4,1,9}}) == 9 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-152/roger-bell-west/lua/ch-2.lua b/challenge-152/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..4e9a29e330
--- /dev/null
+++ b/challenge-152/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,42 @@
+#! /usr/bin/lua
+
+Rect = {x1 = 0, y1 = 0, x2 = 0, y2 = 0, a = {}, b = {}}
+
+function Rect:new(a,b)
+ local o = {}
+ self.__index = self
+ setmetatable(o,self)
+ o.x1=math.min(a[1],b[1])
+ o.x2=math.max(a[1],b[1])
+ o.y1=math.min(a[2],b[2])
+ o.y2=math.max(a[2],b[2])
+ return o
+end
+
+function Rect:area()
+ return (self.x2-self.x1)*(self.y2-self.y1)
+end
+
+function Rect:overlap(other)
+ local x=math.max(0,math.min(self.x2,other.x2)-math.max(self.x1,other.x1))
+ local y=math.max(0,math.min(self.y2,other.y2)-math.max(self.y1,other.y1))
+ return x*y
+end
+
+function Rect:fullarea(other)
+ return self:area()+other:area()-self:overlap(other)
+end
+
+if Rect:new({-1,0},{2,2}):fullarea(Rect:new({0,-1},{4,4})) == 22 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if Rect:new({-3,-1},{1,3}):fullarea(Rect:new({-1,-3},{2,2})) == 25 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-152/roger-bell-west/perl/ch-1.pl b/challenge-152/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..54328af70c
--- /dev/null
+++ b/challenge-152/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,21 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(tsp([[1],[5,3],[2,3,4],[7,1,0,2],[6,4,5,2,8]]),8,'example 1');
+
+is(tsp([[5],[2,3],[4,1,4],[0,1,2,3],[7,2,4,1,9]]),9,'example 2');
+
+use List::Util qw(min);
+
+sub tsp {
+ my $tree = shift;
+ my $mp=0;
+ foreach my $r (@{$tree}) {
+ $mp+=min(@{$r});
+ }
+ return $mp;
+}
diff --git a/challenge-152/roger-bell-west/perl/ch-2.pl b/challenge-152/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..9bf21fcfcc
--- /dev/null
+++ b/challenge-152/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,59 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(Rect->new([-1,0],[2,2])->fullarea(Rect->new([0,-1],[4,4])),22,'example 1');
+
+is(Rect->new([-3,-1],[1,3])->fullarea(Rect->new([-1,-3],[2,2])),25,'example 2');
+
+package Rect;
+
+use List::Util qw(min max);
+
+sub new {
+ my ($class,$xy1,$xy2)=@_;
+ my $self={
+ xy1 => [
+ min($xy1->[0],$xy2->[0]),
+ min($xy1->[1],$xy2->[1]),
+ ],
+ xy2 => [
+ max($xy1->[0],$xy2->[0]),
+ max($xy1->[1],$xy2->[1]),
+ ],
+ };
+ bless $self,$class;
+ return $self;
+}
+
+sub area {
+ my $self=shift;
+ my $area=1;
+ foreach my $axis (0,1) {
+ $area *= $self->{xy2}[$axis] - $self->{xy1}[$axis];
+ }
+ return $area;
+}
+
+
+sub overlap {
+ my $self=shift;
+ my $other=shift;
+ my $area=1;
+ foreach my $axis (0,1) {
+ $area *= max(0,
+ min($self->{xy2}[$axis],$other->{xy2}[$axis])-
+ max($self->{xy1}[$axis],$other->{xy1}[$axis])
+ );
+ }
+ return $area;
+}
+
+sub fullarea {
+ my $self=shift;
+ my $other=shift;
+ return $self->area()+$other->area()-$self->overlap($other);
+}
diff --git a/challenge-152/roger-bell-west/postscript/ch-1.ps b/challenge-152/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..b08abc9a45
--- /dev/null
+++ b/challenge-152/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,22 @@
+%!PS
+
+/tsp {
+ 2 dict begin
+ /mp 0 def
+ {
+ dup 0 get /mr exch def
+ {
+ dup mr lt {
+ /mr exch def
+ } {
+ pop
+ } ifelse
+ } forall
+ /mp mp mr add def
+ } forall
+ mp
+ end
+} bind def
+
+[ [ 1 ] [ 5 3 ] [ 2 3 4 ] [ 7 1 0 2 ] [ 6 4 5 2 8 ] ] tsp 8 eq { (Pass) } { (FAIL) } ifelse print ( ) print
+[ [ 5 ] [ 2 3 ] [ 4 1 4 ] [ 0 1 2 3 ] [ 7 2 4 1 9 ] ] tsp 9 eq { (Pass) } { (FAIL) } ifelse =
diff --git a/challenge-152/roger-bell-west/postscript/ch-2.ps b/challenge-152/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..31453f353c
--- /dev/null
+++ b/challenge-152/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,65 @@
+%!PS
+
+/rect.new {
+ 2 dict begin
+ dup
+ 0 get /a exch def
+ 1 get /b exch def
+ [
+ [
+ a 0 get b 0 get min
+ a 1 get b 1 get min
+ ]
+ [
+ a 0 get b 0 get max
+ a 1 get b 1 get max
+ ]
+ ]
+ end
+} bind def
+
+/rect.area {
+ 2 dict begin
+ dup
+ 0 get /a exch def
+ 1 get /b exch def
+ b 0 get a 0 get sub
+ b 1 get a 1 get sub
+ mul
+ end
+} bind def
+
+/rect.overlap {
+ 5 dict begin
+ dup
+ 0 get /a exch def
+ 1 get /b exch def
+ dup
+ 0 get /c exch def
+ 1 get /d exch def
+ /area 1 def
+ 0 1 1 {
+ /axis exch def
+ b axis get d axis get min
+ a axis get c axis get max
+ sub
+ 0 max area mul /area exch def
+ } for
+ area
+ end
+} bind def
+
+/rect.fullarea {
+ 1 dict begin
+ /area 0 def
+ dup rect.area area add /area exch def
+ exch
+ dup rect.area area add /area exch def
+ rect.overlap area exch sub
+ end
+} bind def
+
+[ [ -1 0 ] [ 2 2 ] ] rect.new [ [ 0 -1 ] [ 4 4 ] ] rect.new rect.fullarea
+22 eq { (Pass) } { (FAIL) } ifelse print ( ) print
+[ [ -3 -1 ] [ 1 3 ] ] rect.new [ [ -1 -3 ] [ 2 2 ] ] rect.new rect.fullarea
+25 eq { (Pass) } { (FAIL) } ifelse =
diff --git a/challenge-152/roger-bell-west/python/ch-1.py b/challenge-152/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..9da8902aeb
--- /dev/null
+++ b/challenge-152/roger-bell-west/python/ch-1.py
@@ -0,0 +1,19 @@
+#! /usr/bin/python3
+
+import unittest
+
+def tsp(tree):
+ mp=0
+ for r in tree:
+ mp += min(r)
+ return mp
+
+class TestTsp(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(tsp([[1],[5,3],[2,3,4],[7,1,0,2],[6,4,5,2,8]]),8,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(tsp([[5],[2,3],[4,1,4],[0,1,2,3],[7,2,4,1,9]]),9,'example 2')
+
+unittest.main()
diff --git a/challenge-152/roger-bell-west/python/ch-2.py b/challenge-152/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..52518be11a
--- /dev/null
+++ b/challenge-152/roger-bell-west/python/ch-2.py
@@ -0,0 +1,35 @@
+#! /usr/bin/python3
+
+import unittest
+
+class Rect(object):
+
+ def __init__(self,_xy1,_xy2):
+ self.xy1=[min(_xy1[0],_xy2[0]),min(_xy1[1],_xy2[1])]
+ self.xy2=[max(_xy1[0],_xy2[0]),max(_xy1[1],_xy2[1])]
+
+ def area(self):
+ area=1
+ for axis in range(2):
+ area *= self.xy2[axis]-self.xy1[axis]
+ return area
+
+ def overlap(self,other):
+ area=1
+ for axis in range(2):
+ area *= max(0,
+ min(self.xy2[axis],other.xy2[axis])-
+ max(self.xy1[axis],other.xy1[axis]))
+ return area
+
+ def fullarea(self,other):
+ return self.area()+other.area()-self.overlap(other)
+
+class TestRect(unittest.TestCase):
+ def test_ex1(self):
+ self.assertEqual(Rect([-1,0],[2,2]).fullarea(Rect([0,-1],[4,4])),22,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(Rect([-3,-1],[1,3]).fullarea(Rect([-1,-3],[2,2])),25,'example 1')
+
+unittest.main()
diff --git a/challenge-152/roger-bell-west/raku/ch-1.p6 b/challenge-152/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..9806128e9f
--- /dev/null
+++ b/challenge-152/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,17 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(tsp([[1],[5,3],[2,3,4],[7,1,0,2],[6,4,5,2,8]]),8,'example 1');
+
+is(tsp([[5],[2,3],[4,1,4],[0,1,2,3],[7,2,4,1,9]]),9,'example 2');
+
+sub tsp(@ttree) {
+ my $mp=0;
+ for @ttree -> @r {
+ $mp += min(@r);
+ }
+ return $mp;
+}
diff --git a/challenge-152/roger-bell-west/raku/ch-2.p6 b/challenge-152/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..521d266c3c
--- /dev/null
+++ b/challenge-152/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,42 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+class Rect {
+ has @.xy1 is rw;
+ has @.xy2 is rw;
+
+ submethod BUILD(:@xy1,:@xy2) {
+ @!xy1=[min(@xy1[0],@xy2[0]),min(@xy1[1],@xy2[1])];
+ @!xy2=[max(@xy1[0],@xy2[0]),max(@xy1[1],@xy2[1])];
+ }
+
+ method area() {
+ my $area=1;
+ for (0,1) -> $axis {
+ $area *= @.xy2[$axis]-@.xy1[$axis];
+ }
+ return $area;
+ }
+
+ method overlap($other) {
+ my $area=1;
+ for (0,1) -> $axis {
+ $area *= max(0,
+ min(@.xy2[$axis],$other.xy2[$axis])-
+ max(@.xy1[$axis],$other.xy1[$axis])
+ );
+ }
+ return $area;
+ }
+
+ method fullarea($other) {
+ return self.area()+$other.area()-self.overlap($other);
+ }
+}
+
+is(Rect.new(xy1 => [-1,0],xy2 => [2,2]).fullarea(Rect.new(xy1 => [0,-1],xy2 => [4,4])),22,'example 1');
+
+is(Rect.new(xy1 => [-3,-1],xy2 => [1,3]).fullarea(Rect.new(xy1 => [-1,-3],xy2 => [2,2])),25,'example 2');
diff --git a/challenge-152/roger-bell-west/ruby/ch-1.rb b/challenge-152/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..02e5c7f37f
--- /dev/null
+++ b/challenge-152/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,23 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def tsp(tree)
+ mp=0
+ tree.each do |r|
+ mp += r.min
+ end
+ return mp
+end
+
+class TestTsp < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(8,tsp([[1],[5,3],[2,3,4],[7,1,0,2],[6,4,5,2,8]]))
+ end
+
+ def test_ex2
+ assert_equal(9,tsp([[5],[2,3],[4,1,4],[0,1,2,3],[7,2,4,1,9]]))
+ end
+
+end
diff --git a/challenge-152/roger-bell-west/ruby/ch-2.rb b/challenge-152/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..56ce377ebb
--- /dev/null
+++ b/challenge-152/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,46 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+class Rect
+ attr_reader :xy1, :xy2
+ def initialize(_xy1,_xy2)
+ @xy1=[[_xy1[0],_xy2[0]].min,[_xy1[1],_xy2[1]].min]
+ @xy2=[[_xy1[0],_xy2[0]].max,[_xy1[1],_xy2[1]].max]
+ end
+
+ def area
+ area=1
+ 0.upto(1) do |axis|
+ area *= @xy2[axis]-@xy1[axis]
+ end
+ return area
+ end
+
+ def overlap(other)
+ area=1
+ 0.upto(1) do |axis|
+ area *= [0,
+ [@xy2[axis],other.xy2[axis]].min-
+ [@xy1[axis],other.xy1[axis]].max
+ ].max
+ end
+ return area
+ end
+
+ def fullarea(other)
+ return area()+other.area()-overlap(other)
+ end
+end
+
+class TestRect < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(22,Rect.new([-1,0],[2,2]).fullarea(Rect.new([0,-1],[4,4])))
+ end
+
+ def test_ex2
+ assert_equal(25,Rect.new([-3,-1],[1,3]).fullarea(Rect.new([-1,-3],[2,2])))
+ end
+
+end
diff --git a/challenge-152/roger-bell-west/rust/ch-1.rs b/challenge-152/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..38c7457369
--- /dev/null
+++ b/challenge-152/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!(
+ tsp(vec![
+ vec![1],
+ vec![5, 3],
+ vec![2, 3, 4],
+ vec![7, 1, 0, 2],
+ vec![6, 4, 5, 2, 8]
+ ]),
+ 8
+ );
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(
+ tsp(vec![
+ vec![5],
+ vec![2, 3],
+ vec![4, 1, 4],
+ vec![0, 1, 2, 3],
+ vec![7, 2, 4, 1, 9]
+ ]),
+ 9
+ );
+}
+
+fn tsp(tree: Vec<Vec<u32>>) -> u32 {
+ let mut mp = 0;
+ for r in tree {
+ mp += r.iter().min().unwrap();
+ }
+ return mp;
+}
diff --git a/challenge-152/roger-bell-west/rust/ch-2.rs b/challenge-152/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..dcbd9dabf0
--- /dev/null
+++ b/challenge-152/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,58 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+use std::cmp::{max, min};
+
+#[test]
+fn test_ex1() {
+ assert_eq!(
+ Rect::new([-1, 0], [2, 2]).fullarea(Rect::new([0, -1], [4, 4])),
+ 22
+ );
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(
+ Rect::new([-3, -1], [1, 3]).fullarea(Rect::new([-1, -3], [2, 2])),
+ 25
+ );
+}
+
+pub struct Rect {
+ xy1: [i32; 2],
+ xy2: [i32; 2],
+}
+
+impl Rect {
+ pub fn new(xy1: [i32; 2], xy2: [i32; 2]) -> Rect {
+ Rect {
+ xy1: [min(xy1[0], xy2[0]), min(xy1[1], xy2[1])],
+ xy2: [max(xy1[0], xy2[0]), max(xy1[1], xy2[1])],
+ }
+ }
+
+ pub fn area(&self) -> i32 {
+ let mut area = 1;
+ for axis in 0..=1 {
+ area *= self.xy2[axis] - self.xy1[axis];
+ }
+ return area;
+ }
+
+ pub fn overlap(&self, other: Rect) -> i32 {
+ let mut area = 1;
+ for axis in 0..=1 {
+ area *= max(
+ 0,
+ min(self.xy2[axis], other.xy2[axis])
+ - max(self.xy1[axis], other.xy1[axis]),
+ );
+ }
+ return area;
+ }
+
+ pub fn fullarea(&self, other: Rect) -> i32 {
+ return self.area() + other.area() - self.overlap(other);
+ }
+}