in reply to Is there a better way for finding anagrams?

Here is a shorter way using the power of grep. All we do is sort our available letters and compare them to the sorted letters of our dictionary words.

@dict = qw (foo oof fff bar baz); $letters = 'ofo'; $sorted = join '', sort split//, $letters; @words = grep{ $sorted eq join '', sort split// }@dict; print "@words";

Update

As pointed out by dragonchild my first post which used this test in the grep /^[$letters]{$length}$/ instead of the $sorted test would pick up all sorts of incorrect stuff. I realised this just after I posted but it was too late.... ++ for being far more on the ball than me.

Update 2

For efficiency you could add another test to the grep like this:

@dict = qw (foo oof fff bar baz); $letters = 'ofo'; $sorted = join '', sort split//, $letters; $length = length $letters; @words = grep{ $length == length and $sorted eq join '', sort split// }@dict; print "@words";

The purpose of the $length test is to immediately fail if the length of our dict word is wrong thus avoiding the overhead of a sort as the match is bound to fail. Fixed classic = instead of == newbie Perl error thanks to Falkkin

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Replies are listed 'Best First'.
Re: Re: Is there a better way?
by dragonchild (Archbishop) on Aug 04, 2001 at 00:49 UTC
    That doesn't quite do it. You pick up 'ffo' as well. What is needed is a way of saying "Give me all the words with 2 o's and 1 f."

    ------
    /me wants to be the brightest bulb in the chandelier!

      Realised that just after I posted and added a fix, hoping no one would notice - damn caught out ! :-)

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print