Koichiの日記

人材紹介会社出身の25歳がエンジニアを目指します

【FizzBuzz問題】今までと少しだけ別の解き方をしてみました

最近の学習状況について

 

プログラミングスクール自体は学習期間をスタートしてからはだらけた生活ともおさらばをして毎日通えており、ある程度順調かと思います。周りの方のやる気に引っ張られている気はします。感謝です。

ブログに関してはもはややっていないのと同じになってしまいそうで危機感を感じたので投稿です。ものすごく薄い内容のブログ記事が続いた関係と少し、というか大分怠惰だった関係もあり、かなり久しぶりの投稿となってしまい反省をしています。

インプットによりすぎていたのはそもそももっと反省をしなければいけないと思いますし、少し趣向を変えてできる限り継続をして記事をかけるようにしていきたいと思います。

 

 FizzBuzz問題

 

スクールのカリキュラムで今、JQueryやデータベース、GitHubの使い方等を学んでいたりするのですが、少しRubyRailsから離れてしまっているという印象もあり、息抜きがてらにRubyの問題が突然ときたくなってしまいました。

ただ、あまり難しすぎると微妙なので、おなじみのFizzBuzz問題を解いてみました。

 

模範解答

スペースを除いた文字数:160 文字がある行数:16

  def fizz_buzz
    num = 1
    while (num <= 100) do
      if (num % 3 == 0) && (num % 5 == 0)
        puts "FizzBuzz"
      elsif (num % 3) == 0
        puts "Fizz"
      elsif (num % 5) == 0
        puts "Buzz"
      else
        puts num
      end

      num = num + 1
    end
  end

  fizz_buzz

これだけだと簡単にできすぎるので、putsを一回しか使わないこととeachを使って解く方法を試してみました。実際にputsは確かにRailsに入るとほとんど使わないですし、色々な解き方ができたほうが今後にとってはいいと思いますのでやってみました!

 

putsを1回しか使わない方法

スペースを除いた文字数:146 文字がある行数:17

def fizz_buzz
 int = 1
 while int <= 100 do
   if int % 15 == 0
     num = "fizz_buzz"
   elsif int % 5 == 0
     num = "fizz"
   elsif int % 3 == 0
     num = "buzz"
   else
     num = int
   end
      puts num
      int += 1
  end
end

fizz_buzz

 

最初にputs numはputsを一回しか使わないということで絶対に作ることは決定です。何とかnumでまとめるためにはif文を作って条件分岐の過程でnumに代入をしていくのがベストと考え、intという変数も作りました。若干文字数は少なくなりましたが、そこまでは変わらない印象も受けます。

 

範囲オブジェクト+eachを使う方法

スペースを除いた文字数:135 文字がある行数:15

def fizz_buzz
  (1..100).each do |i|
    if i % 15 == 0
    word = "fizz_buzz"
    elsif i % 5 == 0
    word = "fizz"
    elsif i % 3 == 0 
    word = "buzz"
    else 
    word = i
    end
    puts word
  end
end

fizz_buzz 

文字数、行数ともに最もいいスコアを出すことができました。範囲オブジェクトをあまり馴染みが無かったのですが、使ってみました。ここもさっきはintを使いましたが、wordという変数を使って表現をしてみました。基本的なロジックは2番めとほぼ変わっていません。ただ少しスッキリとした印象はありますね。

 

気付きとしては簡単で一般的な問題でも解き方は複数あるという点です。ということは複雑な問題であればとりあえず動くものと、動いてかつ高速で誰からも読みやすいというコードもあるということだと思います。とにかく一人あたりの生産性を強く求められると思うのですが、それだけ個人的には面白そうだなと感じています。

 

明日からもがんばります!