Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

(Golf) Anagram Finder

by tadman (Prior)
on Aug 04, 2001 at 09:24 UTC ( #102214=perlmeditation: print w/ replies, xml ) Need Help??

Since people were really starting to take an interest in the anagram problem posed at Is there a better way for finding anagrams?, why not golf it?

The idea is to write a function which given a jumbled word, will find any matching entries in a supplied dictionary, and return an array of these qualifying matches. The word, and dictionary, are only expected to contain alphanumeric characters, although the dictionary may contain some stray material such as the odd bit of punctuation which can probably be ignored.

Here's my first pass that comes in just under three digits at 98 characters:
sub a { sub z{join'',sort/./g}push(@{$d{&z}},$_)for(@{$_[1]});$w=z$_=$_[0];map +{@{$d{$_}}}grep{/$w/i}keys%d } # Test Stub open ($dict, "/usr/dict/words") || die "No words\n"; @dict = grep { chomp; } <$dict>; close ($dict); print a('geniretat',\@dict);

Comment on (Golf) Anagram Finder
Download Code
Re: (Golf) Anagram Finder
by Masem (Monsignor) on Aug 04, 2001 at 10:10 UTC

      I like this method but why do you think this works (also 59):

      @dict = qw (foo oof fff bar baz); $letters = 'ofo'; print anagram($letters, \@dict); sub anagram { grep{(join'',sort split//,$_[0])eq join'',sort/./g}@{pop()} }

      But this does not

      grep{(join'',sort split//,$_[0])eq join'',sort/./g}@{pop}

      Why do you need the parens to make pop() work?

      cheers

      tachyon

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

        @{pop} doesn't work as you intended, because it refers to the plain old array @pop. The parentheses in @{pop()} make it into an expression, which is evaluated.

        However, you could save a character by using a plus instead, as in @{+pop}.

        Update: But, if you wanted to save even more characters... :)

        sub anagram { grep"@{[sort$_[0]=~/./g]}"eq"@{[sort/./g]}",@{+pop} }
        51 characters.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlmeditation [id://102214]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (7)
As of 2014-09-01 20:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (17 votes), past polls