use strict; use warnings; my (@gs, @xp, @yp); my ($x, $y) = (0, 0); while (<>) { chomp; $x = 0; for (split //) { if ($_ eq "#") { push @gs, [ $x, $y ]; $xp[$x] = 1; $yp[$y] = 1; } $x++; } $y++; } my ($w, $h) = ($x, $y); sub expand { my ($f, @gs) = @_; my ($xe, $ye) = (0, 0); for (my $x = 0; $x < $w; ++$x) { next if defined $xp[$x]; for (@gs) { $_ = [ $_->[0] + $f-1, $_->[1] ] if $_->[0] > ($x+$xe); } $xe += $f-1; } for (my $y = 0; $y < $h; ++$y) { next if defined $yp[$y]; for (@gs) { $_ = [ $_->[0], $_->[1] + $f-1 ] if $_->[1] > ($y+$ye); } $ye += $f-1; } @gs; } sub dists { my $sum = 0; while (@_) { my $a = shift; for my $b (@_) { $sum += abs($a->[0] - $b->[0]) + abs($a->[1] - $b->[1]); } } $sum; } print dists(expand(2, @gs)), "\n"; print dists(expand(1000000, @gs)), "\n";