Perl, 14121461 bytes, score=1393score=1412, totalerr=21092totalerr=21050
$|++;
while(!eof) {
$l = $pg = '';
%d = "[eaitrnoslcdupmhygfbvwkxjqz]<[scpardetmfbilwhognuvjkyqz]a[tlrncsidbpgmyuvkfwxzhoj]b[leoairusytjvmb]c[oetahiulrkcysq]d[eiaourlyvdgsmfwjnhqt]e[rnaslcdtmxevpfgqiwyobhkzju]f[ieoauflrty]g[erhiaunolygsmtdb]h[eaoituyrnldmbcw]i[notsclvdagrmefbpzxkuq]j[uoea]k[einaslywftogd]l[eyialoutdfvskcmpbwnr]m[eaipombuysnftl]n[tgedcsaionvufkylmhjqwxp]o[nrumlstwpocvdgfbaikyexjh]p[reoaliptuhsymdbfw]q[u]r[eaiotymdsruncgvklpbfwh]s[teisuhpoacmlykwfqndbr]t[iearhoyultcmwnsfbpg]u[rnstliceampbgdfyok]v[eiaoyu]w[aiehonrlsdtkfy]x[pctiaehuy]y[esomatpcwbildgrn]z[eoaiy]"
=~ /(.?)\[(.*?)\]/g;
%r = ">[etynrldgshmkpcwfoabxui]a[retclmnphisfvwbudgoxykjz]b[aiumoerylbhgspt]c[ienaouscrxtlyh]d[neairoludhsywgpk]e[rtldsvcmnphgefibkuwyzjox]f[eifnoalrustdmkwp]g[niaeroudgykt]h[tcsgwpenrxado]i[trsldnacmfhvpugwbekoxyz]j[nbdeao]k[carnosilewu]l[aeliobpuctfsrdgnwhkym]m[oeiarumstdynlghbp]n[oieaurngwkhtmsldy]o[icrplthmsfnobdwvgejyuzak]p[msaoepuixrlynt]q[eisncd]r[eaotpuigcrbdfhwlys]s[iesaunorbydclptmkgw]t[ansicreuolthpfxbygkwmd]u[ostcqlrfdbpagnmjhixev]v[ieoanrdlb]w[oaesrtydnlkph]x[eiaon]y[ltradcnsheomfbgpkuvzxw]z[iae]"
=~ /(.?)\[(.*?)\]/g;
while (<>) {
chomp; last if !/_/ or /^END$/;
$l++ unless /$pg/;
last if $l>5;
s/$pg//g for values %d;%d, values %r;
$_ = "<$_>";
my %s;
while (/([^_]?)_/g) {
$x = $d{$1} || $d{''};
$s = 26;180;
for (split //, ($d{$1}||$d{''})$x ){ $s{$_} += $s; $s- -= 100 / length $x }
}
while (/_([^_])/g) {
$x = $r{$1} || $d{''};
$s = 26;180;
for (split //, ($r{$1}||$d{''})$x ) { $s{$_} += $s; $s- -= 100 / length $x }
}
($pg) = sort { $s{$b} <=> $s{$a} } a..z;
print $pg, $/
}
}
(Note, it's 14121461 bytes after removing quite a bit of optional whitespace. As printed, it's a hundred or so heavier, but still well under 2000.)
For every unknown position in the word, it looks at the preceding character, gives each possible following character a score, starting at 26180 for the top-ranked, and decreasing by one asto 80 at the rank goes down;end of the list; then the same thing is done for the following character. All the scores for all characters are added up, and the one with the highest score is selected.
After a letter is guessed, it's removed directly from the ranking tables, so it can't be guessed again (until we start a new word and re-initialize the tables).
Update: gained a bunch of points by fixing a bug (we weren't removing letters from the reverse table) and changing the way the points drop off as we go down the list.