2

嘿,我最近接到了 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).select { |i| i % 3 == 0 }.collect { "fizz" } 但我在尝试针对 3 个条件执行此操作并打印出结果时遇到了困难(即遍历输出数组):\

4

5 回答 5

2

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

从 rubgems 获取它并此处找到源代码。

我最自豪的部分?测试套件。此处转载的输出:

(0h8m|master) [fizzbuzzard] $ rspec
.

Finished in 0 seconds
1 example, FIZZBUZZ failures
于 2013-05-29T01:40:18.320 回答
1

这个有点密集但很有趣。它稍微滥用数组和一些函数方法以避免使用任何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")
于 2013-05-29T00:26:17.373 回答
1
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不添加换行符 (vs p)

有关更常见的解决方案,请参阅http://rosettacode.org/wiki/FizzBu​​zz# Ruby。

于 2013-05-28T23:49:02.190 回答
0

这会将结果返回到字符串数组中,此时您可以对它们做任何您想做的事情。

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
于 2013-05-29T01:51:18.137 回答
0

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

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
于 2013-05-29T01:30:18.123 回答