解释
为了好玩,我正在构建一个简单的单词加扰器/编码器。给定一个种子和要转换的文本,使原始字符串变得难以辨认的算法是:
- 遍历用户给定种子的字符,比如“lkj”
- 遍历要转换的文本字符,说“你好”
- 根据可接受的字符列表获取两者的索引;所以如果
[a-z]
是可以加扰的字符,并且循环在种子和转换文本的索引 0 上,我会得到l = index 11
和h = 索引 7
- 将这两个索引相加。
11 + 7 = 18
。如果索引超过接受列表的长度,则减少新索引的长度(例如33 - 26
)。 - 获取接受列表中索引 18 对应的字符。
s 在索引 18 处
- 重复直到循环遍历所有的转换字符,如果文本超过种子的长度则返回当前种子索引为0
我们以“souwy”结尾。
解码文本的算法(应该使用相同的种子)只是向后做所有事情。从字符串的末尾开始,在它将停止的索引处开始向后循环遍历种子 (seed.length % text.length
),减去索引而不是添加,然后反转生成的字符串.因此,如果我们输入“lkj”作为种子并输入“souwy”作为转换文本,我们将在解码时返回“hello”。
问题
解码似乎只有时 有效。对于种子和转换文本的某种组合,算法失败了——但我不知道它可能是什么。例如,使用以下信息:
Seed: lkj
Input: Hey guys! My email is yay@someDomain.com, but don't send me anything U_U
解码失败。但是,如果将“x”添加到输入的末尾,它就可以工作。可能出了什么问题?
最佳答案
当消息的长度是种子长度的倍数时,看起来你有一个错误。
问题行是:
var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : 0
应该改为:
var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : seed.length - 1;
这是一个 working version .
关于javascript - 向后编写文本置乱算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436179/