webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

RubyでFIZZBUZZやってみた。

こんにちは、エンジニアのさもです

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やってないですけど、またチャレンジしてみようかな。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。