diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-02-14 12:38:59 +0100 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-02-14 13:08:33 +0100 |
| commit | 7010422e62df71969f2037b48abd2e3e62125591 (patch) | |
| tree | 9bdcdeb81eb876b4db3e2871de72931ea500e875 | |
| parent | f5432112f6df7ec1b7c7cbf7cb636e8970e3d011 (diff) | |
| download | perlweeklychallenge-club-7010422e62df71969f2037b48abd2e3e62125591.tar.gz perlweeklychallenge-club-7010422e62df71969f2037b48abd2e3e62125591.tar.bz2 perlweeklychallenge-club-7010422e62df71969f2037b48abd2e3e62125591.zip | |
Task 2 done
| -rwxr-xr-x | challenge-152/luca-ferrari/raku/ch-2.p6 | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/challenge-152/luca-ferrari/raku/ch-2.p6 b/challenge-152/luca-ferrari/raku/ch-2.p6 new file mode 100755 index 0000000000..051e63023b --- /dev/null +++ b/challenge-152/luca-ferrari/raku/ch-2.p6 @@ -0,0 +1,47 @@ +#!raku + +class Point { + has Int $.x; + has Int $.y; +} + + +class Rectangle { + has Point $.corner-left; + has Point $.corner-right; + + method area() { + abs( $!corner-right.x - $!corner-left.x ) + * abs( $!corner-right.y - $!corner-left.y ); + } + + method overlapping-area( Rectangle $r ) { + my $left = Point.new( x => max( $!corner-left.x, $r.corner-left.x ), + y => max( $!corner-left.y, $r.corner-left.y ) + ); + my $right = Point.new( x => min( $!corner-right.x, $r.corner-right.x ), + y => min( $!corner-right.y, $r.corner-right.y ) + ); + + my Rectangle $overlapping = Rectangle.new: + corner-left => $left, + corner-right => $right; + return $overlapping.area; + + } +} + +# Example: +# $ raku ch-2.p6 -1 0 2 2 0 -1 4 4 +# 22 +# +# $ raku ch-2.p6 -3 -1 1 3 -1 -3 2 2 +# 25 +sub MAIN( *@points where { @points.elems == 8 && @points.grep( * ~~ Int ) == @points.elems } ) { + my @corners; + @corners.push: Point.new( x => $_[ 0 ].Int, y => $_[ 1 ].Int ) for @points.rotor( 2 ); + my Rectangle $r1 = Rectangle.new: corner-left => @corners[ 0 ], corner-right => @corners[ 1 ]; + my Rectangle $r2 = Rectangle.new: corner-left => @corners[ 2 ], corner-right => @corners[ 3 ]; + + "{ $r1.area + $r2.area - $r1.overlapping-area( $r2 ) }".say; +} |
