Rを使わない人にはなんのこっちゃという話で恐縮だが、院生とまだまだやっています。下巻に進んで、

の第6章。6章の練習問題の1(エニグマの数学)は、簡易版のエニグマ暗号機の組み合わせの数を計算したり、アルファベットの変換を実装しちゃおうぜというもの(エニグマについてはこちらなどを参照)。こういうのは俄然萌えるかつ燃える(P(萌かつ燃)=P(萌|燃)P(燃)=P(燃|萌)P(萌))。

検索したら誰かがやってくれたのがすぐあるんじゃないのと思ったら、別の言語のはいくつか並んだが、Rでやったものは意外と見つからない様子。

ということで、簡易版(の一歩目)を実装してみた。2*13を出力にしなさいという指示に沿って、

plugboard <- function(x = 13){
pairs <- matrix(nrow = 2, ncol = x)
enigma <- sample(letters, 26, replace = FALSE)
for(i in 1:x){
pairs[, i] <- c(enigma[i*2-1], enigma[i*2])
}
print(pairs)
}

plugboard()

という具合。「任意のアルファベットを2個ずつランダムに取り出して、それを26文字からどんどん取り除いていく」という方が元の要求に近いが、テキストでは%in%などはまだ登場していないので。

もっとうまいやり方があれば教えてください。そして、これを利用した暗号化の関数は院生が格闘中。

(追記)村上明さん(バーミンガム大学)が教えてくれたのですが、

pairs <- matrix(sample(letters, replace = FALSE), nrow = 2)

という一行で同じ結果が出せることがわかりました。だとすると、関数を作る必要があったのかどうか…それこそがエニグマ。