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";
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.
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
In reply to Re: Is there a better way?
by tachyon
in thread Is there a better way for finding anagrams?
by perl_wizard2
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |