嘿,我最近得到了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方法(选择,拒绝,收集等)解决它时,我很难过......任何身体都试过这个?
选择/收集方法是特别提到的,所以我猜他有这样的想法(原谅蹩脚的代码) (1..100)。选择{| i | i%3 == 0} .collect {“fizz”} 但是当我尝试为3个条件执行此操作并打印出结果(即迭代输出数组)时我陷入困境:\
答案 0 :(得分: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/FizzBuzz#Ruby。
答案 1 :(得分: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")
答案 2 :(得分:1)
现在可能没多大帮助,但是我已经制作了一个宝石(fizzbuzzard)猴子补丁Fixnum
,所有三个倍数打印为Fizz
,所有倍数为5等等。访谈员将尊重您使用现有图书馆的知识,而不是毫无意义地重新解决已解决的问题。
我最骄傲的部分?测试套件。输出转载于此:
(0h8m|master) [fizzbuzzard] $ rspec
.
Finished in 0 seconds
1 example, FIZZBUZZ failures
答案 3 :(得分: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
答案 4 :(得分: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