#! 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)