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

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

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

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

Q&A

解決済

5回答

2168閲覧

ruby 文法(条件判定をメソッドにする方法)に関して教えて下さい。。

glvty83

総合スコア135

Ruby

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

0グッド

0クリップ

投稿2015/11/26 07:50

編集2015/11/26 08:58

1~50の数字で3で割り切れる時FIZZ,5で割り切れる時BUZZ,3と5で割り切れる時にはFIZZBUZZと出力されるように。

条件)
FIZZ, BUZZ, FIZZBUZZを判定する部分をメソッドにする方法を教えていただきたいです。。。

実行結果
以下のように表示されること

1
2
FIZZ
4
BUZZ
6
...
14
FIZZBUZZ
16
...

eachで分岐するのはわかるのですが、判定部分をメソッドにするのがわからないので簡潔な解説とともにご教示いただきたいです。

以下の回答で上司に判定部分がメソッドになっていないと言われたので質問させていただいてます。。。

def judge(num)
(1..num).each do |i|
fizzbuzz = i%3 == 0 && i%5 == 0
fizz = i%3 == 0
buzz = i%5 == 0

if fizzbuzz puts "FIZZBUZZ" elsif fizz puts "FIZZ" elsif buzz puts "BUZZ" else puts i end

end
end
judge(50)

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

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

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

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

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

guest

回答5

0

これでOKもらえました><
皆様のおかげです。ありがとうございました!

def fiz?(num)
num % 3 == 0
end

def buz?(num)
num % 5 == 0
end

def judge(num)
(1..num).each do |i|
if fiz?(i) && buz?(i)
puts 'FIZZBUZZ'
elsif fiz?(i)
puts 'FIZZ'
elsif buz?(i)
puts 'BUZZ'
else
puts i
end
end
end

judge(50)

投稿2015/11/27 00:26

glvty83

総合スコア135

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

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

0

ベストアンサー

Numeric あるいはFixnum クラスのメソッドを拡張すると

ruby

1class Numeric 2 def fizz? 3 modulo(3).zero? 4 end 5 6 def buzz? 7 modulo(5).zero? 8 end 9 10 def fizz_buzz? 11 fizz? && buzz? 12 end 13end 14 15def fizz_buzz(n) 16 if n.fizz_buzz? 17 'FizzBuzz' 18 elsif n.fizz? 19 'Fizz' 20 elsif n.buzz? 21 'Buzz' 22 else 23 n 24 end 25end 26 27i = 100 28p fizz_buzz(i) # => Buzz

といった 動作が可能になります

ただ、影響範囲が大きいので、実際の利用ではrefinements などを利用して、特定のクラス内のみで適用するなど 工夫が必要かもしれません

Link

投稿2015/11/26 09:24

gouf

総合スコア2321

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

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

glvty83

2015/11/27 01:45

ご丁寧にありがとうございました!!
guest

0

べたに

50.times do |i|
puts case 0
when (i+1)%15
then 'FizzBuzz'
when (i+1)%5
then 'Fizz'
when (i+1)%3
then 'Buzz'
else
(i+1)
end
end

投稿2015/11/26 08:50

matsumoto

総合スコア590

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

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

glvty83

2015/11/26 08:55

どうもありがとうございます! 判定部分をメソッドにはできませんか?><
matsumoto

2015/11/26 09:03 編集

これでいいでしょうか・・・ def fizzbuzz(num) num.times do |i| puts case 0 when (i+1)%15 then 'FizzBuzz' when (i+1)%5 then 'Fizz' when (i+1)%3 then 'Buzz' else (i+1) end end end fizzbuzz(50)
glvty83

2015/11/26 09:07

どうもありがとうございます!!お世話になりました>< 参考にさせていただきます!!
glvty83

2015/11/26 09:09

15を使っているのとても勉強になりました、テクニックとして覚えます!
guest

0

参考情報:
FizzBuzz - Rosetta Code
http://rosettacode.org/wiki/FizzBuzz#Ruby
http://rosettacode.org/wiki/FizzBuzz#Ruby_with_RSpec

上からの引用です。

ruby

1def fizzbuzz(number) 2 return 'FizzBuzz' if is_divisible_by_fifteen?(number) 3 return 'Buzz' if is_divisible_by_five?(number) 4 return 'Fizz' if is_divisible_by_three?(number) 5 number 6end

投稿2015/11/26 16:38

katoy

総合スコア22324

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

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

0

もっとうまくできそうだけど・・・

def method1(num)
retval = "FIZZ" if num % 3 == 0
retval = retval.to_s + "BUZZ" if num % 5 == 0
retval ||= num
end

投稿2015/11/26 08:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

glvty83

2015/11/26 08:46

どうもありがとうございます!
glvty83

2015/11/26 08:47

他に別解がある方どうかよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問