brew = "rdadadroxmocpronogomocdmqzx"
alphabet = "abcdefghijklmnopqrstuvwxyz"
word = ""
# create an array for each letter
lettercount = {}
alphabet.split(//).each do |letter|
lettercount[letter] = 0
end
# count the incidence of each letter
brew.split(//).each do |letter|
if (lettercount[letter] += 1) == 3 then
word += letter
lettercount[letter] = 0
end
end
# so every third letter gets printed,
# the outcome is 'droom', which is
# Dutch for 'dream'
print word + "\n"
Refactorings
No refactoring yet !
Adam
December 23, 2008, December 23, 2008 16:37, permalink
class Word < Struct.new(:brew)
def to_s
count = Hash.new(0)
brew.split(//).inject('') do |word,character|
word << character if (count[character] += 1) % 3 == 0
word
end
end
end
puts Word.new('rdadadroxmocpronogomocdmqzx')
redpidgin
December 23, 2008, December 23, 2008 16:44, permalink
thank you very much, works great. how does it work from brew.split? in other word, how do the letters stay in the right order, since they just get counted on line 5
mischamolhoek.myopenid.com
December 23, 2008, December 23, 2008 17:37, permalink
if you like oneliners.... :) (but i would not call this clean)
require 'enumerable'
brew = "rdadadroxmocpronogomocdmqzx"
brew = brew.split(//);
puts brew.sort.uniq.inject({}){|h,n| h[n]= brew.map_with_index{|b,i|i if b==n}.compact; h}.reject{|a,b|b.size < 3}.map{|a,b| b.select{|n| (b.index(n)+1)%3==0}.map{|c| [c,a]} }.sort_by{|n|n[0][0]}.flatten.select{|n| n.is_a?(String)}.join
Adam
December 23, 2008, December 23, 2008 17:57, permalink
@redpidgin - I'm not sure what you mean about the right order? The code does the same thing as your original version.
@mischamolhoek - that breaks when you change the brew.
mischamolhoek.myopenid.com
December 24, 2008, December 24, 2008 08:02, permalink
@adam - your right, it was a joke anyway :).
I like your code so much better, yours is a seriously clean solution. bravo! :)
@redpidgin - lookup how inject works, you'll get it :)
puts Word.new('rdapepa epdemrtrfx,feyefryeemcprt,cn ct, zaaaxdam')
bob
December 26, 2008, December 26, 2008 08:30, permalink
class Word < Struct.new(:brew)
def to_s
count = Hash.new(0)
brew.split(//).select do |character|
(count[character] += 1) % 3 == 0
end.join
end
end
puts Word.new('rdadadroxmocpronogomocdmqzx')
Some code I've written for a challenge, I'm submitting it to learn some refactoring, see how it can be done, so please submit many different solutions!