INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 038のA問題
https://atcoder.jp/contests/abc038/tasks/abc038_a
●問題文
高橋くんはドリンクバーにやってきました。彼は今お茶を飲みたい気分です。しかし、ドリンクバーの飲み物の表記はすべてローマ字で、高橋くんはそれを読むことができません。高橋くんは、ある飲み物について、それがお茶であるかどうか知りたいと思っています。 ただし、ある飲み物がお茶であることは、そのローマ字表記がTで終わる文字列であることと等しいです。
あなたの仕事は、ある飲み物のローマ字表記の文字列Sが与えられたとき、飲み物がお茶であるか判定するプログラムを書くことです。
●制約
- S の長さは1以上50以下である。
- S の各文字は英大文字からなる。
●入力
入力は以下の形式で標準入力から与えられる。
S
●出力
文字列 S が表す飲み物がお茶のとき、YES
、そうでないとき NO
と 1 行に出力せよ。
■回答
●愚直に書く
最後の文字なので、文字列から[-1]
を取ってきて、それがT
かどうかを判別すれば良さそう。
s = gets.chomp
puts s[-1] == 'T'? 'YES' : 'NO'
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、メインメソッド、最後の文字がTかどうか判別するメソッド、標準入力を取ってくるメソッドの3つにした。
def main
s = read_string
puts judge(s)
end
def judge(s)
s[-1] == 'T'? 'YES' : 'NO'
end
def read_string
gets.chomp
end
main
通った!
●リファクタリング/別アプローチ
標準入力を変数に入れずにそのまま処理するくらいかな…。
puts gets.chomp[-1] == 'T'? 'YES' : 'NO'
●他の方の回答例
上位層の皆さんはgets[-2]
している。僕はchompで最後の改行を消してgets.chomp[-1]
してるけど、改行を残して「後ろから2つ目」を取る[-2]
をしても結果は同じで、むしろコードがシンプルになるということか。なるほど〜。
●出てきたメソッド等
公式リファレンスを見る訓練。
■振り返りなど
文字列をgets
したらchomp
しろというのを呪文のように覚えていたけど、柔軟に考えたい。勉強になりました。