问题描述
我需要为一个小游戏制作一个“解码器”类型的东西。它给你一个像这样的字符串:
eGgeggEGgO
翻译成“猫”是因为:
c = eGg
a = egg
t = EGgO
问题是某些单词/字母具有相同的部分,例如 eGg 和 eGgo (K)。
所以从理论上讲,我会想象某种类型的“算法”可以找到“最长”匹配,它找到 eGg
,尝试 eGgo
,找不到它,然后它知道它是 {{ 1}}。
我遇到的问题是它真的没有性能,因为它找到了第一个匹配项并且必须遍历所有单词以查看是否还有另一个匹配项。基本上必须遍历每个字母的所有字母。我觉得必须有更好的办法来处理这个问题。
这是针对 Web 的,它可以有一个后端,但希望只在客户端上完成,所以我开始使用 JavaScript。我对伪代码版本或 JavaScript 或其他语言很满意。与实际的编码相比,我最难的是概念性的“如何”。
更新:
这是完整的地图
C
解决方法
这是一个标记化问题,因此我们需要一个语法规则来分隔标记。
幸运的是,每个标记都以 'e' 的其中一种情况开始,所以这一切都是为了找到 e 并在它们之前进行拆分。
const tokenMap = {
egg: 'A',Egg: 'B',eGg: 'C',EGg: 'D',egG: 'E',EgG: 'F',eGG: 'G',EGG: 'H',eggo: 'I',Eggo: 'J',eGgo: 'K',EGgo: 'L',egGo: 'M',EgGo: 'N',eGGo: 'O',EGGo: 'P',eggO: 'Q',EggO: 'R',eGgO: 'S',EGgO: 'T',egGO: 'U',EgGO: 'V',eGGO: 'W',EGGO: 'X',eggy: 'Y',eggs: 'Z'
}
const enciphered = 'eGgeggEGgO';
const tokens = enciphered.replace(/[e|E]/g,'^\$&');
const mappedTokens = tokens.split('^').map(key => tokenMap[key])
const deciphered = mappedTokens.join('')
console.log(deciphered)