使用Rubys枚举模块解决Fizzbuzz



嘿,我最近接到了一个失败的任务,我用通常的回答

if ((i%3==0) || (i.to_s.include?('3'))) && ((i%7==0) || (i.to_s.include?('7')))
p 'Fizzbuzz'
elsif (i%3==0) || (i.to_s.include?('3'))
p 'Fizz'
elsif (i%7==0) || (i.to_s.include?('7'))
p 'Buzz'
else
p i
end

当被要求缩短它时,我尝试使用三元运算符:

p (i%3<1 || i.to_s.include?('3')) ? ((i%7<1 || i.to_s.include?('7')) ? "Fizzbuzz" : "Fizz") : ((i%7<1 || i.to_s.include?('7')) ? "Buzz" : i)

但当被要求使用Enumerable方法(选择、拒绝、收集等(解决问题时,我被难住了。。。有人试过这个吗??

select/collect方法被特别提到了,所以我猜他心里有这样的想法(原谅糟糕的代码((1..100(。选择{|i|i%3==0}。收集{"气泡"}但当我尝试对3个条件执行此操作并打印出结果(即迭代输出数组(时,我遇到了困难:\

现在可能没有太大帮助,但我已经制作了一个gem(fizzbuzzard(,它对Fixnum进行了猴子补丁,使所有三的倍数都打印为Fizz,所有五的倍数等等。面试官会尊重你使用现有库的知识,而不是毫无意义地重新解决已解决的问题。

在这里从rubgems获取并在这里找到来源。

我最自豪的部分是什么?测试套件。此处复制输出:

(0h8m|master) [fizzbuzzard] $ rspec
.
Finished in 0 seconds
1 example, FIZZBUZZ failures
def fizzbuzz(i)
  [nil,nil,"Fizz",nil, nil,nil,"Buzz"].each_with_index do |fizz_or_buzz, idx|
    print fizz_or_buzz if (i.to_i % (1+idx)).zero?
  end
end

如果面试官不笑,那么(对我来说(这可能不太合适。

注意,print没有添加换行符(相对于p(

请参阅http://rosettacode.org/wiki/FizzBuzz#Ruby以获得更常见的解决方案。

这个有点密集,但很有趣。它稍微滥用了数组和一些函数方法,以避免使用任何if语句。

rules = {
  3 => ["fizz"],
  7 => ["buzz"]
}
(1..100).map do |n|
  [rules.map do |key, value|
    value[n % key]
  end.compact.join, n.to_s].find do |word|
    !word.empty?
  end
end.join("n")

重复相同的条件句是不干净的。

p case [
  i.%(3).zero? || i.to_s.include?("3"),
  i.%(7).zero? || i.to_s.include?("7")
]
when [true, true] then "Fizzbuzz"
when [true, false] then "Fizz"
when [false, true] then "Buzz"
when [false, false] then i
end

这将返回字符串数组中的结果,此时您可以对它们执行任何操作。

results = (1..100).to_a.collect do |i|
  f = ((i%3).zero? || i.to_s.include?('3'))
  b = ((i%7).zero? || i.to_s.include?('7'))
  "#{:fizz if f}#{:buzz if b}#{i unless f || b}"
end
p results

最新更新