如何翻译字符串中的所有字符

时间:2019-02-01 20:56:22

标签: r string

我正在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中是否有一个函数可以反转字符串中的字符?

4 个答案:

答案 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"