my (@candidate, %freq); while () { chomp; my @list = split ' '; push @candidate, \@list; for my $word (@list) { ++$freq{$_} for split //, $word; } } my $tot = sum(values %freq); $freq{$_} = ($freq{$_} / $tot) * 100 for keys %freq; my (@solution, %let); for my $list (@candidate) { my ($best, $item) = (0, ''); for my $word (@$list) { my $score = sum(map $freq{$_}, split //, $word); ($best, $item) = ($score, $word) if $score > $best; } ++$let{$_} for split //, $item; push @solution, $item; } my $total = sum(map {my $n = $let{$_}; ($n * $n + $n) / 2} keys %let); print "$total : [ @solution ]\n";