ガラケーを使っている人が出した暗号というのが,ヒントなんだろうとピンときた。
2 タッチ入力かと思ったが,ちょと違った。
ケータイ入力の方だ。
まずは,平文化
decoding = function(x) {
char = list(c("あ", "い", "う", "え", "お", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ"),
c("か", "き", "く", "け", "こ"),
c("さ", "し", "す", "せ", "そ"),
c("た", "ち", "つ", "て", "と", "っ"),
c("な", "に", "ぬ", "ね", "の"),
c("は", "ひ", "ふ", "へ", "ほ"),
c("ま", "み", "む", "め", "も"),
c("や", "ゆ", "よ", "ゃ", "ゅ", "ょ"),
c("ら", "り", "る", "れ", "ろ"),
c("わ", "を", "ん", "ゎ"))
res = NULL
result = sapply(x, function(z) {
z1 = z%/%10
if (z1 == 0) z1 = 10
z2 = z%%10
res = c(res, char[[z1]][z2])
})
return(res)
}
decoding(c(11,32,41,25,46,35,92,33,71,65,52,43,12,44,15,32,14,44,23,94))
decoding(c(25,94,21,91,75,94,03,91,23,61,25,55,65,13,65,13))
暗号化も考えれば,文字と数字の対応ベクトルを作っておけばよい。
2 つの関数に同じデータを書くのは気が進まないので,暗号化か平文化かを引数で指定するようにしよう。
なお,作者の暗号法では,「ぉ」をどのように表すかが不定であることが明らかになったが,「ぉ」は 10 で表すようにしておく。
結果は関数の中で cat によって書き出す仕様にした。
ango = function(x, way=c("decoding", "encoding")) {
char = c("あ", "い", "う", "え", "お", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
"か", "き", "く", "け", "こ",
"さ", "し", "す", "せ", "そ",
"た", "ち", "つ", "て", "と", "っ",
"な", "に", "ぬ", "ね", "の",
"は", "ひ", "ふ", "へ", "ほ",
"ま", "み", "む", "め", "も",
"や", "ゆ", "よ", "ゃ", "ゅ", "ょ",
"ら", "り", "る", "れ", "ろ",
"わ", "を", "ん", "ゎ")
num = c(11:19, 10, 21:25, 31:35, 41:46, 51:55, 61:65, 71:75, 81:86, 91:95, "01", "02", "03", "04")
way = match.arg(way)
if (way == "decoding") {
x = as.character(x)
result = sapply(x, function(z) {
if (nchar(z) == 1) z = sprintf("0%s", z)
char[grep(z, num)]
})
cat(paste(result, collapse=""))
} else {
x = unlist(strsplit(x, ""))
result = sapply(x, function(z) {
sprintf("%02i", as.integer(num[grep(z, char)]))
})
cat(result)
}
}
ango(c(11,32,41,25,46,35,92,33,71,65,52,43,12,44,15,32,14,44,23,94))
ango(c(25,94,21,91,75,94,03,91,23,61,25,55,65,13,65,13))
ango("りょうかいしました", way="encoding")
ango("あしたのおひるあいてます", way="e")
ango(c(92, 86, 13, 21, 12, 32, 71, 32, 41), way="d")
ango(c(11, 32, 41, 55, 15, 62, 93, 11, 12, 44, 71, 33))