Ruby API問題
問題
任意の2つの文字列があります。
どちらかの文字列がもう一方の文字列の最後にある場合はTrueを、ない場合はFalseを出力するプログラムを作りましょう。大文字と小文字は区別されません。
出力例:
- end_other('Hiabc', 'abc') → True
- end_other('AbC', 'HiaBc') → True
- end_other('abc', 'abXabc') → True
- end_other('abc', 'abXabt') → False
自分の答え
def end_other(num1,num2) num1_down = num1.downcase #値を全て小文字に変換します num2_down = num2.downcase num1_len = num1.length #値を長さに変換します num2_len = num2.length if num2_down == num1_down.slice(-(num2_len),num2_len) || num1_down == num2_down.slice(-(num1_len),num1_len) puts "True" else puts "False" end
模範回答
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
条件式の左b_down.slice(-(a_len)..- 1)にこれまでわかっていることを当てはめると、b_down.slice(-5..-1)となります。しかし、b_downは'abc'であるため3文字しかありません。したがってインデックス番号-5から-1という条件で切り取ることができません。そのため、この部分はnilとなります。結果、nil == a_downについてはfalseになります。
続いて条件式の右を見てみましょう。同様に、a_down.slice(-(b_len)..- 1)について、これまでわかっていることを当てはめると、a_down.slice(-3..-1)となります。a_downは'hiabc'という文字列です。'hiabc'.slice(-3..-1)は'abc'であるため、'abc' == b_downとなり条件を満たすことになります。