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 を使うのが常套手段。たぶん。
効率が良いかどうかは不明。