#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; my ($START, $END, $SIZE) = (1, 1524, 150); my @range; while (my $line = <DATA>) { my ($pos, $from, $to) = split / |\.\./, $line; if ($START == $from && $END == $to) { @range[$pos .. $SIZE + $pos - 1] = (1) x $SIZE; } } say scalar grep $_, @range; __DATA__ 46 1..1524 832 1..1524 1008 1..1524 1407 1..1524 2360 2052..3260 2967 2052..3260 403 1..1524 800 1..1524 2986 2052..3260 3170 2052..3260
UPDATE Moreover, it seems your description ("Making the array 1 if it contains the position+150 else the array is set to 0") should produce a different output, as you only want to count the part of the 1407 that overlaps 1..1524. The following code does that, and show an alternative approach, without using the array - it uses a hash to remember the positions where the state of the element would change.
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use Syntax::Construct qw{ // }; my ($START, $END, $SIZE) = (1, 1524, 150); my %borders; while (my $line = <DATA>) { my ($pos, $from, $to) = split / |\.\./, $line; if ($START == $from && $END == $to) { $borders{$pos}++; $borders{ $pos + $SIZE + 1 }--; } } my ($sum, $step) = (0, 0); for my $i ($START .. $END) { $step += $borders{$i} // 0; $sum++ if $step; } say $sum; __DATA__ 46 1..1524 832 1..1524 1008 1..1524 1407 1..1524 2360 2052..3260 2967 2052..3260 403 1..1524 800 1..1524 2986 2052..3260 3170 2052..3260
($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: find the coverage of sequence in a particular range
by choroba
in thread find the coverage of sequence in a particular range
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |