Ruby中的冒泡嗡嗡声供假人使用

bpsygsoo  于 2022-09-21  发布在  Ruby
关注(0)|答案(12)|浏览(121)

剧透提醒:我是一个真正的新手。我的任务是为一个类计算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

谢谢,

smdnsysy

smdnsysy1#

作为一个新手,我们都得从某个地方开始,对吗?Ruby很可爱,因为它让我们可以一直使用块,所以要数到100,你可以在fix num上使用几个方法,看看文档中的更多内容。这里有一个例子可能会对你有所帮助;

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
bxfogqkk

bxfogqkk2#

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

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

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

bbuxkriu

bbuxkriu3#

另一种可能有帮助的方法是:

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

p8ekf7hl4#

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

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

您不想要最后一个elsif语句,因为它永远不会被执行(如果一个数字不能被3整除或被5整除,那么它肯定不能被15整除),为此进行调整,将第二个elsif更改为Simply,如果且如果该数字可被5除尽而不是被3除尽,则不会输出Fizz,但将输出Buzz

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

5sxhfpxr

5sxhfpxr5#

这不是写它最漂亮的方式,但对初学者和可读性都很好。

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)
hlswsv35

hlswsv356#

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文本编辑。

cs7cruho

cs7cruho7#

作为一个班轮

(1..100).map { |i| (i % 15).zero? ? 'FizzBuzz' : (i % 3).zero? ? 'Fizz' : (i % 5).zero? ? 'Buzz' : i  }
pepwfjgg

pepwfjgg8#

对于更复杂的解决方案,这是一种构建简单DSL的方法,用于快速修改FizzBuzz程序(添加具有自己的关键字的新除数)

class FizzBuzzer
  # @return [Hash{String, Symbol => Integer}]
  attr_reader :keywords

  # @param keywords [Hash{String, Symbol => Integer}]
  def initialize(keywords)
    @keywords = keywords
  end

  # @param range [Range]
  # @return [void]
  def call(range)
    range.each do |num|
      msg = ''
      @keywords.each do |name, divisor|
        msg << name.to_s if (num % divisor).zero?
      end

      msg = num if msg.empty?
      puts msg
    end
    puts
  end
end

# create a fizz buzzer with custom keywords for divisors

CLASSIC_FIZZ_BUZZER = FizzBuzzer.new Fizz: 3, Buzz: 5

# print for a particular range

CLASSIC_FIZZ_BUZZER.call(1..25)

# you can easily define an extended fizz buzzer

EXTENDED_FIZZ_BUZZER = FizzBuzzer.new Fizz: 3, Buzz: 5, Bazz: 7, Fuzz: 11 # print 'Fuzz' when divisible by 11
EXTENDED_FIZZ_BUZZER.call(1..25)
7kjnsjlb

7kjnsjlb9#

这是一个相当优雅的解决方案。

(1..100).each do |num|
  msg = ''
  msg << 'Fizz' if (num % 3).zero?
  msg << 'Buzz' if (num % 5).zero?

  msg = num if msg.empty?
  puts(msg)
end

它甚至可以更紧凑

(1..100).each do |num|
  (msg ||= '') << 'Fizz' if (num % 3).zero?
  (msg ||= '') << 'Buzz' if (num % 5).zero?
  puts msg || num
end
2lpgd968

2lpgd96810#

冒泡嗡嗡声

(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
n1bvdmb6

n1bvdmb611#

第一个问题:

for i in 1..100
    puts i
end
2mbi3lxu

2mbi3lxu12#

以下是我最“惯用的Ruby”解决方案:

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

相关问题