2010-11-11 20 views
2

這是一個相當非正統的方式來做經典的FizzBuzz exercise,但它只是爲了說明問題(嘿,如果你想要十億美元,它可能會很快)。如何推進多個統計員,或者「但是FizzBu​​zzBoozz呢?」

fizzer = (Array.new(2, '') << 'Fizz').cycle 
buzzer = (Array.new(4, '') << 'Buzz').cycle 

(1..100).each do |number| 
    fizzbuzz = fizzer.next + buzzer.next # this line is giving me problems. 
    puts (fizzbuzz.empty? ? number : fizzbuzz) 
end 

如何概括這個代碼接受像{3 => '嘶嘶聲',5 => '巴茲',7 => 'Boozz'}的散列?

回答

3

創建一系列Fizzers,Buzzers和Boozzers。然後,在循環調用next對陣列中的每個fooer,然後用inject總結的結果:

# The sort is needed so it prints fizzbuzz, not buzzfizz 
# (hashes being unordered and all) 
fooers = the_hash.sort_by {|k,v| k}.map do |k,v| 
    (Array.new(k - 1, '') << v).cycle 
end 

(1..100).each do |number| 
    fizzbuzz = fooers.map(&:next).inject(:+) 
    puts (fizzbuzz.empty? ? number : fizzbuzz) 
end 
+0

阿。 .map.inject,我無法弄清楚。 Sideline,爲什麼#map需要一個&符號並且#inject可以不用? – steenslag 2010-11-12 23:54:41

+2

@steenslag:'inject'是專門編寫的,所以它可以採用塊或符號參數。 'map'只能佔用一個塊,所以你需要'&'將這個符號轉換成一個塊(通過'Symbol#to_proc')。爲什麼'inject'是寫的,所以它可以帶一個符號,'map'不是,我不知道,但是我懷疑它和之前被認爲特別慢的'inject'有關,而使用符號代替的塊顯着加速。 – sepp2k 2010-11-13 13:18:56