以前のFizzBuzzのプログラムは
ifとelsifで条件分岐してコードを書いていたのですが、
他の書き方とかありましたら教えてください。
宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
単にifとelsifの条件分岐を短く書きたいということであれば、以前の質問 の回答にも書きましたが、
3項演算子?:
を使うと短く書けます。
lang
1(1..20).each{|n|puts((n % 15 == 0) ? "FizzBuzz" : (n % 3 == 0) ? "Fizz" : (n % 5 == 0) ? "Buzz" : n)}
条件分岐自体を使わないということであれば、全く使わない方法は思いつきませんでしたが、
ちょっとだけ違うパターンをいくつか考えてみました。
配列
lang
1def to_fizz_buzz(num) 2 [[15,'FizzBuzz'], [5,'Buzz'], [3,'Fizz']].each{|pair| 3 return pair[1] if (num % pair[0] == 0) 4 } 5 num 6end 7(1..20).each{|n|puts to_fizz_buzz(n)}
ビット演算 (0, 1, 2, 3 が 0b00, 0b01, 0b10, 0b11
というのを使ってます)
lang
1def to_fizz_buzz(num) 2 idx = 0 3 idx ^= 0b1 if (num % 3 == 0) 4 idx ^= 0b10 if (num % 5 == 0) 5 [num, 'Fizz', 'Buzz', 'FizzBuzz'][idx] 6end 7(1..20).each{|n|puts to_fizz_buzz(n)}
投稿2014/09/29 06:56
総合スコア863
0
敢えて行数をかせぐ書き方をしてみました。Ruby のバージョンによっては動かないかもしれません
module FizzBuzzExtension refine Fixnum do def fizz? modulo(3).zero? end def buzz? modulo(5).zero? end def fizz_buzz? fizz? && buzz? end end end class FizzBuzz using FizzBuzzExtension def fizz_buzz(n) 1.upto(n).map{ |num| fizz_buzz_out(num) } end private def fizz_buzz_out(n) if n.fizz_buzz? 'FizzBuzz' elsif n.fizz? 'Fizz' elsif n.buzz? 'Buzz' else n end end end f = FizzBuzz.new p result = f.fizz_buzz(10) # => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz"] p result.join(', ') # => "1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz" p 10.fizz? # => undefined method `fizz?' for 10:Fixnum (NoMethodError)
投稿2014/09/28 13:58
総合スコア2321
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
caseを使えばいけますよ。
サンプルは以下のとおりです。
lang
1(1..100).each do |i| 2case i % 15 3when 0 then puts "FizzBuzz" 4when 3,6,9,12 then puts "Fizz" 5when 5,10 then puts "Buzz" 6else puts i 7end 8end
投稿2014/09/28 02:30
総合スコア165
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
google で "ruby fizzbuzz" して見つけたものの中から2つ紹介します。
- Ruby FizzBuzz最短コードメモ (1..100, 51bytes) ネタバレ注意 http://qiita.com/manuluu/items/151167640fcd909d0c47 より
lang
11.upto(100){|n|puts'FizzBuzz 2'[i=n**4%-15,i+13]||n}
- Shortest Ruby FizzBuzz Implementation https://gist.github.com/CliveIMPISA/1ddb608cea56c0fa75a8
lang
1def fizzbuzz(size) 2 1.upto size do |num| 3 yield num % 15 == 0 ? 'FizzBuzz' : num % 5 == 0 ? 'Buzz' : num % 3 == 0 ? 'Fizz' : num.to_s 4 end 5end
投稿2014/09/28 16:31
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。