#! perl use strict; use warnings; use constant { WILDCARDS => 9, CHARACTERS => 10, }; my @table = [ 0 .. WILDCARDS ]; for my $char (1 .. CHARACTERS) { push @{ $table[$char] }, $char; push @{ $table[$char] }, combinations($char, $_) for 1 .. WILDCARDS; } my @widths = map { length } @{ $table[-1] }; print "\n"; printf '%*s|', $widths[$_], ($_ || '') for @{ $table[0] }; print "\n"; printf '%s+', ('-' x $_) for @widths; print "\n"; for my $row (1 .. CHARACTERS) { printf '%*d|', $widths[$_], $table[$row][$_] for 0 .. WILDCARDS; print "\n"; } sub combinations { my ($c, $w) = @_; return factorial($c + $w) / (factorial($c) * factorial($w)); } sub factorial { my ($n) = @_; my $f = 1; $f *= $_ for 2 .. $n; return $f; }