use 5.20.0; use warnings; use List::AllUtils qw/ minmax pairs uniq sum /; use List::UtilsBy qw/ max_by /; use experimental qw/ signatures postderef /; my @points = map { [ split ', ' ] } <>; my @range_x = minmax map { $_->[0] } @points; my @range_y = minmax map { $_->[1] } @points; use DDP; p @range_x; p @range_y; my %grid; my @infinite; my @movers = ( [ int sum( @range_x )/2, int sum(@range_y)/2 ] ); while( my $next = shift @movers ) { calculate_distances( @$next ); } say sum map { values %$_ } values %grid; # for my $row ( @grid ) { # say map { $_ ? # ($_->[1]->@* > 1 ? ' ' : $_->[1]->@* ) : '' } @$row # } sub dist($x1,$y1,$x2,$y2) { return abs($x1-$x2) + abs($y1-$y2); } sub calculate_distances($x, $y) { return if exists $grid{$x}{$y}; $grid{$x}{$y} = 10_000 > sum map { dist($x,$y,@$_) } @points or return; push @movers, [ $x+1, $y ], [ $x-1, $y ], [ $x, $y+1 ], [ $x, $y-1 ]; }