Skip to content

Instantly share code, notes, and snippets.

@melborne
Created December 4, 2011 04:44
Show Gist options
  • Select an option

  • Save melborne/1429196 to your computer and use it in GitHub Desktop.

Select an option

Save melborne/1429196 to your computer and use it in GitHub Desktop.
def signature(word)
word.downcase.chars.sort.join.intern
end
def build_anagrams(words)
words.map { |word| [signature(word), word] }
.inject({}) { |h, (sign, word)| h[sign] ||= []; h[sign] << word; h }
.select { |sign, words| words.size > 1 }
end
def find_anagrams(word)
sign = signature(word)
res = Anagrams[sign]
res ? res - [word] : []
end
def build_wordlist(path)
File.open(path) do |f|
f.map { |line| line.chomp.downcase }.uniq.reject { |word| word.size < 2 }
end
end
WORDS = build_wordlist('/usr/share/dict/words')
Anagrams = build_anagrams(WORDS)
find_anagrams("name") # => ["amen", "enam", "mane", "mean", "nema"]
find_anagrams("tower") # => ["rowet", "wrote"]
find_anagrams("tester") # => ["retest", "setter", "street"]
find_anagrams("sister") # => ["resist", "restis"]
find_anagrams("friend") # => ["finder", "redfin", "refind"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment