1 2 3 4 5 2 3 4 5 6 1 2 3 4 <<< Range = 4 NOT! #### sub overlap{ ($_[1] < $_[3] ? $_[1]: $_[3]) - ($_[0] > $_[2] ? $_[0] : $_[2]) + 1; } @data = qw[1 5 2 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 5 2 6 : 4 0 4 1 5 : 4 -1 3 0 4 : 4 -2 2 -1 3 : 4 -3 1 -2 2 : 4 -4 0 -3 1 : 4 my @data = qw[1 2 5 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 2 5 6 : -2 0 1 4 5 : -2 -1 0 3 4 : -2 -2 -1 2 3 : -2 -3 -2 1 2 : -2 -4 -3 0 1 : -2 my @data = qw[2 5 1 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 2 5 1 6 : 4 1 4 0 5 : 4 0 3 -1 4 : 4 -1 2 -2 3 : 4 -2 1 -3 2 : 4 -3 0 -4 1 : 4 my @data = qw[1 6 2 5]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 6 2 5 : 4 0 5 1 4 : 4 -1 4 0 3 : 4 -2 3 -1 2 : 4 -3 2 -2 1 : 4 -4 1 -3 0 : 4 #### #! perl -slw use strict; sub overlap{ @_ = map{abs $_ } @_ if 4 == grep $_ < 0, @_; local $_ = ($_[1] < $_[3] ? $_[1]: $_[3]) - ($_[0] > $_[2] ? $_[0] : $_[2]) ; $_ > -1 ? $_ : 0; } while() { chomp; print,next unless length; print $_, ' = ', overlap( ( split(' ') )[0 .. 3] ); } print''; my @data = qw[1 5 2 6]; print "@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; __DATA__ 1 2 2 3 (0) 2 3 1 2 (0) 1 2 3 4 (0) 1 3 2 4 (1) 1 4 2 3 (1) 2 4 1 3 (1) 3 4 1 2 (0) -2 -1 1 2 (0) -2 1 -1 2 (2) -2 2 -1 1 (2) -1 2 -2 1 (2) 1 2 -2 -1 (0) -2 -3 -1 -2 (0) -1 -2 -3 -4 (0) -1 -3 -2 -4 (1) -1 -4 -2 -3 (1) -2 -4 -1 -3 (1) -3 -4 -1 -2 (0) #### C:\test>232325 1 2 2 3 (0) = 0 2 3 1 2 (0) = 0 1 2 3 4 (0) = 0 1 3 2 4 (1) = 1 1 4 2 3 (1) = 1 2 4 1 3 (1) = 1 3 4 1 2 (0) = 0 -2 -1 1 2 (0) = 0 -2 1 -1 2 (2) = 2 -2 2 -1 1 (2) = 2 -1 2 -2 1 (2) = 2 1 2 -2 -1 (0) = 0 -2 -3 -1 -2 (0) = 0 -1 -2 -3 -4 (0) = 0 -1 -3 -2 -4 (1) = 1 -1 -4 -2 -3 (1) = 1 -2 -4 -1 -3 (1) = 1 -3 -4 -1 -2 (0) = 0 1 5 2 6 : 3 0 4 1 5 : 3 -1 3 0 4 : 3 -2 2 -1 3 : 3 -3 1 -2 2 : 3 -4 0 -3 1 : 3 C:\test>