my (@candidate, %freq); while () { chomp; my @list = split ' '; push @candidate, \@list; for my $word (@list) { ++$freq{$#candidate}{$_} for split //, $word; } } for my $idx (keys %freq) { my $tot = sum(values %{$freq{$idx}}); for my $let (keys %{$freq{$idx}}) { $freq{$idx}{$let} = ($freq{$idx}{$let} / $tot) * 100; } } for my $let ('a' .. 'z') { my $val = 0; for my $idx (0 .. $#candidate) { $val += $freq{$idx}{$let} if $freq{$idx}{$let}; } $freq{$let} = $val; } 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 $best = sum(map {my $n = $let{$_}; ($n * $n + $n) / 2} keys %let); print "$best : [ @solution ]\n";