$| = 1; # from A005589 my @smallNames = qw(xxxx one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen); my @tensNames = qw(xxxx ten twenty thirty forty fifty sixty seventy eighty ninety); my @bigNames = qw(xxxx thousand million billion trillion quadrillion quintillion sextillion septillion octillion nonillion decillion undecillion duodecillion tredecillion quattuordecillion quindecillion sexdecillion septdecillion octodecillion novemdecillion vigintillion unvigintillion duovigintillion trevigintillion quattuorvigintillion quinvigintillion sexvigintillion septvigintillion octovigintillion novemvigintillion trigintillion untrigintillion duotrigintillion); sub num2words { my $number = shift; my @words = (); my $big = 0; while ($number ne "") { my $num; if (length($number) > 3) { $num = substr($number, -3); $number = substr($number, 0, length($number)-3); } else { $num = $number; $number = ""; } if (0+$num) { die "too big" if not $bigNames[$big]; unshift @words => $bigNames[$big] if $big; my $um = $num % 100; if ($um) { if ($um <= $#smallNames) { unshift @words => $smallNames[$um]; } else { my $m = $um % 10; if ($m) { unshift @words => $smallNames[$m]; } my $u = int($um / 10); unshift @words => $tensNames[$u]; } } my $n = int($num / 100); if ($n) { unshift @words => "hundred"; unshift @words => $smallNames[$n]; } } $big++; } return @words ? @words : ("zero"); } my @seen = (); my $candidate = 1; # next candidate (neither seen nor "e") my @future = (); # positions of "e" in the future my $everything = ""; # every letters so far sub other { foreach my $n ($candidate..1_000_000_000_000_000_000) { if (not $seen[$n]) { my $letters = join("" => num2words($n)); my $ok = 1; # so far # ok with the future ? my $possible = $everything . $letters; foreach my $future ($n, @future) { if ($future <= length($possible)) { if (substr($possible, $future-1, 1) ne "e") { $ok = 0; last; } } } if ($ok) { $everything = $possible; $seen[$n] = 1; push @future => $n; @future = grep { $_ > length($everything) } @future; # skip impossible things while ($seen[$candidate] or ($candidate <= length($everything) && substr($everything, $candidate-1, 1) ne "e")) { $candidate++; } return $n; } } } die "# oops"; } foreach my $n (1..10_000) { print $n, " ", other(), "\n"; }