■はじめに
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
を先に持ってきて、変数c
はaeiou
の中に含まれるか、という感じか。
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
とか使っているのか。言われてみれば正規表現でできそう。さらに上位の人はよくわからん書き方をしているが汗、正規表現のシンプルな書き方だと思う…。
●出てきたメソッド等
公式リファレンスを見る訓練。
- String#include? https://docs.ruby-lang.org/ja/latest/method/String/i/include=3f.html
- String#match https://docs.ruby-lang.org/ja/latest/method/String/i/match.html
■振り返りなど
愚直な書き方からinclude?
に気付けたのは嬉しかった。でも正規表現をサラッと書けるようになりたいな…。