こんにちは、エンジニアのさもです
TensorFlowを勉強していて少し疲れたので休憩です。
今回は、アルゴリズムの入門として有名なFIZZBUSSプログラムをRubyで書いてみました。
スポンサーリンク
たしか、社内のアルゴリズム研修でやった気がしますが、実際にプログラミングするのは初めてでした。
Fizz_Buzzとは
数字を1から100までカウントアップしながら、3の倍数のときは、FIZZと出力。5の倍数のときはBUZZと出力。15の倍数のときはFIZZBUZZと出力するプログラムです。
実装
こんな感じで実装しました
f = ([nil] * 2 + ["FIZZ"]) * 34 b = ([nil] * 4 + ["BUZZ"]) * 20 fb = ([nil] * 14 + ["FIZZBUZZ"]) * 7 (0..99).to_a.each { |i| p "#{i+1}: #{fb[i] || b[i] || f[i]}" }
解説
fは配列で、中身は、[nil, nil, “FIZZ”, nil, nil, “FIZZ”…]
と3つおきに"FIZZ"が入っています。
同じように、bには[nil, nil, nil, nil, “BUZZ”, nil, nil, nil, nil, “BUZZ”…]
といった具合です。
もうお分かりのように、fbには"FIZZBUZZ"というのが15おきに入っています。
(0..99).to_a.each { |i| コード }
で100回コードを繰り返します。iには0から99の数が、繰り返し毎に1づつ増えながら入っていきます。
コードの中核となっているのが次の部分ですが、
fb[i] || b[i] || f[i]
まずfb[i]でi番目の要素をとってきて、もしnilだったら、||
の後ろのb[i]が実行されます。
最終的にすべてnilだったら何も表示しません。
もし、iが24だったら、fb[24], b[24]はどちらもnilで、f[24]が実行されます。f[24]には"BUZZ"がはいっているので、
25: BUZZ
と表示されます。
2017/09/22追記
実はもうちょっと短く、しかも省メモリに書けました
f = ([nil] * 2 + ["FIZZ"]) b = ([nil] * 4 + ["BUZZ"]) (0..99).to_a.each { |i| p "#{i+1}: #{f[(i % 3)].to_s + b[(i % 5)].to_s}" }
無理やりワンライナーにするとこんな感じです
(0..99).to_a.each { |i| p "#{i+1}: #{([nil] * 2 + ["FIZZ"])[(i % 3)].to_s + ([nil] * 4 + ["BUZZ"])[(i % 5)].to_s}" }
最後に
普通はifで分岐しながら場合分けすると思うのですが、今回は(メモリを使いますが)rubyっぽく書いてみました。
そういえば最近paizaやってないですけど、またチャレンジしてみようかな。
読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。