Как продвинуть несколько Перечислителей, или "Но как насчет FizzBuzzBoozz?" - PullRequest
2 голосов
/ 12 ноября 2010

Это довольно неортодоксальный способ выполнить классическое упражнение FizzBuzz , но это просто для иллюстрации проблемы (и, эй, это может быть быстро, если вы захотите fizzbuzz до миллиарда).

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 => 'Fizz', 5 => 'Buzz', 7 => 'Boozz'}?

1 Ответ

3 голосов
/ 12 ноября 2010

Создайте массив Fizzers, Buzzers и Boozzers. Затем в цикле вызовите next для каждого нижнего колонтитула в этом массиве и затем суммируйте результаты с 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
...