2014-01-20 45 views
1

鉴于以下变量 divisor_array,低,高限定的方法,其通常碳酸红宝石

  1. 打印的所有数值由低到高
  2. 如果正在打印的任何数量是通过在divisor_array任何除数数整除,打印数字+单词“fizzy”
  3. 如果打印的号码可被数组中的所有数字整除,则应输出数字“reallyfizzy”。

测试值: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尺寸变化。

+3

你为什么要检查对而不是仅仅是一个值? –

+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

这是一点点修改的答案。它使用方法中的一个退出点,我发现它更具可读性和可靠性(如果性能受到关注,可以进行优化)。

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