给出以下变量 divisor_array,low,high定义一个
的方法divisor_array
中的任何除数编号整除,请打印数字+“fizzy”一词测试值:generally_fizzy([2,3],1,7)
我最初的解决方案:
def generally_fizzy(divisor_array, low, high)
divisors = Hash[*divisor_array]
low.upto(high) do |i|
divisors.each_pair do |k,v|
if((i % k == 0) && (i % v == 0))
puts "#{i} reallyfizzy"
elsif ((i % k == 0) || (i % v == 0))
puts "#{i} fizzy"
else
puts i
end
end
end
end
此解决方案通过了给定的测试,但是当divisor_array
大小从2个值增加到3个时,它会打印出重复项。除此之外,代码不是很优雅。
寻找可以处理divisor_array
尺寸变化的工作替代方案。
答案 0 :(得分:5)
计算数组中有多少除数将除以该值。我们关心的案例有三种:
def fizzy(divisors, lo, hi)
lo.upto(hi) do |value|
puts case divisors.count{ |div| value % div == 0 }
when divisors.length # all divisors
"#{value} really fizzy"
when 0 # no divisors
value
else # at least one divisor
"#{value} fizzy"
end
end
end
答案 1 :(得分:1)
这是一个有点修改的答案。它使用方法中的一个退出点,我发现它更具可读性和健壮性(如果考虑性能,可以进行优化)。
def fizzy(divisors, low, high)
low.upto(high) do |value|
print "#{value} "
print "really" unless divisors.detect{ |div| value % div != 0}
print "fizzy" if divisors.detect{ |div| value % div == 0}
print "\n"
end
end
fizzy([2,3],1,7) #=>
1
2 fizzy
3 fizzy
4 fizzy
5
6 reallyfizzy
7