タナカのプログラミング

プログラミングについて

Ruby問題3

f:id:tanagram18:20190903163913j:plain

こんちは

とあるRubyの問題3問をあげてみる。

 

問題1 メールアドレスの不正チェック

メールアドレスが適正か不適正かを判別したい

 

条件

メールアドレスに"@"が含まれてること

"@"の後、1文字以上"."で挟んでさらにその後、2文字以上入れること

最初の文字は英数字から始まること

 

適切な場合”適切なメールアドレスです”

不適切な場合”不適切なメールアドレスです”と表示

 

入力例

uri@iiiii.jp

出力例

適切なメールアドレスです

 

入力例

a@a.a

出力例

不適切なメールアドレスです

 

入力例

-@gmail.com

出力例

不適切なメールアドレスです

 

 

解説できん答え

mail = gets.to_s

if mail.match?(/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i) == true
  if mail.split("").first == "-" || mail.split("").last == "-"
    puts "不適切なメールアドレスです"
  else puts "適切なメールアドレスです"
  end
else puts "不適切なメールアドレスです"
end

参考にした正規表現の記事

yaoshisi.herokuapp.com

eng-entrance.com

qiita.com

 

 

問題2 BMI肥満度チェック

身長と体重を入力してBMIと肥満度を出力したい

 

条件

身長と体重を入力

 

BMIは小数第一まで表示しそれ以降は切り捨て

 

BMIの結果が40以上だったら肥満(4度)

35以上40未満であれば肥満(3度)

30以上35未満であれば肥満(2度)

25以上30未満であれば肥満(1度)

18.5以上25未満であれば普通体重

それ以外は低体重と表示

 

入力例

172 58

出力例

BMI:19.6

判定:普通体重

 

入力例

150 80

出力例

BMI:35.5

判定:肥満(3度)

 

答え(とりま動く)

 

hight,weight = gets.split.map(&:to_f)

result = weight.floor(2) / ((hight * hight).floor(2) / 10000)
puts "BMI: #{result.floor(1)}"

if result >= 40 
  puts "判定: 肥満(4度)"
elsif 35 <= result && result < 40
  puts "判定: 肥満(3度)"
elsif 30 <= result && result < 35
  puts "判定: 肥満(2度)"
elsif 25 <= result && result < 30
  puts "判定: 肥満(1度)"
elsif 18.5 <= result && result < 25
  puts "判定: 普通体重"
else puts "判定: 低体重"
end

 

 

問題3 ポイントの計算

とあるスーパーは購入した分ポイントが付与される

しかし購入日によってポイントの付与率が変わるのでポイントの計算機を作りたい

 

条件

1回目の入力で買い物した回数を入力

2回目以降に1回目に入力した回数分だけ日付と購入金額を入力

 

日付が1桁の場合、前に0をつける(例:1 → 01)

 

日付が1日の場合購入金額の5%ポイント付与

日付に"5"が含まれてる場合購入金額の3%ポイント付与

日付に"3"が含まれてる場合購入金額の2%ポイント付与

それ以外は1%ポイント付与

 

小数点は切り捨て

 

入力例

2

05 3000

13 4000

出力例

170ポイント

 

入力例

5

01 2190
08 3000
15 3789
23 4578
29 2718 

出力例

370ポイント

 

答え(ひとまず動く)

num = gets.to_i

count = 0

point = []

while count < num do
  day, money  = gets.split.map(&:to_s)
  money = money.to_f

  if day.include?("3")
    point << ((money / 100) * 2).floor
  elsif day.include?("5")
    point << ((money / 100) * 3).floor
  elsif day == "01"
    point << ((money / 100) * 5).floor
  else point << (money / 100).floor
  end

  count += 1
end

puts "#{point.sum}ポイント"

 

はてなでコードを貼る

参考にさせていただきました!!

kurokinomizuiwa.hatenablog.com

 

以上