シーザー暗号とは

55日目です。 スクールのミニ問題で、全く聞いたことがなかった「シーザー暗号を復号せよ」という問題が出てきて衝撃を受けたので、調べました。

シーザー暗号とは

古代ローマの政治家、軍人だった「ジュリアス・シーザーが」使っていたとされる暗号。 平文で使われているアルファベットを辞書順に3文字分シフトした(ずらした)もの(文字のシフト数は固定であるが、3に限る必要はない)。 例えば左に3文字分シフトさせる場合、「D」は「A」に置き換わり、同様に「E」は「B」に置換される。 そのため、暗号文のアルファベットをそれぞれ逆方向に同じ文字数だけずらせば復号できる。

シーザー暗号 - Wikipedia

シーザー暗号を Ruby で解読する - ✲゚。.ヾ(⌒(ノ'ω')ノ☆.。

実際の例文

下記を復号するコードをかけ。
char = "frqjudwxodwlrq"

答え

char = "frqjudwxodwlrq"
char_ary = char.split("")

changed_char_ary = []

char_ary.each do |char|
  changed_char_ary << (char.ord - 3).chr
end

p changed_char_ary.join

最初は全く意味がわからなかったので、メソッドの意味を調べていきました。

ord
stringをintegerに変換してくれるメソッド。 例えば、irb上で

"a".ord

と打ち込めば、「97」という数字を返してくれます。

chr
integerをstringに変換してくれるメソッド。 こちらもirb上で

97.chr

と打ち込めば、「"a"」という数字を返してくれます。

Class: String (Ruby 2.2.0)

Class: Integer (Ruby 2.2.0)

【Ruby】ordメソッドとchrメソッドで、1文字とコードポイントの変換 - コンパイラかく語りき

ざっくりと解説してみます

  1. 暗号文「frqjudwxodwlrq」を変数charに代入
  2. split("")で「 ["f", "r", "q", "j", "u", "d", "w", "x", "o", "d", "w", "l", "r", "q"]」に分けてchar_aryに代入
  3. 空の配列のかっこ[ ]を用意して変数changed_char_aryに代入
  4. each文でchar_aryの配列に入った文字を一つずつ取り出す
  5. 取り出した文字を「ord」で数字に変換し3を引いた後に「chr」で文字に戻し、順番にchanged_char_aryに入れていく
  6. joinメソッドを使ってchanged_char_aryに入れられた文字を合体する
  7. pで出力する
  8. "congratulation"という文字列が返ってくる

本日は個人アプリ制作2日目でした。テーブルを作り終わり、バックエンドとフロントを徐々に弄って形になってきました。
ただ、カッコイイアプリにするためにはJavaScriptの力が必要だと思うので、残り5日間でなんとか学習&実装していきます!!