Как указано в комментариях, chartr
- хороший вариант для этого. Кроме того, как указано в ответе @ StupidWolf, потребуется seed
, поэтому я написал функцию, включающую set.seed
. Вот один из вариантов:
opt1 <- function(word, seed = 1) {
set.seed(seed)
a <- matrix(sample(letters, 26), nrow = 2, ncol = 13)
b <- apply(a, 1, paste, collapse = "")
chartr(paste(b, collapse = ""), paste(rev(b), collapse = ""), tolower(word))
}
Вот функция в действии:
opt1("house")
# [1] "ianes"
opt1(opt1("house"))
# [1] "house"
## Different seed
opt1("house", 2)
# [1] "batlr"
В качестве альтернативы функцию можно записать так, используя strsplit
и match
. Обратите внимание, что я только что расширил таблицу поиска, чтобы упростить работу.
opt2 <- function(word, seed = 1) {
set.seed(seed)
a <- matrix(sample(letters, 26), nrow = 2, ncol = 13)
a <- cbind(a, a[2:1, ])
s_word <- strsplit(tolower(word), "", TRUE)[[1]]
paste(a[2, ][match(s_word, a[1, ])], collapse = "")
}
Лично мне opt1
нравится больше из-за того, как он обрабатывает более длинные строки. Из-за использования match
в opt2
символы, которых нет на входе, сопоставляются с NA
, что может привести к некрасивому результату. Рассмотрим следующие примеры:
opt1("This is a string, isn't it?")
# [1] "rihe he o erthuj, heu'r hr?"
opt2("This is a string, isn't it?")
# [1] "riheNAheNAoNAerthujNANAheuNArNAhrNA"
В этом случае только opt1
более или менее обратимо (без заглавных букв):
opt1("rihe he o erthuj, heu'r hr?")
# [1] "this is a string, isn't it?"