From: Erik Veenstra Date: 2007-01-28T03:30:21+09:00 Subject: Re: Review of code please Here's a map-reduce-ish [1] solution. I don't say it's better, or faster, or smaller (memory-wise). It's just, uh, different... (Sorry, couldn't resist, again... ;]) gegroet, Erik V. - http://www.erikveen.dds.nl/ [1] http://labs.google.com/papers/mapreduce.html ---------------------------------------------------------------- WITHOUT THE TOTALS File.open("anagrams.txt", "w") do |f| File.readlines("/usr/share/dict/words").collect do |word| word.chomp.downcase end.collect do |word| [word.scan(/./).sort, word] end.inject({}) do |hash, (base, word)| (hash[base] ||= []) << word ; hash end.values.reject do |set| set.length == 1 end.collect do |set| set.sort end.sort_by do |set| [-set.length, set] end.collect do |set| set.join("\t") end.each do |line| f.puts(line) end end ---------------------------------------------------------------- WITH THE TOTALS sets = File.readlines("/usr/share/dict/words").collect do |word| word.chomp.downcase end.collect do |word| [word.scan(/./).sort, word] end.inject({}) do |hash, (base, word)| (hash[base] ||= []) << word ; hash end.values.reject do |set| set.length == 1 end.collect do |set| set.sort end.sort_by do |set| [-set.length, set] end largest = sets[0] longest = sets.inject{|a, b| a[0].length > b[0].length ? a : b} File.open("anagrams.txt", "w") do |f| sets.each do |set| f.puts(set.join("\t")) end end puts "Total: %s" % [sets.length] puts "Largest set of anagrams: %s" % [largest.inspect] puts "Longest anagrams: %s at %s characters each" % [longest.inspect, longest[0].length] ----------------------------------------------------------------