From f5432112f6df7ec1b7c7cbf7cb636e8970e3d011 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 14 Feb 2022 11:14:34 +0100 Subject: Task 1 done --- challenge-152/luca-ferrari/raku/ch-1.p6 | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100755 challenge-152/luca-ferrari/raku/ch-1.p6 diff --git a/challenge-152/luca-ferrari/raku/ch-1.p6 b/challenge-152/luca-ferrari/raku/ch-1.p6 new file mode 100755 index 0000000000..d4414394c1 --- /dev/null +++ b/challenge-152/luca-ferrari/raku/ch-1.p6 @@ -0,0 +1,7 @@ +#!raku + +sub MAIN() { + my @triangle = [ [1], [5,3], [2,3,4], [7,1,0,2], [6,4,5,2,8] ]; + my $sum += $_.min for @triangle; + $sum.say; +} -- cgit From 7010422e62df71969f2037b48abd2e3e62125591 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 14 Feb 2022 12:38:59 +0100 Subject: Task 2 done --- challenge-152/luca-ferrari/raku/ch-2.p6 | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 challenge-152/luca-ferrari/raku/ch-2.p6 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; +} -- cgit From e7e88e0ea98728111f4a31b39c213cf6d6ac5c8e Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 14 Feb 2022 13:25:55 +0100 Subject: Improved task 2: avoid non overlapping rectangles. --- challenge-152/luca-ferrari/raku/ch-2.p6 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/challenge-152/luca-ferrari/raku/ch-2.p6 b/challenge-152/luca-ferrari/raku/ch-2.p6 index 051e63023b..65be181aea 100755 --- a/challenge-152/luca-ferrari/raku/ch-2.p6 +++ b/challenge-152/luca-ferrari/raku/ch-2.p6 @@ -15,7 +15,19 @@ class Rectangle { * abs( $!corner-right.y - $!corner-left.y ); } + + method !is-overlapping( Rectangle $r ) { + ( $!corner-left.x <= $r.corner-left.x <= $!corner-right.x + || $!corner-left.x <= $r.corner-righ.x <= $!corner-right.x ) + && + ( $!corner-left.y <= $r.corner-left.y <= $!corner-right.y + || $!corner-left.y <= $r.corner-right.y <= $!corner-right.y ); + + } + method overlapping-area( Rectangle $r ) { + return 0 if ! self!is-overlapping( $r ); + my $left = Point.new( x => max( $!corner-left.x, $r.corner-left.x ), y => max( $!corner-left.y, $r.corner-left.y ) ); -- cgit From d863e9de7ddd1634fd55dc48bed0f52143c4ae2c Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 14 Feb 2022 13:39:40 +0100 Subject: Improved Task 2. Blog references --- challenge-152/luca-ferrari/blog-1.txt | 1 + challenge-152/luca-ferrari/blog-2.txt | 1 + challenge-152/luca-ferrari/raku/ch-2.p6 | 9 ++++----- 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 challenge-152/luca-ferrari/blog-1.txt create mode 100644 challenge-152/luca-ferrari/blog-2.txt diff --git a/challenge-152/luca-ferrari/blog-1.txt b/challenge-152/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..1ff054de6b --- /dev/null +++ b/challenge-152/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/02/14/PerlWeeklyChallenge152.html#task1 diff --git a/challenge-152/luca-ferrari/blog-2.txt b/challenge-152/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..e86f18d955 --- /dev/null +++ b/challenge-152/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/02/14/PerlWeeklyChallenge152.html#task2 diff --git a/challenge-152/luca-ferrari/raku/ch-2.p6 b/challenge-152/luca-ferrari/raku/ch-2.p6 index 65be181aea..c68c8c447a 100755 --- a/challenge-152/luca-ferrari/raku/ch-2.p6 +++ b/challenge-152/luca-ferrari/raku/ch-2.p6 @@ -50,10 +50,9 @@ class Rectangle { # $ 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 ]; - + my @corners = @points.rotor( 2 ).map: { Point.new( x => $_[ 0 ].Int, y => $_[ 1 ].Int ) }; + my Rectangle ( $r1, $r2 ) = @corners.rotor( 2 ).map: { Rectangle.new( + corner-left => $_[ 0 ], + corner-right => $_[ 1 ] ) }; "{ $r1.area + $r2.area - $r1.overlapping-area( $r2 ) }".say; } -- cgit