一般是泡沫红宝石

时间:2014-01-20 15:57:41

标签: ruby algorithm fizzbuzz

给出以下变量 divisor_array,low,high定义一个

的方法
  1. 从低到高打印所有数字
  2. 如果正在打印的任何数字可被divisor_array中的任何除数编号整除,请打印数字+“fizzy”一词
  3. 如果正在打印的数字可被数组中的所有数字整除,则应输出数字+“reallyfizzy”。
  4. 测试值: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尺寸变化的工作替代方案。

2 个答案:

答案 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