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