With the requirement of an 8-letter word:
Reading ...
length 8: 37514
length 7: 31449
length 6: 22043
length 5: 12337
length 4: 5826
length 3: 1892
length 2: 398
length 1: 26
Extending 7 ...
Preparing ...
Prepared 33552
Sorting ...
670 aeilnrst entrails
666 aeilprst pilaster
661 adeinrst detrains
651 adeilrst dilaters
651 aeinprst pantries
634 adeilnor irondale
631 aeinorst arsonite
626 aeginrst angriest
623 aeilmrst lamister
619 aeimnrst merantis
618 adeilnrs islander
615 aeloprst petrosal
614 adeiprst rapidest
607 aenoprst operants
605 aelnorst lonestar
598 adegilnr dearling
597 acenorst ancestor
595 aceinrst canister
594 abeilrst abristle
593 aeilorst realitos
670 aeilnrst
8 entrails
7 aliners alister anestri anilest antlers antsier elastin entrail latiner latrine
6 airest aliner altern alters aniler antler antres ariels arisen ariste arline
5 aesir airns airts aisle aisne alert alien aline alist alsen alter anile anise
4 ains aire airn airt aits alit alts anes anil ansi ante anti ares aret aril aris
3 ail ain air ait ale ali alt ane ani ans are art asl ate ats ean ear eat ela eli
2 ae ai al an ar at ea el en er et ia ie il in ir it la le li ln lr lt na ne ni
1 a e i l n r s
####
With the requirement of at least a 7-letter word:
Reading ...
length 8: 37514
length 7: 31449
length 6: 22043
length 5: 12337
length 4: 5826
length 3: 1892
length 2: 398
length 1: 26
Extending 7 ...
Preparing ...
Prepared 704575
Sorting ...
670 aeilnrst entrails
666 aeilprst pilaster
661 adeinrst detrains
651 aeinprst pantries
651 adeilrst dilaters
634 adeilnor irondale
631 aeinorst arsonite
626 aeginrst angriest
623 aeilmrst lamister
619 aeimnrst merantis
618 adeilnrs islander
615 aeloprst petrosal
614 adeiprst rapidest
607 aenoprst operants
605 aelnorst lonestar
Use of uninitialized value in printf at test.pl line 57, <$fh> line 305089.
604 adeilnst
598 adegilnr dearling
597 acenorst ancestor
Use of uninitialized value in printf at test.pl line 57, <$fh> line 305089.
597 adeilnrt
595 aceinrst canister
670 aeilnrst
8 entrails
7 aliners alister anestri anilest antlers antsier elastin entrail latiner
6 airest aliner altern alters aniler antler antres ariels arisen ariste arline
5 aesir airns airts aisle aisne alert alien aline alist alsen alter anile anise
4 ains aire airn airt aits alit alts anes anil ansi ante anti ares aret aril
3 ail ain air ait ale ali alt ane ani ans are art asl ate ats ean ear eat ela
2 ae ai al an ar at ea el en er et ia ie il in ir it la le li ln lr lt na ne ni
1 a e i l n r s
####
With 2of12ing and 8-letter word required:
Reading ...
length 8: 12687
length 7: 11571
length 6: 8303
length 5: 5122
length 4: 2546
length 3: 642
length 2: 62
Preparing ...
Prepared 11926
Sorting ...
346 aeinprst painters
344 aeilprst pilaster
332 adeiprst rapidest
328 aeimprst primates
319 adeilrst lardiest
316 adeoprst adopters
314 aeilnpst panelist
313 adeinrst randiest
313 aeloprst polestar
312 aeilnrst entrails
310 adeimrst readmits
307 aeimnrst minarets
304 aceiprst practise
299 aelmprst tramples
297 acelprst spectral
296 aeginrst angriest
295 acenorst ancestor
293 aelprsty psaltery
291 adeilmst medalist
289 adeilprs lipreads
346 aeinprst
8 painters pantries pertains
7 antsier entraps nastier painter paniers panties parents parties pastern
6 arisen aspire astern entrap esprit insert instep inters niters nitres paints
5 anise antes antis apter arise aspen aster astir earns inapt inept inert inset
4 airs ante anti ants apes apse ares arts earn ears east eats eras erst etas
3 air ani ant ape apt are art asp ate ear eat ens era eta ins ire its nae nap
2 an as at en in is it pa pi re
####
#!/usr/bin/perl
use 5.16.2;
use warnings;
say "Reading ...";
my %magic;
my %stats;
open my $fh, "<", "/usr/share/dict/words";
while (<$fh>) {
lc =~ m/^([a-z]{1,8})$/ or next;
my $key = pack "(A)*", sort unpack "(A)*", $1;
my $l = length $key;
$magic{$key}{len} //= $l;
$magic{$key}{cnt}++;
push @{$magic{$key}{words}}, $1;
$stats{$l}++;
}
say " length $_: $stats{$_}" for sort { $b <=> $a } keys %stats;
say "Extending 7 ...";
foreach my $w7 (grep { $magic{$_}{len} == 7 } keys %magic) {
#$magic{$w7.$_} //= { len => 8, cnt => 0, words => [] } for "a" .. "z";
}
say "Preparing ...";
my %x8;
foreach my $key (keys %magic) {
my $l = length $key;
if ($l == 8) {
$magic{$key}{ext}[$_] = [] for 1 .. 7;
my $x8 = join "" => map "$_?" => unpack "(A)*" => $key;
$x8{$key} = qr{^$x8$};
next;
}
push @{$stats{key}[$l]}, $key;
}
my @k8 = keys %x8;
my $n8 = @k8;
say "Prepared $n8";
foreach my $k8 (@k8) {
--$n8 % 10 == 0 and print STDERR " $n8 \r";
my $x8 = $x8{$k8};
foreach my $l (reverse 1 .. 7) {
foreach my $key (grep m/$x8/ => @{$stats{key}[$l]}) {
push @{$magic{$k8}{ext}[$l]}, $key;
$magic{$k8}{cnt} += $magic{$key}{cnt};
}
}
}
say "Sorting ...";
my @top = sort { $magic{$b}{cnt} <=> $magic{$a}{cnt} } keys %magic;
for (@top[0..19]) {
printf "%6d %-8s %s\n", $magic{$_}{cnt}, $_, $magic{$_}{words}[0];
}
my $best = $top[0];
say $magic{$best}{cnt}, " ", $best;
sub showfirst
{
my ($l, $w) = @_;
$w = substr $w, 0, 80 or return;
$w =~ s/ \w+$//;
say "$l $w";
} # showfirst
showfirst ($magic{$best}{len}, join " " => sort @{$magic{$best}{words}});
foreach my $l (reverse 1 .. 7) {
my @w = map { @{$magic{$_}{words}} } @{$magic{$best}{ext}[$l]};
showfirst ($l, join " " => sort @w);
}