【FizzBuzz問題】今までと少しだけ別の解き方をしてみました
最近の学習状況について
プログラミングスクール自体は学習期間をスタートしてからはだらけた生活ともおさらばをして毎日通えており、ある程度順調かと思います。周りの方のやる気に引っ張られている気はします。感謝です。
ブログに関してはもはややっていないのと同じになってしまいそうで危機感を感じたので投稿です。ものすごく薄い内容のブログ記事が続いた関係と少し、というか大分怠惰だった関係もあり、かなり久しぶりの投稿となってしまい反省をしています。
インプットによりすぎていたのはそもそももっと反省をしなければいけないと思いますし、少し趣向を変えてできる限り継続をして記事をかけるようにしていきたいと思います。
FizzBuzz問題
スクールのカリキュラムで今、JQueryやデータベース、GitHubの使い方等を学んでいたりするのですが、少しRubyやRailsから離れてしまっているという印象もあり、息抜きがてらに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番めとほぼ変わっていません。ただ少しスッキリとした印象はありますね。
気付きとしては簡単で一般的な問題でも解き方は複数あるという点です。ということは複雑な問題であればとりあえず動くものと、動いてかつ高速で誰からも読みやすいというコードもあるということだと思います。とにかく一人あたりの生産性を強く求められると思うのですが、それだけ個人的には面白そうだなと感じています。
明日からもがんばります!