コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 049 A – 居合を終え、青い絵を覆う

  • by

INDEX

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

■問題

●出典

AtCoder Beginner Contest 049のA問題
https://atcoder.jp/contests/abc049/tasks/abc049_a

●問題文

英小文字 c が与えられるので、c が母音であるか判定してください。ここで、英小文字のうち母音は a、e、i、o、uの 5 つです。

●制約

  • c は英小文字である。

●入力

入力は以下の形式で標準入力から与えられる。

c

●出力

c が母音であるとき、vowel と、そうでないとき consonant と出力せよ。

■回答

●愚直に書く

ifで||を使う感じかな…?

c = gets.chomp
if c == "a" || c == "e" || c == "i" || c == "o" || c == "u"
  puts "vowel"
else
  puts "consonant"
end

通った!
なんかもうちょっとスマートにしたい気はする…。

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

こんな感じかな…?

def main
  c = read_character
  puts is_vowel?(c)
end

def is_vowel?(c)
  if c == "a" || c == "e" || c == "i" || c == "o" || c == "u"
    "vowel"
  else
    "consonant"
  end
end

def read_character
  gets.chomp
end

main

通った!

●リファクタリング/別アプローチ

cが1文字であることは保証されているはずなので、
||で全部繋げなくても、aeiouのどれかが含まれていたら、みたいな書き方ができるような気がする…!

書き方としてはaeiouを先に持ってきて、変数caeiouの中に含まれるか、という感じか。

c = gets.chomp
if "aeiou".include?(c)
  puts "vowel"
else
  puts "consonant"
end

通った!嬉しい。
さらに三項演算子にして、

c = gets.chomp
puts "aeiou".include?(c) ? "vowel" : "consonant"

通った!
さらに変数を使わずに、

puts "aeiou".include?(gets.chomp) ? "vowel" : "consonant"

通った!!

●他の方の回答例

上位の方々はmatchとか使っているのか。言われてみれば正規表現でできそう。さらに上位の人はよくわからん書き方をしているが汗、正規表現のシンプルな書き方だと思う…。

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

愚直な書き方からinclude?に気付けたのは嬉しかった。でも正規表現をサラッと書けるようになりたいな…。