INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 060のA問題
https://atcoder.jp/contests/abc060/tasks/abc060_a
●問題文
文字列 A, B, C が与えられます。これがしりとりになっているか判定してください。
つまり、
- A の最後の文字と B の最初の文字が同じ
- B の最後の文字と C の最初の文字が同じ
この 2 つが正しいか判定してください。
両方とも正しいならば YES
、そうでないならば NO
を出力してください。
●制約
- A,B,C は全て英小文字(a ~ z)からなる。
- 1≦∣A∣,∣B∣,∣C∣≦10
- なお、∣A∣,∣B∣,∣C∣ は文字列 A,B,C の長さを表します。
●入力
入力は以下の形式で標準入力から与えられる。
A B C
●出力
YES
か NO
を出力する。
■回答
●愚直に書く
3つの単語を個別に変数に入れて、最初の文字と最後の文字が同じかどうかを見ていけば良いか?
a, b, c = gets.split.map(&:chomp)
if a[-1] == b[0] && b[-1] == c[0]
puts "YES"
else
puts "NO"
end
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、メインメソッド、しりとり判定メソッド、標準入力を取るメソッドの3つ。
def main
a, b, c = read_str
puts judge_shiritori(a, b, c)
end
def judge_shiritori(a, b, c)
if a[-1] == b[0] && b[-1] == c[0]
"YES"
else
"NO"
end
end
def read_str
gets.split.map(&:chomp)
end
main
通った!
●リファクタリング/別アプローチ
三項演算子にするくらいか…!
a, b, c = gets.split.map(&:chomp)
puts a[-1] == b[0] && b[-1] == c[0] ? "YES" : "NO"
通った!
●他の方の回答例
標準入力の取得、gets.split
でいいのか。理解の浅さを露呈してしまった汗。
a, b, c = gets.split
puts a[-1] == b[0] && b[-1] == c[0] ? "YES" : "NO"
あと、個人的には3つの変数に入れるのが好きだけど、1つの変数に配列として入れる方法も可能。
a = gets.split
puts a[0][-1] == a[1][0] && a[1][-1] == a[2][0] ? "YES" : "NO"
なるほど〜。
●出てきたメソッド等
公式リファレンスを見る訓練。
今回は特に無し。
■振り返りなど
ここ数回、文字列の扱いが続いてる気がする。数値でも文字列でもちゃんと扱いたい。