対象読者
プログラミング初学者
シーザー暗号とは
シーザー暗号(Caesar cipher)は単一換字式暗号の一種で、平文の各文字を、辞書順に3文字分シフトして暗号文を作る暗号である。
古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が使用したことから、この名称がついた。
例題
「khoorzruog」という文字列があり、これを3文字ずらす(戻す)と復号できることがわかっている。
それを実現させるコードを記述する。
事前知識
splitメソッド
文字列を分割して配列にするためのメソッド。
型は以下の通り。
文字列.split("")
例えば
str = "abc"
array = str.split("")
p array # 出力結果 ["a", "b", "c"]
joinメソッド
配列の中の要素を文字列にしてそのまま連結させるメソッド。
型は以下の通り。
配列.join
引数を取ることも出来ますが今回は割愛。
ordメソッド
文字列の最初の文字の文字コードを整数で返すメソッド。
例えば
p "a".ord # 出力結果 97
文字コードとは、電子媒体において、文章を画像などの図形データとして扱わずに、テキストの形式で扱う場合に、その各文字に対して持っているコードのこと。
chrメソッド
ordメソッドの逆で文字コードから文字を返すメソッド。
例えば
p 97.chr # 出力結果 "a"
解答
# シーザー暗号を変数に代入する。
caesar_cipher = "khoorzruog"
# splitメソッドで上記変数の文字列を分割する。
code = caesar_cipher.split("") # => ["k", "h", "o", "o", "r", "z", "r", "u", "o", "g"]
# 新たに配列を作成する。
array = []
# 分割された文字がordメソッドで文字コードに変換され、3文字ずらす(-3)ことで元のコードの文字コードに戻す。chrメソッドでその文字コードを文字に戻す。
code.each do |i|
array << ( i.ord - 3 ).chr
end # 出力結果 ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]
p array.join # 出力結果 "helloworld"