topcoder sample1

与えられた英語の大文字で構成された文字列の中の文字を、与えられた数字の分だけ左にシフトさせなさい。
たとえば、'C' を 2 つ左にシフトさせると 'A'、'Z' を 2 つ左にシフトさせると 'X'。 与えられる英語の文字列は A から Z で、A の次は Z にシフトさせるものとする。

やってみた。

class String
  def left_shift(n)
    alpha = ('A'..'Z').to_a.join
    self.tr(alpha, (alpha + alpha)[alpha.size - n % alpha.size, alpha.size])
  end
end

a2z = ('A'..'Z').to_a.join        # => "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

'VQREQFGT'.left_shift(2)          # => "TOPCODER"
a2z.left_shift(10)                # => "QRSTUVWXYZABCDEFGHIJKLMNOP"
'TOPCODER'.left_shift(0)          # => "TOPCODER"
'LIPPSASVPH'.left_shift(4)        # => "HELLOWORLD"

a2z.left_shift(1)                 # => "ZABCDEFGHIJKLMNOPQRSTUVWXY"
a2z.left_shift(26)                # => "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
a2z.left_shift(27)                # => "ZABCDEFGHIJKLMNOPQRSTUVWXY"
a2z.left_shift(-1)                # => "BCDEFGHIJKLMNOPQRSTUVWXYZA"
a2z.left_shift(-26)               # => "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
a2z.left_shift(-27)               # => "BCDEFGHIJKLMNOPQRSTUVWXYZA"

"ST WZGD, ST QNKJ.".left_shift(5) # => "NO RUBY, NO LIFE."

String#tr を使うのが常套手段。たぶん。
効率が良いかどうかは不明。