Help us understand the problem. What is going on with this article?

Ruby 2.3.1でFizzBuzz問題を解く。

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

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

ruby 2.3.1をCentOS7に導入する。

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 / 青木靖 訳

プログラムを書ける者とプログラムを書けない者の間にある大きな溝についてはよく知られているが、プログラマの職に応募してくる人間は、すでにこの溝を飛び越えているものだとばかり思っていた。明らかにこれは妥当な仮定ではないらしい。プログラムを書けないプログラマの面接で時間を無駄にしないために、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

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

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分木アルゴリズムにも挑戦したい。

Fendo181
Enduです。PHPとJavaScriptを書いてご飯食べてます。
https://scrapbox.io/fendo181/profile
pepabo
「いるだけで成長できる環境」を標榜し、エンジニアが楽しく開発できるWebサービス企業を目指しています。
https://pepabo.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away