The following code first organizes the intervals into %changes where the beginning and end of each interval are the main keys, i.e. you can walk the keys and see all the points where the situation changes (hence the name).
The second group of loops walks the "changes", and records how many intervals are currently "active", in %current . If the number of current intervals of the same id is the same as the number of input files, the point is stored in %intervals as the starting point; and similarly for the end points.
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; my %changes; for my $file (@ARGV) { open my $in, '<', $file or die "$file: $!"; while (<$in>) { chomp; my ($id, $intervals_string) = split /: /; my @intervals = map [ split /-/ ], split /, /, $intervals_stri +ng; for my $interval (@intervals) { my ($from, $to) = @$interval; $changes{$from}{$id}{$file} = 'start'; $changes{$to}{$id}{$file} = 'end'; } } } my %current; my %intervals; for my $point (sort { $a <=> $b } keys %changes) { for my $id (keys %{ $changes{$point} }) { for my $file (keys %{ $changes{$point}{$id} }) { if ('start' eq $changes{$point}{$id}{$file}) { $current{$id}{$file} = 1; push @{ $intervals{$id} }, [$point] if @ARGV == keys % +{ $current{$id} }; } else { $intervals{$id}[-1][1] = $point if @ARGV == keys %{ $c +urrent{$id} }; delete $current{$id}{$file}; delete $current{$id} if ! keys %{ $current{$id} }; } } } } for my $id (keys %intervals) { say "$id: ", join ', ', map "$_->[0]-$_->[1]", @{ $intervals{$id} +}; }
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
In reply to Re: Intermediate range calculation from files
by choroba
in thread Intermediate range calculation from files
by abhikalrt53
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |