And here's a WxH version. It's interesting what can be found in List::AllUtils...
#!/usr/bin/perl
use strict; # https://theweeklychallenge.org/blog/perl-weekly-challeng
+e-248/#TASK2
use warnings;
use List::AllUtils qw( sum zip_by reductions );
use Data::Dump qw( pp );
sub nslide # size, elements
{
my @q = splice @_, 0, shift;
return reductions { push @q, $b; $a + $b - shift @q } sum(@q), @_;
}
my ($width, $height) = (2, 2);
for ( [ [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12] ],
[ [1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1] ],
)
{
print 'Input: $a = ', pp($_), "\n";
my @new = zip_by { [ @_ ] } map [ nslide $height, @$_ ],
zip_by { [ @_ ] } map [ nslide $width, @$_ ], @$_;
print 'Output: $b = ', pp(\@new), "\n\n";
}