2014-02-09 251 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