yuuki blog

プログラミング をアプトプットしています。

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となり条件を満たすことになります。