Open2

Caesar Cipher

cordeliacordelia

マジックナンバーを排除したかったが、変数が増えて命名が長くなりがち。
今回は割り切って使うか?

string = "Hello World"
shift = 3

def encipher(string, shift)
  string.each_codepoint.map do |point|
    if point.chr.match?(/[A-Z]/)
      ((point + shift - 65) % 26 + 65).chr
    elsif point.chr.match?(/[a-z]/)
      ((point + shift - 97) % 26 + 97).chr
    else
      point.chr
    end
  end.join
end

p encipher(string, shift)
cordeliacordelia

変更

  • 明示的に半角スペースに対応するようにした
  • 一部コードを変更
string = "Hello world"
shift = 3

def encipher(string, shift)
  if string.match?(/[^A-Za-z\x20]/)
    return "Please enter only alphabets."
  end
  
  string.each_codepoint.map do |point|
    if point.chr.match?(/[A-Z]/)
      ((point + shift - 65) % 26 + 65).chr
    elsif point.chr.match?(/[a-z]/)
      ((point + shift - 97) % 26 + 97).chr
    elsif point.chr.match?(/[\x20]/)
      point.chr
    end
  end.join
end

p encipher(string, shift)