質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

5回答

2787閲覧

Ruby FizzBuzzのプログラムを書き換えたい

mameko312

総合スコア151

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2014/09/26 17:08

以前のFizzBuzzのプログラムは
ifとelsifで条件分岐してコードを書いていたのですが、
他の書き方とかありましたら教えてください。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yohshiy

総合スコア863

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tapbreakを使って、下記のような方法もできます。

lang

1(1..100).each do |x| 2 p x.tap{|n| break "FizzBuzz" if n % 15 == 0} 3 .tap{|n| break "Buzz" if n % 5 == 0} 4 .tap{|n| break "Fizz" if n % 3 == 0} 5end

投稿2014/09/29 01:08

k.tada

総合スコア1679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

gouf

総合スコア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

hogehogehoge

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

google で "ruby fizzbuzz" して見つけたものの中から2つ紹介します。

lang

11.upto(100){|n|puts'FizzBuzz 2'[i=n**4%-15,i+13]||n}

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問