Created
September 28, 2012 00:35
-
-
Save lachlan/3797288 to your computer and use it in GitHub Desktop.
Find all the anagrams in a dictionary file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var fs = require('fs'), | |
| filename = 'words.txt', | |
| encoding = 'utf-8'; | |
| fs.readFile(filename, encoding, function(err, data) { | |
| if (err) throw err; | |
| var lines = data.split('\n'); | |
| // trim whitespace, and convert to lower case | |
| for (var i = 0; i < lines.length; i++) { | |
| lines[i] = lines[i].trim().toLowerCase(); | |
| } | |
| // remove all duplicate lines | |
| lines = lines.filter(function(item, index, array) { | |
| return index == array.indexOf(item); | |
| }); | |
| // for each word sort the characters alphabetically to create | |
| // a hash key (all anagrams will generate the same key!) | |
| // and then append this word to the list of all other words | |
| // with the same key | |
| var words = {}; | |
| for (var i = 0; i < lines.length; i++) { | |
| var word = lines[i]; | |
| if (word !== '') { | |
| // generate an anagram key by sorting all characters alphabetically | |
| var key = word.split('').sort().join(''); | |
| // get the list of anagrams that match this word from the hash table | |
| var list = words[key] || []; | |
| // add this word to the other anagrams with this key | |
| list.push(word); | |
| // assign the list back to the anagram hash table | |
| words[key] = list; | |
| } | |
| } | |
| // create a list of anagrams from the hash table, exclude words with no anagrams | |
| var anagrams = []; | |
| for (var key in words) { | |
| if (words.hasOwnProperty(key)) { | |
| if (words[key].length > 1) anagrams.push(words[key]); | |
| } | |
| } | |
| // sort the list by the number of anagrams descending | |
| anagrams.sort(function(a, b) { | |
| return (b.length - a.length); | |
| }); | |
| // print results | |
| console.log("# anagrams found: " + anagrams.length); | |
| console.log(anagrams.join("\n")); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment