hibikousinnkibouのブログ

駆け出しプログラマーによる足跡ブログ

slice,downcase を利用した問題

問題

以下の要件を満たすend_otherメソッドの実装。

  • メソッドの引数に、任意の2つの文字列を指定する。
  • 引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
  • 上記を満たせていない場合は、Falseを出力する
  • 入力された文字が大文字でも小文字でも、同一の文字として処理を行う
def end_other(a, b)
  # 処理を記述
end

# 呼び出し例
end_other('Hiabc', 'abc')

出力例

end_other('Hiabc', 'abc') → True
end_other('AbC', 'HiaBc') → True
end_other('abc', 'HaIoBc') → False

ヒント

・ slice は、範囲を指定して要素を切り取るメソッド

・ downcase は、大文字を小文字に変換するメソッド

 

この問題に対し、私の答えは

def end_other(a, b)
a_s = a.slice(-3..-1)
b_s = b.slice(-3..-1)
if a_s.downcase == b_s.downcase
puts "True"
else
puts "False"
end
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')

となり、 a の長さ分だけ b を後ろから最後の一文字まで切り取り、 b にも同じことを行う。それのどちらかが true の時に "True" を返すようにするという形であった。