LoginSignup
1
1

More than 5 years have passed since last update.

Rで単換字式暗号(ROT13)

Last updated at Posted at 2017-12-12

はじめに

特殊なコーディングでも、特殊なパッケージを使用しているわけでもありません。
仕事で文字列を処理することは少ないため普段使用しない関数などの発見があったため記事として残したいと考えました。
今回はシンプルな内容ですが、段階を踏んで有用な関数作成にも挑戦したいと思います。

ROT13(rotate by 13 places)とは

単換字式暗号(シーザー暗号)の一つで、アルファベットを一文字毎に13文字後のアルファベットに置き換えます。
例: Hello → Uryyb
アルファベットは26文字のため、2度暗号化することで元の文字列に戻ることが特徴です。

Rでコーディング

以下が作成したROT13暗号化関数です。

ROT13 <- function(x) {
  chr.old <- paste(c(LETTERS, letters), collapse="")
  chr.new <- paste(substr(chr.old, 14, 26), substr(chr.old, 1, 13), 
                  substr(chr.old, 40, 52), substr(chr.old, 27, 39), 
                  collapse="", sep="")
  return(chartr(chr.old, chr.new, x))
}

関数内での処理内容

まず、変換する前の大文字小文字の2*26文字を格納した変数chr.oldを作成します。
LETTERSはデフォルトで用意されている大文字A~Zを一文字ずつ格納しているベクトルで、lettersLETTERSを小文字にしたベクトルです。
後述しますが、関数chartr()で使用するためにベクトル内の各要素をpaste(, collapse="")で結合します。
変数chr.newchr.oldの大文字と小文字をそれぞれ13文字ずらした並びにした文字列を格納します。
最後に、関数chartr()で引数の文字列を置換した結果を返します。
chartr(old, new, x)oldと一致するxの文字をnewに変換します。
oldnewは同じ位置の文字が対応します。つまり、oldの1文字目がnewの1文字目に、oldの2文字目がnewの2文字目に変換されます。

今回の場合だと以下のようになります。
old: ABC・・・NML・・XYZabc・・・nml・・・xyz
new: NOP・・・ABC・・KLMnop・・・abc・・・klm
A→N, X→K, n→a, z→m

実行結果

上記関数をテストデータで実行。
ss_ROT13result.png

参考文献

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1