topcorder sample1

topcoderの道1|プログラミングに自信があるやつこい!!

問題

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

例1)

"VQREQFGT"
2
Returns: "TOPCODER"

例2)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
10
Returns: "QRSTUVWXYZABCDEFGHIJKLMNOP"

例3)

"TOPCODER"
0
Returns: "TOPCODER"

例4)

"LIPPSASVPH"
4
"HELLOWORLD"



クラス名: CCipher
メソッド名: decode
メソッドの引数: String , int
リターン: String
メソッド: String decode(String ciphertest, int shift)

やってみた

class CCipher
  ALPHABET_CNT = 26
  def decode(ciphertest, shift)
    ciphertest.each_byte.inject("") do |res,s|
      s += ALPHABET_CNT if s - shift < "A"[0]
      res + (s - shift).chr
    end
  end
end

c = CCipher.new
c.decode("VQREQFGT", 2)
c.decode("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10)
c.decode("TOPCODER", 0)
c.decode("LIPPSASVPH", 4)

最初は

succとか使えないかなぁと思ったが、
each_byteを使えばいいことに気付いた。
あとは、Aの次をZにするだけ。

>> "A"[0]
=> 65
>> "Z"[0]
=> 90