使用Rubys可枚举模块解决Fizzbuzz?

时间:2013-05-28 23:21:13

标签: ruby fizzbuzz

嘿,我最近得到了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个条件执行此操作并打印出结果(即迭代输出数组)时我陷入困境:\

5 个答案:

答案 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等等。访谈员将尊重您使用现有图书馆的知识,而不是毫无意义地重新解决已解决的问题。

从rubgems here获取并找到源here

我最骄傲的部分?测试套件。输出转载于此:

(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