4 use experimental 'for_list';
5 use List::Util qw(min);
8 my @seeds = map { $_ } scalar(<>) =~ /\d+/g;
10 for my ($st, $ct) (@seeds) {
11 push @ranges, [ $st, $ct];
16 my @rules = split /\n/;
18 @rules = map { [ /\d+/g ] } @rules;
22 my $range = shift @ranges;
23 my ($g0, $gn) = @$range;
26 for my $rule (@rules) {
27 my ($d0, $r0, $rn) = @$rule;
29 next if $gn < $r0 || $g0 > $rn; # no overlap
30 if ($g0 >= $r0 && $gn <= $rn) { # contained
31 push @nranges, [ $g0+$d0-$r0, $gn-$g0+1 ];
34 if ($g0 < $r0 && $gn >= $r0) { # end of range overlap
35 push @ranges, [ $g0, $r0-$g0 ],
39 if ($g0 >= $r0 && $g0 <= $rn) { # start of range ovlp
40 push @ranges, [ $g0, $rn-$g0+1 ],
45 push @nranges, $range; # no match
48 say map { $_->[0], '+', $_->[1], ' ' } @ranges;
51 say min map { $_->[0] } @ranges;