如何利用已创建的密码替换板函数实现单词加解密?
修复你的Enigma替换板加解密函数
我来帮你搞定这个加解密函数!你的原始代码有几个关键问题:变量引用混乱、没实现双向替换逻辑,也没正确处理字符映射。我们一步步来修正:
先明确问题核心
替换板的逻辑是双向映射:比如你的示例里h对应q,那q也必须对应h;不管输入是大写还是小写,最终输出统一为小写(和你的示例要求一致)。
先回顾你的替换板生成函数
这个是没问题的,我们保留:
plugboard <- function(){ matrix(sample(letters, 26), nrow = 2, ncol = 13) }
正确的加解密函数实现
下面这个函数支持双向加解密,能处理大小写输入,完全符合你的需求:
plugboard_cipher <- function(word, plug_matrix) { # 1. 将输入统一转为小写,确保大小写不影响结果 word_lower <- tolower(word) # 2. 创建双向映射表:把替换板的两行互相映射 # 第一行字符 -> 第二行字符,同时第二行字符 -> 第一行字符 mapping <- c( setNames(plug_matrix[2, ], plug_matrix[1, ]), setNames(plug_matrix[1, ], plug_matrix[2, ]) ) # 3. 拆分输入字符,逐个替换后拼接成结果 chars <- strsplit(word_lower, "")[[1]] replaced_chars <- mapping[chars] # 4. 返回最终拼接后的字符串 paste(replaced_chars, collapse = "") }
测试你的示例场景
用你提供的替换板矩阵来验证:
# 初始化你给的示例替换板 example_plug <- matrix( c("v","h","k","a","w","l","f","d","u","r","t","m","s", "p","q","b","g","x","y","i","n","z","o","j","e","c"), nrow = 2, ncol = 13 ) # 测试加密:输入大写/小写的HOUSE plugboard_cipher("HOUSE", example_plug) # 输出 "qrzcm" plugboard_cipher("house", example_plug) # 同样输出 "qrzcm" # 测试解密:输入qrzcm plugboard_cipher("qrzcm", example_plug) # 输出 "house"
你的原始函数的问题分析
- 变量逻辑混乱:函数参数是
word,但你直接用未定义的x,还写了word <- x,完全搞反了变量赋值 - 大小写处理无效:
tolower(x)只是调用了函数,但没有把结果赋值给变量,所以输入的大写字母不会被转换 - 替换逻辑不完整:只做了第一行到第二行的单向替换,没有处理反向解密的情况;而且
gsub的替换方式不如向量索引精准 - 缺少返回值:函数最后没有返回任何结果,所以运行后不会输出内容
内容的提问来源于stack exchange,提问作者rauls__
相关产品推荐
相关产品推荐

