【问题标题】:Generally Fizzy ruby一般起泡红宝石
【发布时间】:2014-01-20 15:57:41
【问题描述】:

给定以下变量 divisor_array, low, high 定义了一个方法,

  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 大小变化的可行替代方案。

【问题讨论】:

  • 你为什么要检查对而不是一一检查值?
  • 家庭作业还是教程?

标签: ruby algorithm fizzbuzz


【解决方案1】:

只需计算数组中有多少除数将除以该值。我们关心三种情况:

  • 全部
  • 至少其中之一
  • 没有。
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

【讨论】:

    【解决方案2】:

    这是一个稍微修改的答案。它使用方法的一个退出点,我发现它更具可读性和健壮性(如果性能是一个问题,可以优化)。

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多