#!/usr/bin/perl use strict; use warnings; for my $base (3 .. 9) { print "\tBASE $base\n"; my $next = count_base($base); my $n = 0; while (my @dig = $next->()) { my $num = join '', @dig; if (restricted(@dig)) { print "$n\n" if $n; $n = 0; #print "\t$num\n"; } else { ++$n; #print "$num\n"; } } print "\n\n"; } sub restricted { my @dig = @_; my $i = 0; while (! $dig[$i]) { shift @dig; } for (1 .. $#dig) { return 0 if $dig[$_] <= $dig[$_ - 1]; } return 1; } sub count_base { my $base = shift @_; my @dig = (0) x $base; my @end = 0 .. $base - 1; return sub { return () if "@dig" eq "@end"; my $pos = @dig; while ($pos--) { if (++$dig[$pos] < $base) { @dig[$pos + 1 .. $#dig] = (0) x ($#dig - $pos); return @dig; } } }; }