如何编写适配指定加密规则的Ruby字符串解密方法
解密方法实现
核心问题解决思路
顺着给定的加密规则反向推导,两个卡点的处理逻辑非常明确:
- 加密时对原单词做了首字母替换为ASCII编码、第二个字母和最后一个字母互换两个操作。由于互换是对称操作,解密时只需要对剔除数字后的剩余字符段,再执行一次第一个字符和最后一个字符的互换,就能还原出原单词去掉首字母的部分。
- 把还原得到的首字母,和处理好的剩余字符段拼接成完整单词,最后将所有处理完成的单词用空格连接,就是最终的解密结果。
边界处理
当剔除数字后的剩余字符长度小于2时,不存在可独立互换的两个字符,直接使用原剩余串即可,避免空范围操作引发的异常。
Ruby风格的完整实现
def decipher(string) string.split.map do |word| # 提取连续数字,转为对应ASCII字符作为单词首字母 first_char = word[/\d+/].to_i.chr # 剔除数字得到原单词去掉首字母的剩余串 rest_str = word.gsub(/\d+/, "") # 对剩余串做首尾字符互换 processed_rest = if rest_str.length >= 2 rest_str[-1] + rest_str[1..-2] + rest_str[0] else rest_str end # 拼接为完整解密单词 first_char + processed_rest end.join(" ") end
实现说明
- Ruby字符串支持负索引取值:
rest_str[-1]直接获取最后一个字符,rest_str[1..-2]获取从第二个字符到倒数第二个字符的中间段,rest_str[0]获取第一个字符,三者拼接就完成了首尾互换。 - 用正则
word[/\d+/]直接匹配字符串中的连续数字,比手动调用match的写法更简洁,是Ruby的惯用写法。 - 不带参数的
split方法会自动按任意长度的空白符拆分,比手动指定分割符为空格的兼容性更好。
效果验证
运行测试用例的输出结果完全匹配给定的规则:
decipher("65 119esi 111dl 111lw 108dvei 105n 97n 111ka") # 输出:"A wise old owl lived in an oak" decipher("84eh 109ero 104e 115wa 116eh 108sse 104e 115eokp") # 输出:"The more he saw the less he spoke" decipher("84kanh 121uo 80roti 102ro 97ll 121ruo 104ple") # 输出:"Thank you Piotr for all your help"
内容的提问来源于stack exchange,提问作者Sam P
相关产品推荐
相关产品推荐

