向后编写文本加扰算法

时间:2014-05-02 20:11:02

标签: javascript jquery algorithm

解释

我正在构建一个简单的单词加扰器/编码器以获得乐趣。给定种子和要转换的文本,将原始字符串变得难以辨认的算法是:

  1. 循环播放用户指定种子的字符,例如“lkj”
  2. 循环浏览要转换的文字的字符,说“你好”
  3. 根据接受的字符列表获取两者的索引;因此,如果[a-z]是可以加扰的字符,并且种子和转换文本的循环都在索引0上,我会得到l = index 11h = index 7
  4. 将这两个指数加在一起。 11 + 7 = 18。如果索引超过了接受列表的长度,则从新索引中减去该长度(例如33 - 26)。
  5. 在接受列表中获取与索引18对应的字符。 s is at index 18
  6. 重复直到所有转化字符都已循环播放,如果文本超出种子长度,则将当前种子索引返回到0
  7. 我们最终得到了“souwy”。

    解码文本的算法(应该使用相同的种子)只是向后做所有事情。从字符串的末尾开始,在它将停在(seed.length % text.length)的索引处向后循环遍历种子,减去索引而不是添加,然后反转生成的字符串。因此,如果我们输入“lkj”作为种子并将“souwy”作为转换文本输入,我们将在解码时返回“hello”。

    问题

    解码似乎只能有时。通过种子和转换文本的某种组合,算法失败了 - 但我不知道它可能是什么。例如,使用以下信息:

      种子:lkj

         

    输入:嘿伙计们!我的电子邮件是yay@someDomain.com,但是没有给我发送任何东西U_U

    解码失败。但是,如果在输入的末尾添加了'x',它就可以工作。可能出现什么问题?

    Fiddle

1 个答案:

答案 0 :(得分:2)

当邮件的长度是种子长度的倍数时,您看起来有一个错误。

问题在于:

var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : 0

应更改为:

var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : seed.length - 1;

这里是working version