Add an extra datum to @probs and the output layout goes a bit ga ga as well.
$ cat spw759180_NetWallah #!/usr/bin/perl # use strict; use warnings; my @probs =(0,0.1,0.53,0.51,0.59,0.67,0.2,0.04,0.05,0.56,0.89,0.75,0.6 +); my $t; print $_ . (",","\n")[$t=1-$t] for grep {($probs[$_] >=.5 .. $probs[$_]> .5) and $t=!$t } 0..$#probs $ ./spw759180_NetWallah 2 4,9 11,$
I think you have to separate the task of finding the in-range values from that of determining the range boundaries as you have no idea what the next datum will be when processing the current one. Also, I think the start and stop conditions of the flip-flop should be consistent (and both > 0.5 since that is the requirement in the OP). In the following code I've added some data to show how single-element ranges are treated.
use strict; use warnings; my @probs = ( 0, 0.1, 0.53, 0.51, 0.59, 0.67, 0.2, 0.04, 0.05, 0.56, 0.89, 0.75, 0.1, 0.51, 0.6, 0.2, 0.7, ); my @inRange = grep { $probs[ $_ ] > 0.5 .. $probs[ $_ ] > 0.5 } 0 .. $#probs; my @starts = map { $inRange[ $_ ] } grep { $_ == 0 || $inRange[ $_ ] - $inRange[ $_ - 1 ] != 1 } 0 .. $#inRange; my @ends = map { $inRange[ $_ ] } grep { $_ == $#inRange || $inRange[ $_ + 1 ] - $inRange[ $_ ] != 1 } 0 .. $#inRange; printf qq{%3d%3d\n}, $starts[ $_ ], $ends[ $_ ] for 0 .. $#starts;
The output.
2 5 9 11 13 14 16 16
I hope this is of interest.
Cheers,
JohnGG
In reply to Re^2: printing array positions that match a condition
by johngg
in thread printing array positions that match a condition
by coldy
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |