Ruby 2.3.1でFizzBuzz問題を解く。

#Ruby2.3.1をインストールする。

長くなりそうなので別の記事に上げました。

[ruby 2.3.1をCentOS7に導入する。](http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb)

Ruby2.3.1でなくてもFizzBuzz問題は解けるので、素早くrubyを導入したい方は

```
sudo yum install ruby
```
を実行して、rubyをインストールして下さい。


|Ruby|ruby 2.3.1p112 (2016-04-26)|
|:------:|:-------:|


#FizzBuzz問題とは?
プログラミングの基本的素質をみるためのごく簡単な問題です。

例として以下のような問題である。

>
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

という事でなぜこれほどFizzBuzz問題がプログラミング界隈で試験的な扱いになっているか...?というと出典はおそらくこれである。


[どうしてプログラマに・・・プログラムが書けないのか? -Jeff Atwood / 青木靖 訳](http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm)

>
プログラムを書ける者とプログラムを書けない者の間にある大きな溝についてはよく知られているが、プログラマの職に応募してくる人間は、すでにこの溝を飛び越えているものだとばかり思っていた。明らかにこれは妥当な仮定ではないらしい。プログラムを書けないプログラマの面接で時間を無駄にしないために、__FizzBuzzスタイル__のふるい分けが必要ということだ。
FizzBuzzテストが簡単すぎるとは思わない方がいい(実際意図的にバカみたいに簡単にしてあるわけだが)。イムランのポストにコメントした人が、このテストの有効性について書いている。
面接者がFizzBuzzテストを簡単すぎると思ってやらないことを残念に思う。私の経験で言えば、最も簡単なプログラミングタスクさえできない候補者の多さには、まったく驚くしかない。__最初に候補者の書いたコードを見ることもなくプログラマを面接するというのが、そもそもばかげたことなのかもしれない。__私の会社では、コードサンプルなしには電話面接にさえ進めない

という事なのでFizzBuzz問題を解かない限りではプログラマを語るべからずという古くからの言い伝えに従って、コーディングしてみる。

#さっそくRubyで書いてみる

- for文でFizzBuzz問題を解く。


```FizzBuzz_for.rb

for i in 1..30
  
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
    
end

```

- [uptoメソッド](http://ref.xaio.jp/ruby/classes/string/upto)でFizzBuzz問題を解く

```FizzBuzz_upto.rb
1.upto(30) do |i|
    
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
    
end
```


- [eachメソッド](http://www.rubylife.jp/ini/for/index5.html)でFizzBuzz問題を解く

```FizzBuzz_each.rb

(1..30).each do |i|
    
 
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
    
end

```

- [timesメソッド](http://www.rubylife.jp/ini/for/index6.html)を使ってFizzBuzz問題を解く。

```FizzBuzz.rb
#FizzBuzz問題
#0から30まで繰り返す
1..30.times do |i|    

    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
    
end


```


- while文でFizzBuzz問題を解く(非推奨)

```FizzBuzz_while.rb
i=1
while i <=30 
    
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
    
    i +=1
end


```

実行結果

```
1
2
Fizz!
4
Buzz!
Fizz!
7
8
Fizz!
Buzz!
11
Fizz!
13
14
FizzBuzz!
16
17
Fizz!
19
Buzz!
Fizz!
22
23
Fizz!
Buzz!
26
Fizz!
28
29
FizzBuzz!

```
___

#間違ったFizzBuzz問題の解き方

最初に書いた`FizzBuzz.rb`は上のコードとは少し違っている。

```FizzBuzz_before.rb

1..30.times do |i|
    
    if i%3==0
        puts "Fizz!"
    elsif i%5==0
        puts "Buzz!"
    elsif i%15==0 
        puts "FizzBuzz!"
    else
        puts i
    end
    
        
        
end
```


最初の`if`で3の倍数の評価を行い、`elsif`で15の倍数の評価を行っている。


実行結果

```
1
2
Fizz!
4
Buzz!
Fizz!
7
8
Fizz!
Buzz!
11
Fizz!
13
14
Fizz!
16
17
Fizz!
19
Buzz!
Fizz!
22
23
Fizz!
Buzz!
26
Fizz!
28
29
Fizz!
```



これは`(i%15==0)`が評価される前に__最初のif文で(`i%3==0`)が先に評価されてしまった結果__、FizzBuzzが表示されなくなったと考えられる。


#まとめ
Rubyの勉強がてら今回FizzBuzz問題を解いたが、アルゴリズムとしては3の倍数、5の倍数、15の倍数でそれぞれ場合分けを行って処理が書けるか?を問う問題であったが、基礎的な文法`if elss elsif while `を学ぶには丁度いい勉強材料であると考えられる。もう少しRubyのスキルが身に着いたら、バブルソートや2分木アルゴリズムにも挑戦したい。