#!/usr/bin/perl use warnings; use strict; use 5.010; use File::Slurp; use List::Util qw(max); chomp(my @words = read_file '/usr/share/dict/words'); @words = map { lc } @words; @words = grep /^[a-z]+$/, @words; say scalar(@words), ' words to search'; my @letters = map { chr } ord('a') .. ord('z'); sub extract { my ($word, @pos) = @_; my @w = split //, $word; --$_ foreach @pos; my $s = join '', @w[@pos]; die if length $s ne scalar(@pos); die $s if $s =~ tr/a-z//c; return $s; } while (1) { my @pos; GET: say 'enter two letter positions asked for'; my $got = <>; if ($got =~ /^\s*(\d+)\s+(\d+)\s*$/) { @pos = ($1, $2); } else { say 'bad reply'; goto GET; } my $length_required = max @pos; my $old_num_words = scalar @words; @words = grep { length >= $length_required } @words; my $num_eliminated = $old_num_words - scalar(@words); say "$num_eliminated words eliminated for being shorter than $length_required" if $num_eliminated; die 'no words left!' if not @words; my %pop; foreach (@words) { ++$pop{extract $_, @pos}; } my ($best_extract, $best_score) = (undef, 0); foreach my $extract (keys %pop) { my $score = $pop{$extract}; if ($score > $best_score) { $best_extract = $extract; $best_score = $score; } } die if not defined $best_extract; say "try entering $best_extract"; say "assume that didn't work..."; @words = grep { extract($_, @pos) ne $best_extract } @words; say scalar(@words), ' words remaining'; }