1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#!/usr/bin/perl
# Perl Weekly Challenge - 092
# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-092/
#
# Task 2 - Insert Interval
#
# Author: Niels 'PerlBoy' van Dijke
use v5.16;
use strict;
use warnings;
use Interval;
use List::Util qw(min max);
# Unbuffered STDOUT
$|++;
while(<DATA>) {
chomp;
next if /#/;
my @d = split(/\s+/);
my @i = map { Interval->new(split(/,/,$_)) } @d;
my $n = pop(@i);
Print('Input', @i, $n);
my $ext = 0;
my @o = map {
# Extend when overlaps
if ($_->overlaps($n)) {
$_ = Interval->new(min($_->min,$n->min),
max($_->max,$n->max));
$ext++;
}
$_;
} @i;
push(@o, $n) unless $ext;
@o = sort { $a->cmp($b) } @o;
my $i = 0;
while ($i <= scalar(@o) - 2) {
# splice overlapping entries
if ($o[$i]->overlaps($o[$i+1])) {
splice(@o, $i, 2,
Interval->new(min($o[$i]->min,$o[$i+1]->min),
max($o[$i]->max,$o[$i+1]->max)));
} else {
$i++;
}
}
Print('Output', @o);
}
sub Print {
my ($label,@val) = @_;
if ($label eq 'Input') {
my $n = pop(@val);
printf "%s \$S = %s; \$N = %s\n",
$label, join(', ',map { $_->string } @val), $n->string;
} else {
printf "%s %s\n",
$label, join(', ',map { $_->string } @val);
}
}
# Test data
__DATA__
1,4 8,10 2,6
1,2 3,7 8,10 5,8
1,5 7,9 10,11
3,4 5,6 8,10 0,1
3,4 8,10 5,6 1,3
3,4 8,10 5,6 1,12
|