From 7ff17a30dcda31d1a8644598b6ba6548362cf581 Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 14 Feb 2022 09:14:14 +0000 Subject: Solutions for challenge #152 --- challenge-152/roger-bell-west/javascript/ch-1.js | 24 +++++++++ challenge-152/roger-bell-west/javascript/ch-2.js | 48 +++++++++++++++++ challenge-152/roger-bell-west/kotlin/ch-1.kt | 25 +++++++++ challenge-152/roger-bell-west/kotlin/ch-2.kt | 55 ++++++++++++++++++++ challenge-152/roger-bell-west/lua/ch-1.lua | 27 ++++++++++ challenge-152/roger-bell-west/lua/ch-2.lua | 42 +++++++++++++++ challenge-152/roger-bell-west/perl/ch-1.pl | 21 ++++++++ challenge-152/roger-bell-west/perl/ch-2.pl | 59 +++++++++++++++++++++ challenge-152/roger-bell-west/postscript/ch-1.ps | 22 ++++++++ challenge-152/roger-bell-west/postscript/ch-2.ps | 65 ++++++++++++++++++++++++ challenge-152/roger-bell-west/python/ch-1.py | 19 +++++++ challenge-152/roger-bell-west/python/ch-2.py | 35 +++++++++++++ challenge-152/roger-bell-west/raku/ch-1.p6 | 17 +++++++ challenge-152/roger-bell-west/raku/ch-2.p6 | 42 +++++++++++++++ challenge-152/roger-bell-west/ruby/ch-1.rb | 23 +++++++++ challenge-152/roger-bell-west/ruby/ch-2.rb | 46 +++++++++++++++++ challenge-152/roger-bell-west/rust/ch-1.rs | 38 ++++++++++++++ challenge-152/roger-bell-west/rust/ch-2.rs | 58 +++++++++++++++++++++ 18 files changed, 666 insertions(+) create mode 100755 challenge-152/roger-bell-west/javascript/ch-1.js create mode 100755 challenge-152/roger-bell-west/javascript/ch-2.js create mode 100644 challenge-152/roger-bell-west/kotlin/ch-1.kt create mode 100644 challenge-152/roger-bell-west/kotlin/ch-2.kt create mode 100755 challenge-152/roger-bell-west/lua/ch-1.lua create mode 100755 challenge-152/roger-bell-west/lua/ch-2.lua create mode 100755 challenge-152/roger-bell-west/perl/ch-1.pl create mode 100755 challenge-152/roger-bell-west/perl/ch-2.pl create mode 100644 challenge-152/roger-bell-west/postscript/ch-1.ps create mode 100644 challenge-152/roger-bell-west/postscript/ch-2.ps create mode 100755 challenge-152/roger-bell-west/python/ch-1.py create mode 100755 challenge-152/roger-bell-west/python/ch-2.py create mode 100755 challenge-152/roger-bell-west/raku/ch-1.p6 create mode 100755 challenge-152/roger-bell-west/raku/ch-2.p6 create mode 100755 challenge-152/roger-bell-west/ruby/ch-1.rb create mode 100755 challenge-152/roger-bell-west/ruby/ch-2.rb create mode 100755 challenge-152/roger-bell-west/rust/ch-1.rs create mode 100755 challenge-152/roger-bell-west/rust/ch-2.rs 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>): 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, _xy2: List) { + 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>) -> 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); + } +} -- cgit