当这个问题引起我的注意时,我正在摆弄我的加密算法:
假设您有一个由以下伪代码给出的字符串操作:
string go_wacky(string input, int reps)
{
string result = input;
foreach (0..reps)
{
result = insert_substring_at(result, input, random_from_to(0, length(result));
}
return result;
}
或者,在点击式术语中,复制字符串,然后重复次数执行以下操作:将光标移动到字符串中的随机位置并点击粘贴。
给定输出字符串和reps,如何提取输入字符串(基于使用rep和输出长度重建原始字符串的字符列表的“反向暴力”除外)?
答案 0 :(得分:1)
我希望这不是太暴力,但我没有别的办法:
取输出的第一个字符(称之为a)和输出的最后一个字符(称之为b)。
在输出中搜索长度为len(输出)/ reps的子串,以a开头,以b结尾。这会产生一份候选人名单。
对于每个候选者,在输出中递归替换具有空字符串的候选者,即output = output.replace(candidate,'')
如果在最后一次替换后,结果是一个空字符串,则找到纯文本。
答案 1 :(得分:1)
我们可以通过计算所有字符的频率并除以rep count + 1
来找到输入字符串的字符。例如,如果a
在输出中是12次,并且rep count是2.那么输入字符串在输出中包含2+1
次,因此包含12/3 = 4
a
的。
接下来,查看输出的第一个char,也就是输入的第一个char。从频率中减去一个。
对于下一个字符,我们做分支。
以下字符的程序几乎相同。
例如,如果输出以aa...
开头。在阅读第二个a
时,输入可以是a...
和aa...
。 (除非a
的频率为1。)
我认为这应该很快。在频率都是1的情况下,这是具有n个输出字符串大小的O(n)。
答案 2 :(得分:0)
只是一些随意的想法:
答案 3 :(得分:0)
输出长度= N重复*输入字符串的大小。
如果没有关于输入字符串大小或重复次数的更好线索,则无法保证这是可解决的。