sub mandist { my($x1, $y1, $x2, $y2) = @_; abs( $x1 - $x2 ) + abs( $y1 - $y2 ) } sub f { my($x, $y, @p) = @_; my $i = 0; ( map { $$_{index} } sort { $$a{mandist} <=> $$b{mandist} || $$a{index} <=> $$b{index} } map { $$_{mandist} = mandist( $x, $y, @$_{qw(px py)} ); $_ } grep { $$_{px} == $x or $$_{py} == $y } map { {px => $$_[0], py => $$_[1], index => $i++} } @p )[0] // -1 } print pop(@$_) == f(@$_) ? "ok\n" : "err\n" for [ 3, 4 => [1, 2], [3, 1], [2, 4], [2, 3] => 2 ], [ 2, 5 => [3, 4], [2, 3], [1, 5], [2, 5] => 3 ], [ 1, 1 => [2, 2], [3, 3], [4, 4] => -1 ], [ 0, 0 => [0, 1], [1, 0], [0, 2], [2, 0] => 0 ], [ 5, 5 => [5, 6], [6, 5], [5, 4], [4, 5] => 0 ],