rot13を復号するスクリプトを書いてみた

class Rot
  
  def initialize(cipher)
    @cipher = cipher
    @chars = "abcdefghijklmnopqrstuvwxyz"
  end

  # 文字をn文字ズラす(加算)
  def rotate_c(c, n)
    ind = @chars.index(c)
    new_ind = ind + n
    if new_ind > @chars.length - 1
      new_ind = new_ind % @chars.length
    end
    @chars[new_ind]
  end

  # 文字列(各文字)をn文字ズラす
  def rotate(n)
    new_chars = []
    for i in 0...@cipher.length
      c = @cipher[i]    # i + 1番目の文字
      begin
        new_c = rotate_c(c.downcase, n)
      rescue
        new_c = c    # 対応する文字がなければそのまま
      end
      if 65 <= c.ord and c.ord <= 90    # 大文字なら
        new_c.upcase!
      end
      new_chars.push(new_c)
    end
    new_chars.join ""
  end

  # 変換対応表を表示する
  def table
    puts "[- n]: result"
    puts "--------------"
    for i in 0...26
      puts "[-%2s]: #{rotate(-i)}" % i
    end
  end

end

# s = "xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}"
# r = Rot.new(s)
# r.table
# =>
# [- n]: result
# --------------
# [- 0]: xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}
# [- 1]: wxypb{s3_pdkqcdp_s3_j33z3z_kj3_kb_pd3o3}
# ...

もっと抽象化して、rot47その他も共通の仕組みでできるのか
もう少し考える。