嘿,我最近接到了一个失败的任务,我用通常的回答
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