#! /usr/bin/perl -w use strict; my $dict=shift @ARGV; unless ($dict && -e $dict && -r $dict) { die "Can't open dictionary file.\n" } chomp (my $template=<>); my @possible; my $l=length($template); open DICT,"<$dict"; while () { chomp; if (length($_) == $l && /^[- 'a-z]+$/i) { push @possible,lc($_); } } my @letters=('a'..'z'); my %state=map {$_ => 0} @letters; my $guess='e'; print "$guess\n"; while (<>) { chomp; $state{$guess}=1; my $result=$_; if (/!$/) { last; } my $out=join '',(grep {$state{$_}==1} @letters); (my $template=$result) =~ s/_/[^$out]/g; @possible=grep /^$template$/, @possible; if (scalar @possible == 1) { warn "I know the word is \"$possible[0]\".\n"; } my %k; my $n=-1; while (1) { $n=index($result,'_',$n+1); if ($n != -1) { map {$k{substr($_,$n,1)}++} @possible; } else { last; } } $guess=[sort {$k{$b} <=> $k{$a}} keys %k]->[0]; print "$guess\n"; }