#javascript #algorithm #parsing #decode
#javascript #алгоритм #синтаксический анализ #расшифровать
Вопрос:
Мне нужно сделать что-то типа «декодер» для небольшой игры. Это дает вам строку типа:
eGgeggEGgO
Что переводится как «cat», потому что:
c = eGg
a = egg
t = EGgO
Проблема в том, что некоторые слова / буквы имеют идентичные части, такие как eGg и eGgo (K) .
Итак, теоретически я бы представил какой-то «алгоритм», который находит «самое длинное» совпадение, где он находит eGg
, пытается eGgo
, не может его найти, а затем знает, что это C
.
Проблема, с которой я сталкиваюсь, заключается в том, что это действительно неэффективно, поскольку оно находит первое совпадение и должно перебирать все слова, чтобы увидеть, есть ли другое совпадение. В основном приходится перебирать все буквы для каждой буквы. Я чувствую, что должен быть лучший способ справиться с этим.
Это для Интернета, и у него может быть серверная часть, но я надеюсь просто сделать это на клиенте, поэтому JavaScript — это то, с чего я начинаю. Я доволен версией псевдокода или JavaScript или каким-либо другим языком. Я больше всего озадачен концептуальным «как», чем самим кодированием.
Обновить:
Вот полная карта
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'
Комментарии:
1. Пожалуйста, покажите нам алгоритм кодирования, иначе мы не сможем вам помочь. Примера недостаточно, чтобы понять, как работает схема кодирования / декодирования.
2. Да, если у вас нет префиксного кода , его будет сложно расшифровать, вам может потребоваться обратный поиск, и вы можете вообще не добиться успеха.
3. Обновлено, чтобы оно имело полное сопоставление, если это поможет.
4. Вы можете легко маркировать свой ввод, поскольку все символы кода начинаются с
e
, но заканчиваются другой буквой. Нет необходимости » перебирать все буквы для каждой буквы».5. О, это умный и, теперь, когда вы упомянули об этом, очевидный шаблон для поиска начала. Спасибо!
Ответ №1:
Это проблема токенизации, поэтому нам нужно грамматическое правило, которое для разграничения токенов.
К счастью, каждый токен начинается с одного из падежей ‘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, '^$amp;');
const mappedTokens = tokens.split('^').map(key => tokenMap[key])
const deciphered = mappedTokens.join('')
console.log(deciphered)