我经常发现自己正在检查多种情况。如何减少用于达到相同效果的线数?
def super_fizzbuzz(array)
final = []
for num in array
if num % 15 == 0
final << 'FizzBuzz'
elsif num % 5 == 0
final << 'Buzz'
elsif num % 3 == 0
final << 'Fizz'
else
final << num
end
end
final
end
答案 0 :(得分:2)
def super_fizzbuzz(array)
array.map do |num|
a = []
a << 'Fizz' if num % 3 == 0
a << 'Buzz' if num % 5 == 0
a.empty? ? num : a.join()
end
end
答案 1 :(得分:1)
def super_fizzbuzz(array)
final = []
array.each do |num|
num % 15 == 0 ? final << 'FizzBuzz' : num % 5 == 0 ? final << 'Buzz' : num % 3 == 0 ? final << 'Fizz' : final << num
end
final
end
但你的方式更具可读性。
答案 2 :(得分:1)
def super_fizzbuzz(array)
array.map do |num|
case 0
when num % 15 then "FizzBuzz"
when num % 5 then "Buzz"
when num % 3 then "Fizz"
else num
end
end
end
答案 3 :(得分:1)
这稍微复杂一些,但是将显式编码条件的数量减少到2:
FIZZBUZZ = { 3 => 'Fizz', 5 => 'Buzz' }
def super_fizzbuzz(array)
array.map do |num|
fbs = FIZZBUZZ.select do |divisor,cat|
num % divisor == 0
end.values
fbs.empty? ? num : fbs.join
end
end
编码DRY时总是有危险,你把事情做得太过分了。在这种情况下,只有两个重叠的类别,我认为上面的内容有点笨拙。但是,添加另一个或两个类别:
FIZZBUZZ = { 3 => 'Fizz', 5 => 'Buzz', 7 => 'Boom', 11 => 'Whizz' }
它看起来更聪明。
答案 4 :(得分:1)
引用:
我觉得Fizz-Buzz对于一些程序员来说“很难”,因为(#1)它不适合在学校作业中给予他们的任何模式,而且(#2)它是不可能的直接而简单地代表必要的测试,无需重复,几乎可以用于任何常用的现代编程语言。
来源:c2.com Wiki
答案 5 :(得分:1)
另一种方式:
def super_fizzbuzz(arr)
arr.map do |e|
s = ''
s << 'Fizz' if (e%3).zero?
s << 'Buzz' if (e%5).zero?
s = e if s.empty?
s
end
end
super_fizzbuzz [9, 25, 225, 31]
#=> ["Fizz", "Buzz", "FizzBuzz", 31]