シーザー暗号とも呼ばれる回転暗号を実装してみましょう。
シーザー暗号は、0から26までの整数の鍵を使って、アルファベットのすべての文字をずらす、単純なシフト暗号です。
鍵に0または26を使うと、剰余演算により、常に同じ結果になります。
文字は、鍵の値と同じ数だけずれます。
回転暗号の一般的な表記はROT + <key>です。
最もよく使われる回転暗号はROT13です。
ROT13をラテンアルファベットに適用すると、次のようになります。
Plain: abcdefghijklmnopqrstuvwxyz
Cipher: nopqrstuvwxyzabcdefghijklm
回転暗号は、鍵の候補が27通りあり、そのうち使えるのが25通りなので、アトバシュ暗号よりも強力です。
暗号文は、スペースや句読点も含めて、入力と同じ書式で書き出されます。
omgをtrlにしますcをcにしますCoolをCoolにしますThe quick brown fox jumps over the lazy dog.をGur dhvpx oebja sbk whzcf bire gur ynml qbt.にしますGur dhvpx oebja sbk whzcf bire gur ynml qbt.をThe quick brown fox jumps over the lazy dog.にします非標準の文字列リテラルとメタプログラミングを試すのにうってつけの演習です。
非標準の文字列リテラルの簡単な紹介は、こちらのブログ記事にあります。メタプログラミングの詳しいガイドは、マニュアルにあります。
以下で説明する機能を追加して、自分の解答を拡張できます。
ボーナスAに必要なのは、ブログ記事で説明されている基本だけです。ボーナスBには、Juliaでのメタプログラミングに関する、より高度な知識が必要です。
文字列に対してROT13として働く文字列リテラルを実装しましょう。
R13"abcdefghijklmnopqrstuvwxyz" == "nopqrstuvwxyzabcdefghijklm"
文字列をiの値だけずらす文字列リテラルR<i>(i = 0, ..., 26)を実装しましょう。
R0"Hello, World!" == "Hello, World!"
R4"Testing 1 2 3 testing" == "Xiwxmrk 1 2 3 xiwxmrk"
R13"abcdefghijklmnopqrstuvwxyz" == "nopqrstuvwxyzabcdefghijklm"