2015-05-18 2 views
1

Так что изначально я просто играю с вызовом ole 'FizzBuzz'. Для тех, кто может не знать о том, что это за вызов, позвольте мне объяснить. Идея состоит в том, чтобы распечатать цифры 1..100, если число делится на 3, оно печатает Fizz вместо 3; если число делится на 5, оно печатает Buzz; И если число делится на оба, оно печатает FizzBuzz. Вот как я выполнил задачу:Добавление элементов в новый массив Ruby

def super_fizzbuzz(array) 
    array.each do |element| 
    if element % 15 == 0 
     puts 'FizzBuzz' 
    elsif element % 5 == 0 
     puts 'Buzz' 
    elsif element % 3 == 0 
     puts "Fizz" 
    else 
     puts element 
    end 
    end 
end 

Это будет работать по назначению. Я пытаюсь сделать так, чтобы пользователь мог помещать в массив целых чисел super_fizzbuzz([3,10,15,19]) И вернуть массив с соответствующим словом, заменяющим число: [Fizz, Buzz, FizzBuzz, 19]. Однако я не могу это сделать. Я попытался ниже следующее, но это только добавляет первый ответ на массив ..

super_array = [] 
array.each do |element| 
    if element % 15 == 0 
    super_array[element] << 'FizzBuzz' 
    elsif element % 5 == 0 
    super_array << 'Buzz' 
    elsif element % 3 == 0 
    super_array << "Fizz" 
    else 
    super_array << element 
    end 

    return super_array 
end 

Мой мыслительный процесс был создать новый массив, и если элемент был делится на один или оба из числа его поместил бы его в новый массив, и если бы это было не так, просто поместил бы элемент в массив. Что происходит, когда я запускаю его, но это то, что он просто вернет массив с Fizz. Если я запустил первый код и поместил числа в массив, он вернется:

Fizz 
Buzz 
FizzBuzz 
19 
[3, 10, 15, 19] 

Любые предложения были бы весьма полезными.

ответ

3

return super_array

это утверждение говорит «остановить все, что вы делаете, и возвращает это значение прямо сейчас»

Поэтому первый раз через массив, вы получите один ответ ... а затем ударил этот результат , а затем вернуть этот результат массива без продолжения остальной части массива.

вероятно, что вы хотите, чтобы вернуть только новый «super_array» значение после того, как вы прошли через весь исходный массив ... так что я бы переместить его в непосредственной близости от контура, например:

super_array = [] 
array.each do |element| 
    if element % 15 == 0 
    super_array[element] << 'FizzBuzz' 
    elsif element % 5 == 0 
    super_array << 'Buzz' 
    elsif element % 3 == 0 
    super_array << "Fizz" 
    else 
    super_array << element 
    end 
end 
return super_array # only return once through the whole array 
+0

я вижу. Я удалил 'return super_array'. На данный момент программа просто возвращает тот самый массив, который я вставлял. '[3,10,15,19]'. Тем не менее, работая над этим, хорошо поймите! – Nappstir

+1

Удивительный! Просто обновил и применил то, что вы сказали, это сработало отлично! Благодарю за ваш ответ. – Nappstir

+0

Посмотрите мое обновленное предложение - вам нужно вернуть super_array - сразу после цикла - haha ​​- SNAP, мы оба печатаем одновременно;) –

1

Как @mu слишком коротка уже упоминалось, это простой случай использования Enumerable «s map метод:

nums = [3, 15, 29, 42, 18, 63, 10] 

def to_fizzbuzz 
    if self % 15 == 0 
    "FizzBuzz" 
    elsif self % 5 == 0 
    "Buzz" 
    elsif self % 3 == 0 
    "Fizz" 
    else 
    self 
    end 
end 

nums.map(&:to_fizzbuzz) #=> ["Fizz", "FizzBuzz", 29, "Fizz", "Fizz", "Buzz"] 
Смежные вопросы