所以最初我只是在玩'FizzBuzz'挑战。对于那些可能不知道这个挑战是什么的人,请允许我解释一下。我们的想法是打印出数字1..100
,如果该数字可以被3
整除,则会打印Fizz
而不是3
;如果该数字可被5
整除,则会打印Buzz
;如果数字可被两者整除,则会打印FizzBuzz
。这就是我执行挑战的方式:
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]
任何建议都将不胜感激。
答案 0 :(得分:3)
return super_array
这句话说&#34;停止你正在做的一切并立即返回这个值&#34;
因此,第一次通过数组时,您将获得一个答案...然后点击此结果,然后返回此数组结果,而不继续通过数组的其余部分。
你想要的只是返回新的&#34; super_array&#34;你经历了整个原始数组之后的价值...所以我将它移到了循环之外,例如:
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
答案 1 :(得分:1)
由于提到的@mu太短,这是使用Enumerable
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"]