薫のメモ帳

私が学んだことをメモ帳がわりに

RUBYでFIZZBUZZプログラムを書く

0 はじめに

 約4か月前、「FIZZBUZZプログラムを書く」という課題にチャレンジしたことがあった。

 

hiroringo.hatenablog.com

 

hiroringo.hatenablog.com

 

 前回は、第一段階として自分が使用・学習した経験のある言語(PERL・RUBY・PYTHON・C++)でFIZZBUZZプログラムを書いた。

 そして、第二段階として自分が使いこなしていたPERLで応用問題に挑戦した。

 

 もっとも、今後の私が用いるだろう言語はRUBY・PYTHON・C++である。

 PERLではない。

 よって、前回、PERLでやったことRUBY・PYTHON・C++でもできるようになりたい。

 

 

 そして、私は次の2冊の教科書でRUBYを勉強した。

 そこで、RUBYを用いて前回の応用問題にチャレンジしてみる。

 

  

 

 今回の課題は次の3つ。

 

① 何も見ないでFIZZBUZZプログラムを書く

② 1行でFIZZBUZZプログラムを書く

③ 「%」を用いないでFIZZBUZZプログラムを書く

 以下、チャレンジする。

 

1 チャレンジの結果

 まず、①の条件で書いたプログラムは次のとおり。

 

def fizz_buzz ( n )
    if n % 15 == 0 
        "FIZZBUZZ,\n"
    elsif n % 3 == 0 
        "FIZZ,"
    elsif n % 5 == 0 
        "BUZZ,"
    else
        "#{n}," 
    end
end

(1..50).each do |n|
    print fizz_buzz(n)
end

 

 次に、②の条件(1行以内に収める)で書いたプログラムは次のとおり。

 

(1..50).each{|nprint n%15==0?"FIZZBUZZ,\n":n%3==0?"FIZZ,":n%5==0?"BUZZ,":"#{n},"}

 

 次のサイトで文字数をカウントしたところ、上のプログラムの文字数は90文字以下になっていた。

 これならまあ及第点と言ってもよいだろう。

 

http://www1.odn.ne.jp/megukuma/count.htm

 

 最後に、③の「%」を用いないで書いたプログラムは次のとおりである。

 

def fizz_buzz(x)
    y = x
    while 1 
        if y > 15
            y -= 15
        elsif y == 15
            return "FIZZBUZZ,\n"
        elsif y == 3 || y == 6 || y == 9 || y == 12 
            return "FIZZ,"
        elsif y == 5 || y == 10
            return "BUZZ,"
        else
            return "#{x},"
        end
    end
end

(1..50).each { |nprint fizz_buzz(n) }

 

 もう少しコンパクトにできそうではあるが、まあこんな感じか。

 

 今回書いた3つのプログラムの実行結果は次のとおりである。

 

PS C:\Labratory\LessonLab\ruby\RubyPro1_1> ruby rubypro02_084.rb
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,
31,32,FIZZ,34,BUZZ,FIZZ,37,38,FIZZ,BUZZ,41,FIZZ,43,44,FIZZBUZZ,
46,47,FIZZ,49,BUZZ,
PS C:\Labratory\LessonLab\ruby\RubyPro1_1> ruby rubypro02_085.rb
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,
31,32,FIZZ,34,BUZZ,FIZZ,37,38,FIZZ,BUZZ,41,FIZZ,43,44,FIZZBUZZ,
46,47,FIZZ,49,BUZZ,
PS C:\Labratory\LessonLab\ruby\RubyPro1_1> ruby rubypro02_086.rb
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,
31,32,FIZZ,34,BUZZ,FIZZ,37,38,FIZZ,BUZZ,41,FIZZ,43,44,FIZZBUZZ,
46,47,FIZZ,49,BUZZ,
PS C:\Labratory\LessonLab\ruby\RubyPro1_1>

 

 要求通りの結果が出ている。

 これならミッションクリアと言ってもよかろう。

 

 

 以上、RUBYの学習成果を試すため「FIZZBUZZ問題」にチャレンジした。

 プログラミングの勉強は「『今年やるぞ』と決めたことのうちあまり進んでいない部分」である。

 これからどんどん進めていきたい。

 

2 RUBYの教科書を写経する

 RUBYを身に着けるために上の2冊の教科書を読み、コードの写経を行った。

 結構、疲れたー。

 

 疲れただけあって一通りの知識は得られたのではないかと考えられる。

 また、以前、C++を学んだときはちんぷんかんぷんだったことも、RUBYの教科書を読んだことで、分かったこともあった。

 丁寧に読み、また、写経した価値はあったのだろう。

 

 もっとも、知識を得ただけでは使えない。

 これから色々なプログラムを書くことで学んだ知識を定着させていきたい。

 でないと学んだ意味がないので。

 

 

 それから、RUBYに関しては次のような資格があるらしい。

 

it.prometric-jp.com

 

 この点、私が今年・来年に取ろうと考えていた資格は

 

FP_2級(今年取る)

数学検定1級

統計検定1級

応用情報技術者

英語検定1級(TOEIC)

 

などであり、RUBY技術者認定試験は考えていなかった。

 ただ、将来的には考えてみてもいいのかもしれない。

 仕事でRUBYを使う予定がない以上、どれだけプログラムを書いて公開しても自己流を超えることができないので、客観性を身に着けるという観点から。