在Ruby中使用Fizz Buzz进行傻瓜游戏

时间:2014-02-09 22:35:59

标签: ruby fizzbuzz

剧透警报:我是一个真正的新手。任务中弄清楚fizz的嗡嗡声 ruby for class,虽然我发现了多个版本的代码 解决问题,我的理解是如此简陋,我不能 弄清楚这些例子是如何真正起作用的。

第一个问题(如果你大声笑出来,请参考扰流警报): 如何在Ruby中打印1到100的数字?

第二个问题:可以'if else'用来解决这个问题吗?我失败的代码是 下面(附件有截屏):

puts('Lets play fizzbuzz')
print('enter a number: ')
number = gets()
puts(number)
if number == % 3
  puts ('fizz')
elsif number == % 5
  puts ('buzz')
elsif number == %15
  puts ('fizzbuzz')
end

谢谢,

10 个答案:

答案 0 :(得分:3)

多数民众赞成新手,我们都必须从某个地方开始吧? Ruby非常可爱,因为它让我们一直使用块,所以要数到100,你可以在fixnum上使用几种方法,查看文档以获取更多信息。这是一个可能对您有帮助的例子;

1.upto 100 do |number|
  puts number
end

对于你的第二个问题,也许你可以快速浏览一下我为你掀起的小实现,希望可以帮助你理解这个问题:

 1.upto 100 do |i|
  string = ""

  string += "Fizz" if i % 3 == 0
  string += "Buzz" if i % 5 == 0

  puts "#{i} = #{string}"

end

答案 1 :(得分:2)

第一个问题:这个问题有几个解决方案。例如,

10.times { |i| puts i+1 }

对于真正的新手:https://github.com/bbatsov/ruby-style-guide

答案 2 :(得分:2)

另一种有用的方法:

 puts (1..100).map {|i|
  f = i % 3 == 0 ? 'Fizz' : nil
  b = i % 5 == 0 ? 'Buzz' : nil
  f || b ? "#{ f }#{ b }" : i
    }

答案 3 :(得分:1)

关于失败的代码,您的条件语句应如下所示:

if number % 3 == 0
   puts "Fizz"
end
if number % 5 == 0
   puts "Buzz"
end

您不需要最后一个elsif语句,因为它永远不会被执行 (如果一个数字不能被3整除或被5整除,则肯定不能被15整除) 通过将第二个elsif更改为简单来调整此项,如果数字可以除以5而不是3,那么Fizz将不会输出但是Buzz将会

我只是向您展示如何更正您的代码,但正如其他人所指出的那样,Ruby中有更优雅的解决方案。

答案 4 :(得分:1)

不是最美妙的写作方式,但对初学者和可读性都有好处。

def fizzbuzz(n)
  (1..n).each do |i|
    if i % 3 == 0 && i % 5 == 0
      puts 'fizzbuzz'
    elsif i % 3 == 0
      puts 'fizz'
    elsif i % 5 == 0
      puts 'buzz'
    else
      puts i
    end
  end
end

fizzbuzz(100)

答案 5 :(得分:1)

1.upto(100).each do |x| # Question #1 The 'upto' method here takes is  
                        # what you would use to count in a range.               
  if (x % 3 == 0) && (x % 5 == 0)
    puts " Fizzbuzz"
  elsif x % 3 == 0
    puts " Fizz"
  elsif x % 5 == 0
    puts " Buzz"
  else
    puts x
  end
end

问题#2是的,可以,但我会寻找一种更优雅的方式将其作为定义的一部分来编写,如

def fizzbuzz(last_number)
  1.upto(last_number).each do |x|              
    if (x % 3 == 0) && (x % 5 == 0)
      puts " Fizzbuzz"
    elsif x % 3 == 0
      puts " Fizz"
    elsif x % 5 == 0
      puts " Buzz"
    else
      puts x
    end
  end
end

这是帮助我理解没有使用.each方法创建变量的答案。抱歉我的缩进。还在学习如何使用Stackoverflow文本编辑。

答案 6 :(得分:1)

作为一个班轮

;WITH XmlCte AS 
(
    SELECT 
        LibraryId, 
        RealXmlData = CAST(XmlData AS XML)
    FROM dbo.Library
)
SELECT
    LibraryId,
    Author = XC.value('(Author/text())[1]', 'varchar(50)'),
    Title = XC.value('(Title/text())[1]', 'varchar(50)')
FROM
    RealXmlData
CROSS APPLY
    XmlData.nodes('/Library/Books/LibraryBook') AS XT(XC)

答案 7 :(得分:0)

这是我最“惯用的红宝石”解决方案:

class FizzBuzz
  def perform
    iterate_to(100) do |num,out|
      out += "Fizz" if num.divisable_by?(3)
      out += "Buzz" if num.divisable_by?(5)
      out || num
    end
  end

  def iterate_to(max)
    (1..max).each do |num|
      puts yield num,nil
    end
  end
end

class Fixnum
  def divisable_by?(num)
    self % num == 0
  end
end

class NilClass
  def +(other)
    other
  end
end

FizzBuzz.new.perform

它有效:

https://gist.github.com/galori/47db94ecb822de2ac17c

答案 8 :(得分:-1)

FizzBu​​zz

(1..100).每个做 |num|

if num % 3 == 0 && num % 5 == 0
    puts "#{num}. FIZZBUZZ!"

elsif num % 3 == 0
    puts "#{num}. FIZZ!"

elsif num % 5 == 0
    puts "#{num}. BUZZ!"

else
    puts "#{num}."
end

结束

答案 9 :(得分:-2)

第一个问题:

for i in 1..100
    puts i
end