問題
2つの文字列の末尾の文字を比較して、一致する場合はTrue、
一致しない場合はFalseを出力するプログラムを実装します。
以下の要件を満たすend_otherメソッドを実装しましょう。
- メソッドの引数に、任意の2つの文字列を指定する。
- 引数に指定された2つの文字列のうち、
どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する - 上記を満たせていない場合は、Falseを出力する
- 入力した文字が大文字でも小文字でも、同一の文字として処理を行う
雛形
def end_other(a, b)
# 処理を記述
end
# 呼び出し例
end_other('Hiabc', 'abc')
解答
def end_other(a, b)
a_down = a.downcase
b_down = b.downcase
a_len = a_down.length
b_len = b_down.length
if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
puts "True"
else
puts "False"
end
end
# 呼び出し例
end_other('Hiabc', 'abc')
解説
sliceメソッドは配列から要素を取り出す事ができる。
array = ["Ruby","Python","Java"]
p array.slice(0)
実行結果
"Ruby"
逆にマイナス使って、配列の最後の要素から取り出すこともできる
array = ["Ruby","Python","Java"]
p array.slice(-1)
実行結果
"Java"
解答では
a_down = hiabc
b_down = abc
a_len = 5
b_len = 3
と代入されている。
if文でabcの最後にHiabcが含まれているか、
Hiabcの最後にabcが含まれているか判別している。
左辺
b_down.slice(-(a_len)..- 1) は、 b_down.slice(-5..-1)
b_down = abc となっているので範囲外(-5もない)
為切り取る事ができない。
その結果、nil == a_downとなるのでfalseが返される。
右辺
a_down.slice(-(b_len)..- 1) は、 a_down.slice(-3..-1)
インデックス番号-3から-1という条件で切り取るとabcが残る。
結果、abc == b_downとなるので、trueで返される。