2

剧透警告:我是一个真正的新手。我的任务是在 ruby​​ 中为一堂课找出嘶嘶声,虽然我发现了不止几个版本的代码可以解决这个问题,但我的理解非常初级,以至于我无法弄清楚这些示例是如何真正起作用的。

第一个问题(如果您对此大笑,请参阅剧透警报):我如何在 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

谢谢,

4

10 回答 10

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
于 2014-02-09T22:47:33.513 回答
2

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

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

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

于 2014-02-09T23:03:01.497 回答
2

另一种可能有用的方法:

 puts (1..100).map {|i|
  f = i % 3 == 0 ? 'Fizz' : nil
  b = i % 5 == 0 ? 'Buzz' : nil
  f || b ? "#{ f }#{ b }" : i
    }
于 2014-05-31T08:45:53.643 回答
1

关于您失败的代码,您的条件语句应该是这样的:

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

你不想要最后一个 elsif 语句,因为它永远不会被执行(如果一个数字不能被 3 整除或被 5 整除,那么它肯定不能被 15 整除)通过将第二个 elsif 更改为 simple 和 if 来调整它如果这个数能被 5 而不是 3 整除,则不会输出 Fizz 但会输出 Buzz

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

于 2014-02-09T23:11:37.093 回答
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 文本编辑。

于 2015-03-02T00:44:01.340 回答
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)
于 2014-03-13T14:03:12.177 回答
1

作为一个班轮

(1..100).map { |i| (i % 15).zero? ? 'FizzBuzz' : (i % 3).zero? ? 'Fizz' : (i % 5).zero? ? 'Buzz' : i  }
于 2020-07-09T16:40:38.833 回答
-1

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

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

于 2015-05-15T20:29:55.257 回答
-1

嘶嘶声

(1..100).each do |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

end
于 2021-04-24T17:47:03.943 回答
-2

第一个问题:

for i in 1..100
    puts i
end
于 2014-02-09T22:46:46.397 回答