我正在R中构建一个函数,该函数将一个字符串(如“ ABCDEFG”)和一个矩阵作为输入,然后根据矩阵将字符串中的每个字符转换为另一个字符串。
我尝试的代码是这样的:
plugboard <- function() {
matrix(sample(letters, 26,
replace = FALSE, prob = NULL),
nrow = 2, ncol = 13)
}
这将生成一个两行的矩阵,其中每列中有两个配对的字母。
此函数根据第一个函数中生成的矩阵对字符串中的字符进行解码:
decoder <- function(message, matrix) {
message = tolower(message)
for (i in 1:13){
message = gsub(matrix[1,i], matrix[2,i], message)
}
return(message)
}
我得到的结果是这样的(x
是矩阵,m
是字符串):
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] "w" "f" "u" "p" "g" "i" "j" "o" "b" "q" "z" "d" "c"
[2,] "k" "s" "a" "l" "m" "e" "n" "r" "y" "t" "x" "v" "h"
> m = "wfupksal"
> decoder(m,x)
[1] "wfupwfup"
>
应将“ wfupksal”转换为“ ksalwfup”。
我的意思是代码应该将第1行中的所有字符转换为第二行中的字符,反之亦然。但是我只能采取一种方法(将第2行中的所有字符更改为第1行中的字符)。
示例:如果我们以上面的矩阵“ x”为例,则字符串“嘿,你好吗”应转换为“ cib crk uoi bra”。在这种情况下,字符串中第一行中的所有字符都会更改为第二行中的字符,反之亦然。
R中是否有一个函数可以反转字符串中的字符?
答案 0 :(得分:6)
不明确的情况下,也许
v1 <- apply(x, 1, paste, collapse="")
chartr(paste(v1, collapse=""), paste(rev(v1), collapse=""), m)
#[1] "ksalwfup"
答案 1 :(得分:3)
@akrun的解决方案更加优雅,并为我chartr
引入了一个新功能,但这是一个更为冗长的方法,包括演练:
mat <- matrix(letters[1:6], nrow = 2, byrow = TRUE)
mat
# [,1] [,2] [,3]
# [1,] "a" "b" "c"
# [2,] "d" "e" "f"
inputs <- mat[1, ]
outputs <- mat[2, ]
# See how this gives you 1 3
match(c("a", "c"), inputs)
# Then...
outputs[match(c("a", "c"), inputs)]
# So...
paste(outputs[match(unlist(strsplit("ac", "")), inputs)], collapse = "")
# In a function:
decode <- function(matix, string) {
inputs <- mat[1, ]
outputs <- mat[2, ]
paste(outputs[match(unlist(strsplit(string, "")), inputs)], collapse = "")
}
decode(matix, "ac")
# [1] "df"
答案 2 :(得分:1)
首先,我将创建一个垫,并定义一个消息:
set.seed(1)
mat <- plugboard()
message <- "isbba"
现在可以解决用于使用功能的每个字母的问题:
decode_letter <- function(mat, letter){
pos <- which(letter == mat, arr.ind = T)
letter <- mat[ifelse(pos[1] == 1, 2, 1), pos[2]]
return(letter)
}
此后,您可以拆分邮件并为所有字母应用该功能:
message_split <- unlist(strsplit(x = message, split = ""))
letter_dec <- sapply(message_split, FUN = decode_letter, mat = mat, simplify = T)
message_dec <- paste(letter_dec, collapse = "")
message_dec
[1] "hello"
我希望它能起作用!
答案 3 :(得分:0)
是游戏的末尾,但是可以容纳消息中空格的功能:
set.seed(42)
x <- plugboard()
message <- "example text"
codedecode <- function(message_, matrix) {
output <- ""
newmat <- matrix[nrow(matrix):1, ]
splitmessage <- unlist(strsplit(message_, ""))
for (i in splitmessage) {
nl = newmat[which(matrix == i)]
output <-
paste(output, ifelse(length(nl != 0), nl, " "), sep = "")
}
return(output)
}
> scrambled <- codedecode(message, x); print(scrambled)
[1] "izqpmri gizg"
> unscrambled <- codedecode(scrambled, x); print(unscrambled)
[1] "example text"