Frage

Dies ist eine eher unorthodoxe Art und Weise der klassischen FizzBuzz Übung zu tun , aber es ist nur das Problem zu veranschaulichen (und hey, es könnte schnell sein, wenn Sie auf eine Milliarde zu fizzbuzz wollen).

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

Wie dieser Code verallgemeinern einen Hash wie zu akzeptieren {3 => 'Fizz', 5 => 'Buzz', 7 => 'Boozz'}?

War es hilfreich?

Lösung

Erstellen Sie ein Array von Einseifen, Buzzers und Boozzers. Dann in der Schleife Anruf next auf jeder fooer in diesem Array und dann die Ergebnisse mit inject Summe:

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top