[rochester-pm-list] Jumble solver
Bob Walton
bwalton at rochester.rr.com
Mon Jan 10 22:09:56 CST 2000
Shawn, the problem is in your sub superfind: You modify the global
@words in it. The modification mechanism is: You iterate over @words
with $word being a reference to each entry of @words in turn. When you
modify $word, you modify @words, since $word is a reference to an
element of @words. One fix is shown in your code below, involving just
assigning a temporary variable to hold $word during the modifications.
The word "wet" is found with that modification.
Shawn Porter wrote:
>
> I'm writing a little script to solve two word Jumbles and I'm having a
> strange problem that I can't track down. Here is what I get when testing
> this script:
>
> --
> % echo; ./jumble; echo; ./jumble 1
>
> finding: twtowlee, 5
> found: towel
> 1: towel twe
> finding: twe, 3
> found: wet
> 2: wet
> towel wet
>
> finding: noiiontwsep, 8
> found: opinions
> found: position
> 1: position nwe
> finding: nwe, 3
> found: new
> 2: new
> position new
> 1: opinions twe
> finding: twe, 3
>
> --
> With the second set of letters it fails to find the word 'wet' when
> searching for a 3 letter word with the letters 'twe' but with the first
> set of letters it works fine. I can't figure out the problem. Any ideas?
>
> The entire source is below... sorry for the complete lack of comments, I
> whipped this out in like 10 minutes then racked my brain for about 20
> trying to figure out this problem.... I'm stumped.
>
> --
> Shawn Porter
> http://www.rit.net/sporter
> sporter at rit.net
>
> --
> #!/usr/bin/perl
> if($ARGV[0] == 1)
> {
> $letters = "noiiontwsep";
> @groups = (3, 8);
> }
> else
> {
> $letters = "twtowlee";
> @groups = (3, 5);
> }
>
> @groups = reverse sort(@groups);
>
> open(WORDS, "/usr/dict/words");
> while(<WORDS>)
> {
> chomp;
> push(@words, $_);
> }
> close(WORDS);
>
> my $hashref = superfind($letters, $groups[0]);
> my %found = %$hashref;
>
> foreach my $word (keys %found)
> {
> print "1: " . $word . " " . $found{$word} . "\n";
>
> my $hashref2 = superfind($found{$word}, $groups[1]);
> my %found2 = %$hashref2;
>
> foreach my $secondword (keys %found2)
> {
> print "2: " . $secondword . "\n";
> if($found{$secondword} eq '')
> {
> print $word . " " . $secondword . "\n";
> }
> }
> }
>
> sub superfind
> {
> my $letters = shift;
> my $length = shift;
>
> print "finding: $letters, $length\n";
>
> my %found;
> my @letters;
> until($letters eq '')
> {
> push(@letters, chop($letters));
> }
>
> foreach my $word (@words)
> {
> next unless(length($word) == $length);
>
> my $orig = $word;
my $tword = $word;
> my @used;
> my @unused;
> my @possible = @letters;
>
> while (@possible)
> {
> my $l = pop(@possible);
> if($tword =~ /$l/)
> {
> $tword =~ s/$l//;
> push(@used, $l);
> }
> else
> {
> push(@unused, $l);
> }
> }
>
> if(scalar(@used) == $length)
> {
> print "found: $orig\n";
> my $unused;
> foreach(@unused)
> {
> $unused .= $_;
> }
> $found{$orig} = $unused;
> }
> }
>
> return(\%found);
> }
More information about the Rochester-pm
mailing list