Hatena::Grouprubyist

うんたらかんたらRuby RSSフィード

2010-02-22topcorder sample1

topcorder sample1

| topcorder sample1 - うんたらかんたらRuby を含むブックマーク はてなブックマーク - topcorder sample1 - うんたらかんたらRuby

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

yyamasakyyamasak2010/02/23 18:42"VQREQFGT".shift(2)

Rubyだと反則ですね。

rochefortrochefort2010/02/23 19:06うぉ、こんな書き方できるんですか!
rvmでも入れて試してみます。

rochefortrochefort2010/03/04 23:02"VQREQFGT".shift(2)
1.9.1で試してみたんですが、これ動きませんでした。
どうやるんでしょうか?

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100222