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 lati
+ner latrine
6 airest aliner altern alters aniler antler antres ariels arisen arist
+e arline
5 aesir airns airts aisle aisne alert alien aline alist alsen alter an
+ile anise
4 ains aire airn airt aits alit alts anes anil ansi ante anti ares are
+t 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 30
+5089.
604 adeilnst
598 adegilnr dearling
597 acenorst ancestor
Use of uninitialized value in printf at test.pl line 57, <$fh> line 30
+5089.
597 adeilnrt
595 aceinrst canister
670 aeilnrst
8 entrails
7 aliners alister anestri anilest antlers antsier elastin entrail lati
+ner
6 airest aliner altern alters aniler antler antres ariels arisen arist
+e arline
5 aesir airns airts aisle aisne alert alien aline alist alsen alter an
+ile anise
4 ains aire airn airt aits alit alts anes anil ansi ante anti ares are
+t 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 past
+ern
6 arisen aspire astern entrap esprit insert instep inters niters nitre
+s paints
5 anise antes antis apter arise aspen aster astir earns inapt inept in
+ert inset
4 airs ante anti ants apes apse ares arts earn ears east eats eras ers
+t 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);
}