aboutsummaryrefslogtreecommitdiff
path: root/challenge-050
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2020-03-02 09:06:25 +0100
committerLuca Ferrari <fluca1978@gmail.com>2020-03-02 09:06:25 +0100
commitfa6a1a5ffcaa0c81544b76f565456acf67627b63 (patch)
tree5e9bdbb8f8ebcf849ced9b8435d3436c9e6843f1 /challenge-050
parent16116626d45bf678a0209a92d27478423fbcfab3 (diff)
downloadperlweeklychallenge-club-fa6a1a5ffcaa0c81544b76f565456acf67627b63.tar.gz
perlweeklychallenge-club-fa6a1a5ffcaa0c81544b76f565456acf67627b63.tar.bz2
perlweeklychallenge-club-fa6a1a5ffcaa0c81544b76f565456acf67627b63.zip
Possible solution to task 1.
Diffstat (limited to 'challenge-050')
-rw-r--r--challenge-050/luca-ferrari/raku/ch-1.p648
1 files changed, 48 insertions, 0 deletions
diff --git a/challenge-050/luca-ferrari/raku/ch-1.p6 b/challenge-050/luca-ferrari/raku/ch-1.p6
new file mode 100644
index 0000000000..c680c18897
--- /dev/null
+++ b/challenge-050/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,48 @@
+#!env raku
+#
+# Perl Weekly Challenge 50
+# see
+# <https://perlweeklychallenge.org/blog/perl-weekly-challenge-050/>
+#
+# Task 1
+# Merge Intervals
+# Write a script to merge the given intervals where ever possible.
+# [2,7], [3,9], [10,12], [15,19], [18,22]
+# The script should merge [2, 7] and [3, 9]
+# together to return [2, 9].
+# Similarly it should also merge [15, 19]
+# and [18, 22] together to return [15, 22].
+# The final result should be something like below:
+# [2, 9], [10, 12], [15, 22]
+
+
+sub overlap( Range $a, Range $b ) {
+ return $b.max > $a.max > $b.min || $b.max > $a.min > $b.min;
+}
+
+sub merge( Range $a, Range $b ) {
+ return Range.new: min( $a.min, $b.min ), max( $b.max, $a.max );
+}
+
+
+
+
+my @ranges = 2..7, 3..9, 10..12, 15..19, 18..22;
+my @merged-ranges;
+
+while ( @ranges.elems > 1 ) {
+ if overlap( @ranges[ 0 ], @ranges[ 1 ] ) {
+ # merge the ranges
+ @merged-ranges.push: merge( @ranges[ 0 ], @ranges[ 1 ] );
+ @ranges.shift;
+ @ranges.shift;
+ }
+ else {
+ # dont' merge, push the first one
+ @merged-ranges.push: @ranges[ 0 ];
+ @ranges.shift;
+ }
+}
+
+
+@merged-ranges.say;