【问题标题】:Replace letters with ciphertext ones用密文替换字母
【发布时间】:2024-01-12 10:56:01
【问题描述】:

我一直在玩R的gsub2函数R: replace characters using gsub, how to create a function?创建密文:

from<-c('s','l','k','u','m','i','x','j','o','p','n','q','b','v','w','z','f','y','t','g','h','a','e','d','c','r')
  to<-c('z','e','b','r','a','s','c','d','f','g','h','i','j','k','l','m','n','o','p','q','t','u','v','w','x','y')

例如:

原文:the who's 1973

密文:ptv ltn'm 1973

问题是,gsub2 将某些字母替换了两次(o->f->n 和 s->z->n),这弄乱了我的密文,几乎无法解码。谁能指出我犯的错误?谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    一种方法是使用命名向量作为编码密码。创建此类命名向量的一种简单方法是使用setNames

    cipher <- setNames(to, from)
    cipher
      s   l   k   u   m   i   x   j   o   p   n   q   b   v   w   z   f   y   t   g   h   a   e   d   c   r 
    "z" "e" "b" "r" "a" "s" "c" "d" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "t" "u" "v" "w" "x" "y" 
    

    编码功能可以使用strsplitpaste

    encode <- function(x){
      splitx <- strsplit(x, "")[[1]]
      xx <- cipher[splitx]
      xx[is.na(xx)] <- splitx[is.na(xx)]
      paste(xx, collapse="")
    }
    
    encode("the who's 1973")
    [1] "ptv ltf'z 1973"
    

    【讨论】:

      【解决方案2】:

      您也可以使用chartr,如您引用的问题的(受欢迎的:12 ups)回答中提到的那样:

      cipher <- function(x) 
          chartr( "slkumixjopnqbvwzfytghaedcr", "zebrascdfghijklmnopqtuvwxy", x )
      

      【讨论】: