From: William James Date: 2007-01-28T11:10:14+09:00 Subject: Re: Review of code please On Jan 27, 12:30 pm, "Erik Veenstra" wrote: > 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 Do you know what a one-to-one mapping is? It's senseless to use "collect"; use "map" instead. open( 'anagrams.txt', 'w' ) { |file| IO.readlines( 'words' ).inject({}){ |hash,word| word.strip!.downcase! (hash[word.split(//).sort.join] ||=[]) << word; hash }. values.reject{|list| list.size < 2}. map{|list| list.sort}.sort_by{|list| [ -list.size, list ] }. each{|list| file.puts list.join( "\t" ) } }