my $n = shift || 3; my @start = do { use List::Util 'shuffle'; my @perm = shuffle 1 .. $n*$n; map { my $row = $_; [ map { $perm[$row * $n + $_] } 0 .. $n-1 ] } 0 .. $n-1; }; my @solution; for my $x ( 0 .. $n*$n - 1 ) { for my $y ( 0 .. $n*$n - 1 ) { my $block_x = int ($x / $n); my $block_y = int ($y / $n); $solution[$x][$y] = $start[ ($block_x + $y) % $n ][ ($block_y + $x) % $n ]; } } print join "" => map { "@$_\n" } @solution;