use strict; use warnings; my $base = 1; # minimum of cards per hole sub first { my( $holes, $cards ) = @_; my @c = ($base) x $holes; $c[0] += $cards - $base * $holes; $c[0] >= $base or die "Not enough cards!\n"; return \@c; } sub next_comp { my $c = shift; my $i = 0; $i++ while $i < @$c and $c->[$i] == $base; $i >= @$c-1 and return; $c->[$i+1]++; $c->[0] = $c->[$i] - 1; $c->[$i] = $base if $i > 0; return $c; } @ARGV == 2 or die print "Usage: $0 holes cards\n"; my $c = first( @ARGV ); my $i = 0; print ++$i.": @$c\n"; print ++$i.": @$c\n" while $c = next_comp $c;