2014-02-09 204 views
2

剧透提示:我是一个真正的新手。任务是找出 ruby​​的一个类别,虽然我发现了几个版本的代码 可以解决这个问题,但我的理解非常简单,我不能 弄清楚这些例子是如何真正起作用的。Fizz Buzz in Ruby for dummies

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

第二个问题:可以“如果别人”被用来解决这个我失败的代码如下 (附件有截屏):

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 

感谢,

+0

,所有的答案都错过了一个小点。 'gets'会给你一个字符串,你可能想用'to_i'来转换成一个数字。 – Max

回答

-2

第一个问题:

for i in 1..100 
    puts i 
end 
+0

使用范围而不是for循环更像是一种rubyism,比如'1..100'。 –

+0

因此,票下来了吗?事实上,我也是新手,你可以看到,我今天开始学习哈哈。 – tehAnswer

+1

我不是那个低调的人。我只是让你知道。 –

4

这就好,作为一个新手,我们都必须从某个地方开始吧?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 
+0

虽然这不会打印出数字。 – user1029167

1

在问候你失败的代码,你的条件语句应该是这样的:

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

你不想最后ELSIF声明因为它永远不会被执行 (如果一个数不能被3整除或被5整除,那么它肯定不能被15整除) 通过改变第二个elsif来简单调整,如果和如果数目r是可以除以5而不是3,那么Fizz将不会被输出,但Buzz将会是

我只是告诉你如何更正你的代码,但正如其他人指出的,有更多优雅的解决方案红宝石。

+0

问题在于'puts'在打印出你的字符串后打印出一个'\ n',因此这将产生'Fizz \ nBuzz'而不是'FizzBu​​zz',其倍数为15. 它''print'然而“放”。 – sokkyoku

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

另一种方法,可以帮助:

puts (1..100).map {|i| 
    f = i % 3 == 0 ? 'Fizz' : nil 
    b = i % 5 == 0 ? 'Buzz' : nil 
    f || b ? "#{ f }#{ b }" : i 
    } 
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文本编辑。

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