#!/usr/bin/perl use strict; use warnings; use List::Util qw(sum); use Data::Dumper; my $MAXLEN = 8; my @data; my $words_processed = 0; while (<>) { s/[%\s]+//g; my $len = length; next unless 1 <= $len && $len <= $MAXLEN; ++$words_processed; my @a = sort split //, lc; my $w = join "", @a; ++$data[$len - 1]{$w}{count}; $data[$len - 1]{$w}{contrib}{$w} = 1; $data[$len - 1]{$w}{alphas} ||= \@a; } print "Done processing dict ($words_processed words). Candidate counts, by number of letters:\n"; print Dumper [map { $_ ? scalar(keys %$_) : 0 } @data]; for my $c (1 .. $MAXLEN - 1) { my $data1 = $data[$c - 1]; my $data2 = $data[$c]; next unless $data1 && $data2; for my $v1 (values %$data1) { for my $extra ("a" .. "z") { my $new = join "", sort(@{ $v1->{alphas} }, $extra); if ($data2->{$new}) { $data2->{$new}{contrib}{$_} = 1 for keys %{ $v1->{contrib} }; } } } } my $data_max = $data[$MAXLEN - 1]; for my $v (values %$data_max) { $v->{total} = sum(map $data[length($_) - 1]{$_}{count}, keys %{ $v->{contrib} }); } print "\nDone computation. Result (most words at bottom):\n"; for my $w (sort { $data_max->{$a}{total} <=> $data_max->{$b}{total} } keys %$data_max) { print "$w : $data_max->{$w}{total}\n"; }