Perl Weekly Challenge 127: no need for coffee!

One way to let me improve my knowledge about Raku (aka Perl 6) is to implement programs in it. Unluckily, I don’t have any production code to implement in Raku yet (sob!). So, why not try solving the Perl Weekly Challenge tasks?

In the following, the assigned tasks for Challenge 110.

PWC 127 - Task 1

The first task was about finding out if two sets of numbers have intersections. It was easy enough to be solved with a .grep of one set into the other:

sub MAIN() {
    # my @S1 = 1, 2, 5, 3, 4;
    # my @S2 = 4, 6, 7, 8, 9;
    my @S1 = 1, 3, 5, 7, 9;
    my @S2 = 0, 2, 4, 6, 8;

    "0".say and exit if @S1.grep: $_ for @S2;
    "1".say;
}


PWC 127 - Task 2

The second task was about recognizing if a given segment overlaps previous segments. A segment is defined by the start value and the end value.
First of all I created a function is-conflict that accepts two arrays and check if the two are in conflict, that means overlap: if any of them is empty or the value of the second is not within the range of the first, they do not overlaps.


sub is-conflict( @interval-a, @interval-b ) {
    return False if ! @interval-a || ! @interval-b;
    return False if @interval-a ~~ @interval-b;
    return True if @interval-a[ 0 ] <= $_ <= @interval-a[ 1 ] for @interval-b;
    return False;
}



The MAIN is therefore a matter of invoking thwe is-conflict function with every possible array slice for a given position. It is worth noting that I did something more in this task: I countered how many times a segment overlaps, and I did that by using a %conflicts hash that counts how many time the same segment is reported as in conflict. At the end, I print out a result.

sub MAIN() {
    my @intervals = [ [1,4], [3,5], [6,8], [12, 13], [3,20] ];

    my %conflicts;
    
    for 0 ..^ @intervals.elems -> $i {
        %conflicts{ @intervals[ $i ] }++ if is-conflict( $_, @intervals[ $i ] ) for @intervals[ 0 .. $i - 1 ];
    }

    for %conflicts.kv -> $what, $how-much {
        "$what conflicts $how-much times".say;
    }
}
<br/>
<br/>
The end result of this script is as follows:

<br/>
<br/>
```shell
% raku ch-2.p6 
3 20 conflicts 2 times
3 5 conflicts 1 times

The article Perl Weekly Challenge 127: no need for coffee! has been posted by Luca Ferrari on August 23, 2021