Anagrams: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|J}}: shorter solution)
(→‎{{header|Python}}: Anagram not acronym.)
Line 26: Line 26:
>>> len(words)
>>> len(words)
25104
25104
>>> acronym = defaultdict(list) # map sorted chars to acronyms
>>> anagram = defaultdict(list) # map sorted chars to anagrams
>>> for word in words:
>>> for word in words:
acronym[str(sorted(word))].append( word )
anagram[str(sorted(word))].append( word )


>>> count, max_acronyms = max((len(acr), acr) for acr in acronym.itervalues())
>>> count, max_anagrams = max((len(ana), ana) for ana in anagram.itervalues())
>>> for acr in acronym.itervalues():
>>> for ana in anagram.itervalues():
if len(acr) >= count:
if len(ana) >= count:
print acr
print ana



Revision as of 20:55, 25 September 2008

Task
Anagrams
You are encouraged to solve this task according to the task description, using any language you may know.

Two or more words can be composed of the same characters, but in a different order. Using the word list at http://www.puzzlers.org/pub/wordlists/unixdict.txt, find the sets of words that share the same characters that contain the most words in them.

J

   (#~a:~:{:"1)(]/.~/:~&.>)<;._2 toJ fread jpath'~temp\unixdict.txt'
+-----+-----+-----+-----+-----+
|abel |able |bale |bela |elba |
+-----+-----+-----+-----+-----+
|alger|glare|lager|large|regal|
+-----+-----+-----+-----+-----+
|angel|angle|galen|glean|lange|
+-----+-----+-----+-----+-----+
|caret|carte|cater|crate|trace|
+-----+-----+-----+-----+-----+
|elan |lane |lean |lena |neal |
+-----+-----+-----+-----+-----+
|evil |levi |live |veil |vile |
+-----+-----+-----+-----+-----+

Python

Python 2.5 shell input (IDLE) <python>>>> import urllib >>> from collections import defaultdict >>> words = urllib.urlopen('http://www.puzzlers.org/pub/wordlists/unixdict.txt').read().split() >>> len(words) 25104 >>> anagram = defaultdict(list) # map sorted chars to anagrams >>> for word in words: anagram[str(sorted(word))].append( word )


>>> count, max_anagrams = max((len(ana), ana) for ana in anagram.itervalues()) >>> for ana in anagram.itervalues(): if len(ana) >= count: print ana


['caret', 'carte', 'cater', 'crate', 'trace'] ['alger', 'glare', 'lager', 'large', 'regal'] ['evil', 'levi', 'live', 'veil', 'vile'] ['angel', 'angle', 'galen', 'glean', 'lange'] ['elan', 'lane', 'lean', 'lena', 'neal'] ['abel', 'able', 'bale', 'bela', 'elba'] >>> count 5 >>></python>