如何用JavaScript高效生成Enigma M3合规插板组合?
高效生成Enigma M3插板配置组合(优先短长度)
核心思路
因为正确配置大概率较短,所以按插板对数从小到大顺序生成组合(从0对到10对),每生成一组就可立刻拿去验证,一旦找到正确配置就能提前终止,避免无意义的长组合计算。同时通过约束字母对顺序、避免重复使用字母来减少冗余计算。
关键约束对应实现
- 字母不重复:维护动态可用字母池,每选一对字母就从池里移除这两个字母,后续组合仅能从剩余字母中选择
- 字符数为偶数:直接按"对数"生成(1对=2字符,2对=4字符…10对=20字符),天然满足偶数要求
- 避免重复组合:规定每对字母的第一个字符小于第二个字符(比如只生成
ab不生成ba),同时后续字母对的起始字符不小于前一对的起始字符,彻底消除重复组合
JavaScript 实现代码
// 生成符合规则的插板配置,按长度从小到大输出,支持中途验证终止 function generatePlugboardConfigs(validateFn) { const allLetters = 'abcdefghijklmnopqrstuvwxyz'.split(''); // 回溯生成k对字母的组合 function backtrack(remainingLetters, currentPairs, targetPairs) { if (currentPairs.length === targetPairs) { const configStr = currentPairs.map(pair => pair.join('')).join(' '); // 若传入验证函数,验证通过则直接返回结果终止流程 if (validateFn?.(configStr)) { return { found: true, config: configStr }; } return { found: false, config: configStr }; } for (let i = 0; i < remainingLetters.length; i++) { const first = remainingLetters[i]; for (let j = i + 1; j < remainingLetters.length; j++) { const second = remainingLetters[j]; // 生成新的可用字母池 const newRemaining = remainingLetters.filter(l => l !== first && l !== second); currentPairs.push([first, second]); const result = backtrack(newRemaining, currentPairs, targetPairs); if (result.found) return result; // 回溯,移除当前对 currentPairs.pop(); } } return { found: false }; } // 从0对到10对依次生成 for (let k = 0; k <= 10; k++) { if (k === 0) { const emptyConfig = ''; if (validateFn?.(emptyConfig)) { return emptyConfig; } console.log('当前验证配置:', emptyConfig); } else { const result = backtrack([...allLetters], [], k); if (result.found) { return result.config; } } } return null; } // 示例:自定义验证函数(替换成游戏内的验证逻辑) function validateConfig(config) { // 这里写游戏内的验证逻辑,比如加密测试文本对比结果 return config === 'bq cr'; // 示例验证条件 } // 使用示例:生成并验证,找到正确配置后返回 const correctConfig = generatePlugboardConfigs(validateConfig); console.log('找到正确配置:', correctConfig);
优化技巧
- 即时验证提前终止:在回溯终止条件中加入游戏验证逻辑,一旦验证通过立刻返回结果,终止所有递归和后续长度的生成,这是最高效的优化
- 内存优化:无需存储所有组合,生成一个验证一个,验证通过直接返回,减少内存占用
- 性能优化:可用字母池操作改用
splice+回溯恢复,替代filter的数组复制,降低性能开销
内容的提问来源于stack exchange,提问作者klvs
相关产品推荐
相关产品推荐

