#! perl -slw use strict; use Time::HiRes qw[ time ]; sub uniq{ my %x; @x{@_} = (); keys %x } my $start = time; my @lookup = map{ my $bits = pack 'C', $_; [ grep vec( $bits, $_, 1 ), 0 .. 7 ] } 0 .. 255; my %dict; while( <> ) { chomp; next if length > 8; my $r = \%dict; $r = $r->{ $_ } //= {} for sort split '', $_; push @{ $r->{_} }, $_; } my %stats; sub X { my( $first, $soFar, $tree ) = @_; if( @$soFar == 8 ) { my @words = uniq map { my $r = \%dict; $r = $r->{ $_ } for @{ $soFar }[ @{ $lookup[ $_ ] } ]; exists $r->{_} ? @{ $r->{_} } : (); } 0 .. 255; $stats{ join '', @$soFar } = \@words; return; } for( $first .. 'z' ) { next unless exists $tree->{ $_ }; X( $_, [ @$soFar, $_ ], $tree->{ $_ } ); } return; } X( 'a', [], \%dict ); print time - $start; ; printf "[%d] %s : @{[ @{$stats{ $_ }} ]}\n", scalar @{$stats{$_}}, $_ for sort{ @{ $stats{ $b } } <=> @{ $stats{ $a } } } keys %stats; __END__ [ 7:09:30.87] C:\test>1056884-calc 2of12inf.txt 10.4807748794556 [346] aeinprst : nape tars pets ape panties taper inept nastier print airs spinet sniper pane rants pint peat spear terns tears trains reps earn tines paints napes ate strep rest repaint ti inapt rinse ripest astir priest neat part nets pans retina apes tarps reaps nip rain tern res sip sprint instep sear inters in prints ires erst parent snip re astern satire praise stein pirates pirate pertains tan tar pie par tis nite ant apter pa ants rites ranis rite eta as pastier rents nit ties pastern rate sapient strip pants pits apt pent snipe niters ran pate tsar stain pints panier spirea rapines tapers repast irate pars span pairs tens raps ripen stair tarn tans retsina tin rips pies inert eats reins ear esprit aster rapes pin tarsi sera neaps rani step rein resin inter piastre stria painters sprain neap tripes tires raise tier en stern parents pas ares sari pert satin sine nitres ripens tape prates striae retain arts pet ani sat tare pertain insert reap pit prate pea trap antsier pantie sterna tries rasp east pen spit sit arise naps tire tea pares pat snare stir spar pine rap tares is pan rant earns pant art it painter sate pear tips pens rep pitas tarp penis aspen antis teas nips tap aspire piaster traps past pier era ears asp sane star seat entrap rip snit siren sin nae pins spare tapes stare niter spate sitar rent prise taps anti trip trips tins spire ens tarns spent traipse antes tripe rise tapir tip pest peas nest sent its sir pries retains anise rat pates pare rats train saner pita eat nitre spat parse tapirs tiers ten risen nears sap spite set stripe sprite paniers sire strap tie sea septa pis site psi eras repaints an pain paste ripe ire net entraps nits pair apse pains rates rapt per saint near paint rains spin strain etas snap pines rapist rape are rapine sepia pantries spine peats tear at parties pi ante sprat retinas inset spa arisen ins parts nites tine piers panes pats nap pears air [344] aeilprst : liars tars platies pets ape taper lairs airs lire liter ails peat spear plies palest tears lets lest reps ate strep rest lips leis slate ti ripest astir lie priest seal part apes tarps piles reaps trial plate res sip paler litres sear retail ires erst rails salt plates re satire praise pirates pirate lea liras tar pie retails pleas par pleats tis apter pa realist pelt rites peril alters rite relit stale eta earls as litre pastier lies trails ties rate strip pits apt petal pate list tsar spirea tapers petals repast irate pars plea pairs pleat stapler raps stair saltier lit pales tali alert rips spilt pies eats laser ear peal slit esprit aster rapes tarsi sera ales slip alit spelt step alter piastre silt stria tripes tires raise liar tier leapt tiler teals pas ares sari sale pert tape prates pal striae riles sail alp plats arts pet plait sat tare reap pit late pails steal prate least pea tiles trap tries slier rasp sepal pastel east spit sit arise alps tire tea pares pat rial stir spar laps later rap tares is la rials ilea leas staler alerts art it last sate ale aisle pear tips leaps rep pitas tarp trail lept tile stile teas tap aspire piaster teal traps past tail pier split era ears asp star seat pile rip spare rile tapes stare spate sitar pelts triples las prise islet lisper lepta taps plaster staple trip pail spiel lair pilaster trips slat pearl spire lip traipse tripe rise tapir lei pale tip slept pest peas tilers its sir lite pries rat pearls serial rail pates pare rats lapse tails pita eat slap spat pals parse plaits tapirs lisp tiers lap pliers salter tales sap spite set real ail stripe sprite sire strap splat tie sea septa pis site psi eras plat paste ripe ire let pair apse leap rates rapt per triple etas perils rapist rape liters lira are trials spiral sepia peats tear at parties pi earl peals sprat spa isle parts tale piers pats pears air ...