From: Mark Woodward Date: 2007-01-28T08:25:07+09:00 Subject: Re: Review of code please Hi Erik, On Sun, 28 Jan 2007 03:30:21 +0900, 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 > > ---------------------------------------------------------------- > > 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] > > ---------------------------------------------------------------- wow! now that's going to take some understanding! Thanks for the homework over the next few nights ;-) cheers, -- Mark