Ruby FizzBuzz問題

問題

1〜100までの整数をターミナルに出力します。

ただし、「3の倍数」のときは"Fizzと"、「5の倍数」のときは"Buzz"、3と5の倍数のときは"FizzBuzz"と出力してください。

 

自分の解答

def fizz_buzz
  (1..100).each{|n|    #each文で1〜100を生成します
    if n % 15 == 0     #ループ処理の中で15の倍数の場合"FizzBuzz"
      print "FizzBuzz "
    elsif n % 3 == 0
      print "Fizz "    #ループ処理の中で3の倍数の場合"Fizz"
    elsif n % 5 == 0
      print "Buzz "    #ループ処理の中で5の倍数の場合"Buzz"
    else
      printf("%d ", n)  #当てはまらない場合元の数字を示します。
    end
  }
end

fizz_buzz

 

模範解答

def fizz_buzz
  num = 1
  while num <= 100 do    #while文で1〜100を生成します
    if num % 15 == 0
      puts "FizzBuzz"
    elsif num % 3 == 0
      puts "Fizz"
    elsif num % 5 == 0
      puts "Buzz"
    else
      puts num
    end

    num = num + 1
  end
end

fizz_buzz

 

別解 その1

def fizz_buzz
for i in 1..100          #forメゾットで1〜100を生成します

  if i%15==0
      puts "FizzBuzz!"
  elsif i%3==0
      puts "Fizz!"
  elsif i%5==0 
      puts "Buzz!"
  else
      puts i
  end

end
end

fizz_buzz

 

別解 その2

def fizz_buzz
1.upto(100) do |i|      #forメゾットで1〜100を生成します

  if i%15==0
      puts "FizzBuzz!"
  elsif i%3==0
      puts "Fizz!"
  elsif i%5==0 
      puts "Buzz!"
  else
      puts i
  end

end
end

fizz_buzz

 

別解 その3

1..100.times do |i|      #timesメゾットで1〜100を生成します    

  if i%15==0
      puts "FizzBuzz!"
  elsif i%3==0
      puts "Fizz!"
  elsif i%5==0 
      puts "Buzz!"
  else
      puts i
  end

 

参考URL

https://www.javadrive.jp/ruby/for/index6.html

https://pikawaka.com/ruby/while

 

if,else問題 Ruby(2)

問題

ECサイトのポイント付与サービスで、
購入金額が999円以下の場合、3%のポイント
購入金額が1000円以上の場合、5%のポイント
このように付与されるポイントを出力するメソッド問題です。

ただし誕生日の場合はポイントが5倍になります。
誕生日の場合はtrue, 誕生日でない場合はfalseで表し、小数点以下をすべてのポイント計算が終わったあとに切り捨てる問題です。

出力例:

calculate_points(500, false) → ポイントは15点です
calculate_points(2000, false) → ポイントは100点です
calculate_points(3000, true) → ポイントは750点です

自分の答え
def calculate_points(amount, is_birthday)
  if (amount <= 999) && (is_birthday  == true )
    point = amount * 0.03 * 5
  elsif
    (amount <= 999) && (is_birthday  != true )
    point = amount * 0.03
  elsif
    (amount >= 999) && (is_birthday  == true )
    point = amount * 0.05 * 5
  else
    point = amount * 1.05
  end
  puts "ポイントは#{point.floor}点です"
end

模範解答

def calculate_points(amount, is_birthday)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  if is_birthday
    point = point * 5
  end
  puts "ポイントは#{point.floor}点です"
end

自分は、4パターンの分岐をしましたが、模範解答では先に購入金額の分岐をし、その後誕生日の分岐をし最後に小数点を取り除いています。

if,else問題 Ruby

問題

・メソッド外で定義された3つの正の整数を、それぞれ仮引数a,b,cとしてnumメソッド内で使用する。
・第一引数と第二引数は足し算をし、変数abに代入。
・第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する。
・第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する。

 

自分の解答

def num(a,b,c)
  ab = a + b       #ab = a + bで第一引数aと第二引数bを足し合わせています
if c <= 3        #第三引数cが3以下なのか否かを比較しています
puts ab / c elsif c >= 4 #第三引数cが4以上なのか否かを比較しています puts ab * c else puts "False"     #3〜4の値を"False"で返しています end end num(1,5,3) num(1,5,5) num(1,9,-2)

 

模範解答

def num(a, b, c)
  ab = a + b
  if c <= 3
    puts ab / c
  else
    puts ab * c
  end
end

これだと3〜4も乗算されるけど…

Ruby sliceメソッド

問題

任意の文字列の最後の2文字を3回繰り返し出力する問題です。

出力例:

extra_end('Hello') → 'lololo'
extra_end('ab') → 'ababab'
extra_end('Hi') → 'HiHiHi'

 

自分の答え

 

def extra_end(str)
num1 = str.slice(-2)     #slice(-2)で最後から2番目の文字をnum1にあてる
num2= str.slice(-1)      #slice(-1)で最後の文字をnum1にあてる
 puts (num1 + num2)*3       #最後の2文字を3階繰り返す
end

 もしくは

 

def extra_end(str)
  char_num = str.length           #文字を数値に返す
  right2 = str.slice(char_num - 2, 2)  #最後から2番目から2つを(最後の2文字)rigth2に当てる
  puts right2 * 3
end

 

2桁の整数から十の位と一の位を取得し計算する

問題

二桁の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムをRubyで作成してください。なお、2桁の数字以外が入力として与えられた場合を考慮する必要はありません。

 

解答その1

def addition(a, b)
  a + b
end

def multiplication(a,b)
  a * b
end

def slice_num(num)
  # 10の位                  #integer(整数)なので小数点は除く
  tens_place = (num / 10) % 10     #(例)54/10=5 5%10=5
# 1の位 ones_place = num % 10 return tens_place, ones_place #54%10=4 end puts "二桁の整数を入力してください" input = gets.to_i X, Y = slice_num(input) add_result = addition(X, Y) multiple_result = multiplication(X, Y) puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"

 

解答その2 

def sum(input)
  ten = (input/10) % 10
  one = (input/1) % 10
  return ten, one
end

puts "二桁の整数を入力してください"
input = gets.to_i
ten, one  = sum(input)
puts "足し算結果と掛け算結果の合計値は#{(one + ten ) + (one * ten )}です"

 

Ruby 平日ならFalse、休日ならTrue値をとして返すメソッド

問題

休みかどうかを判別するメソッドsleep_inを定義し、引数として2つ渡します。1つ目が月~金曜日(weekday)であるかどうか、2つ目祝日やお盆休みなどの休暇日(vacation)であるかどうかです。

具体的には、土曜日または日曜日の場合(weekdayがfalseの場合)や、休暇日(vacationがtrue)の場合は、休みとなるのでTrueを返します。

呼び出し方:

sleep_in(weekday, vacation)

 

def sleep_in(weekday, vacation)
  if (weekday != true) || (vacation == true )  
# weekday = true or vacation = false の時"True"を返ます
puts "True" else puts "False" end end sleep_in(false, false) → True sleep_in(true, false)  → False sleep_in(false, true)  → True

 

 

ruby include?メソッド

include?メソッドとは

指定した要素が、配列中に含まれているかを判定するメソッドです。

 

a = ["a","b","c",]
  a.include?("b")   #=> True
a.include?("z") #=> False

 

例題

配列内に1,2,3が全て入っていれば「True」それ以外は「False」と出力されるメソッドを作りましょう。

 

def array123(nums)
  if nums.include?(1) and nums.include?(2) and nums.include?(3)
    puts "True"     #&&演算子を用いることで、複数の条件に対応することができます
  else
    puts "Fales"
  end
end

array123([1, 1, 2, 3, 1])  True
array123([1, 1, 2, 4, 1])  False
array123([1, 1, 2, 1, 2, 3])  True

ちなみに includeはモジュールの性質を他のクラスに追加するために使用されるメソッドとななるので、?をつけるのを忘れずに