AoA with a less ugly call
#!/usr/bin/perl
# http://perlmonks.org/?node_id=1211497
use strict;
use warnings;
use Data::Dump 'pp';
sub up
{
my ($row, $col) = $_[0]->@*;
return $row == 0 && $col == 0 ? [ map [ @$_ ], @_ ] :
(($row > 0 && $col > 0 ? up( [ ~-$row, ~-$col ], @_ ) : () ),
($row > $col ? up( [ ~-$row, $col ], @_ ) : () ) );
}
pp up [ 3, 1 ];
Outputs:
(
[[0, 0], [1, 0], [2, 0], [3, 1]],
[[0, 0], [1, 0], [2, 1], [3, 1]],
[[0, 0], [1, 1], [2, 1], [3, 1]],
)
And yes, the row and col checks are to stay within the triangle.
BTW, contrary to some opinions, this code is NOT golfed. If it were, it wouldn't be using
three letter variable names, and certainly wouldn't have used a totally unnecessary 'return' statement. :)