【发布时间】:2020-08-28 06:01:45
【问题描述】:
我一直在从事一项休闲代码挑战,其中我需要成功生成一串数字(长度为 32 个字符,数字 0-9,能够重复),该字符串与我不知道的值相匹配。起初我建立了一个蛮力解决方案,但不仅基本上不可能用 10^32 的可能性做出任何有意义的猜测,还有时间限制(12 秒)和在该时间跨度内通过多个测试(10 个测试每个人都有不同的密码)。
是否有我可以研究的具体方法实际上可以解决这个问题?
这是我最初的蛮力解决方案,但我几乎放弃了使用蛮力解决方案的想法:
const carryRemainder = (code, index = 31) => {
if (code[index] === "9") {
return index === 0 ? carryRemainder(code, 31) : carryRemainder(code, index - 1);
}
const newCode = `${code.slice(0, index)}${Number(code[index]) + 1}${"0".repeat(31 - index)}`;
return newCode;
}
function crack(login) {
let code = '00000000000000000000000000000000';
while (!login(code)) {
code = carryRemainder(code);
}
return code;
}
有问题的挑战:
https://www.codewars.com/kata/59ae7edbba7b60c17500006e/train/javascript
【问题讨论】:
-
是否存在您不知道的值的限制或特征?没有更多信息,这里最好的只是蛮力。
-
你可以使用类似
(parseInt(code, 10) + 1).toString().padStart(32, '0')的东西来提高carryRemainder函数的效率 -
@ManishHonnatti 我怀疑挑战描述中可能隐藏了一些对我有帮助的东西,我不想直接链接到挑战,因为我的目标不仅仅是让某人回答问题我,但如果这能提供更多洞察力,我会的。
-
@Titus 我担心可能性的数量是如此之多,以至于没有对蛮力进行优化是有意义的。
-
@CoryHarper 公平点。
标签: javascript algorithm cryptography