Как создать простой расшифровщик слов с помощью JavaScript

Предположим, что вам дали длинный набор букв, который кажется зашифрованным словом, и вас попросили расшифровать его, как бы вы расшифровали это слово?

Сегодня я покажу вам, как можно построить функцию, которая поможет вам расшифровать любое слово, если оно есть в нашем словаре.

НАЧАЛО РАБОТЫ

Нам нужно настроить наш проект, установив очень хороший словарь, который будет использоваться для фильтрации слов.

На вашем локальном сервере,

  • Установите пакет npm «an-array-of-english-words».
$ npm install an-array-of-english-words
Войдите в полноэкранный режим Выйдите из полноэкранного режима
  • Или скачайте его с Github

слова / an-array-of-english-words

Список из ~275,000 английских слов

Список из ~275 000 английских словИзвлечен из списка слов Letterpress.

Установите

npm:

npm install an-array-of-english-words
Войдите в полноэкранный режим Выйти из полноэкранного режима

Используйте

var words = require('an-array-of-english-words')
console.log(words.filter(d => /fun/.test(d)))
Войти в полноэкранный режим Выйти из полноэкранного режима

Выдает:

[
  'antifungal',
  'antifungals',
  'bifunctional',
  'cofunction',
  'cofunctions',
  // …and many more
]
Войти в полноэкранный режим Выйти из полноэкранного режима

API

Array.<string> — Список всех английских слов в нижнем регистре.

CLI

Установите CLI глобально:

npm i -g an-array-of-english-words
Войти в полноэкранный режим Выйдите из полноэкранного режима

Теперь запустите words для печати всех слов в stdout:

words
Войти в полноэкранный режим Выйти из полноэкранного режима

Используйте grep для фильтрации по шаблону:

words | grep cheese
Войдите в полноэкранный режим Выйти из полноэкранного режима

Используйте egrep для фильтрации с помощью регулярных выражений:

words | egrep '^fun'            # start with 'fun'
words | egrep 'ification$'      # end with 'ification'
words | egrep 'ou?r$'           # end in 'or' or 'our'
Войти в полноэкранный режим Выйти из полноэкранного режима

Используйте wc, чтобы узнать, сколько…

Посмотреть на GitHub

СОЗДАНИЕ НАШЕЙ ФУНКЦИИ

Теперь, когда у нас установлен словарь, нам нужно создать функцию, которая поможет нам расшифровать слово, используя слова из нашего словаря.

У этой функции будет только один параметр — слово, которое нужно разгадать.

function unscramble(word){
  /* This function unscrambles a word
  * @word: This is the word to unscramble 
  */
}
Вход в полноэкранный режим Выход из полноэкранного режима

ИМПОРТ НАШЕГО СЛОВАРЯ

Теперь нам нужно импортировать наш словарь в функцию, чтобы помочь нам отфильтровать слова на основе нашей логики.

function unscramble(word) {
    //import dictionary
    const dict = require('an-array-of-english-words');
}
Войти в полноэкранный режим Выход из полноэкранного режима

Если оператор require не разрешен в вашей среде разработки, вам придется импортировать словарь и работать с ним как с модулем.

ФИЛЬТРАЦИЯ ПО СЛОВАРЮ

Это самый важный раздел нашей функции. В этом разделе я напишу очень простую логику для фильтрации по словарю и возврата искомого слова (слов).

Я буду использовать Array.filter() для словаря, и первым шагом будет проверка того, что длина слова, которое мы пытаемся расшифровать, равна длине текущего элемента в словаре. Это сэкономит нам огромное количество времени и памяти, а также сделает нашу логику более аккуратной.

function unscramble(word) {
    //import dictionary
    const dict = require('an-array-of-english-words');
    //return the result of our logic
    return(
        dict.filter( item => {
            //check if their lengths are equal
            if(item.length === word.length){
                //logic continuation here
            }
        })
    );
}
Войти в полноэкранный режим Выход из полноэкранного режима

РАБОТА С ПОВТОРЕНИЯМИ

Поскольку я не знаю слова, которое вы пытаетесь расшифровать;

  • Я получу текущий элемент в словаре.
  • Преобразую его в массив с помощью метода split()
  • Перебираем массив
  • Затем сохраню количество повторений каждой буквы в переменной reOccurence1.

То же самое я сделаю с предоставленным скремблированным словом, но в другой переменной reOccurence2.

function unscramble(word) {
    //import dictionary
    const dict = require('an-array-of-english-words');
    //return the result of our logic
    return(
        dict.filter( item => {
            //handle reoccurrences
            const reOccurrence1 = {}
            const reOccurrence2 = {}
            //check if their lengths are equal
            if(item.length === word.length){
                //convert the current item to array and loop through
                item.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence1[letter] = reOccurrence1[letter] + 1 || 1;
                })
                //convert word to array and loop through
                word.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence2[letter] = reOccurrence2[letter] + 1 || 1;
                })
            }
        })
    );
}
Вход в полноэкранный режим Выход из полноэкранного режима

РАЗБИВКА НА ЧАСТИ

Чтобы вам был понятен приведенный выше код, возьмем, например, что в словаре есть слово с именем «simon», а вы пытаетесь расшифровать слово «mnios».

Если наша функция выполнится до секции reoccurrence, у нас будут именно эти два объекта, содержащие каждую из букв и количество раз, которое они повторяются.

Просто взглянув на объекты, вы заметите, что они равны, а это значит, что мы нашли слово, которое соответствует зашифрованным буквам.

РАЗГАДЫВАНИЕ СЛОВА

Поняв, как хранятся и обрабатываются повторения, мы теперь должны просмотреть первый объект и проверить, совпадает ли количество повторений букв с другим объектом.

Если они одинаковы, то, без сомнения, текущий объект в словаре является тем словом, которое мы ищем.

Я создам переменную, которая будет служить нашим счетчиком. Этот счетчик будет увеличиваться с каждым найденным совпадением при переборе объектов.

function unscramble(word) {
    //import dictionary
    const dict = require('an-array-of-english-words');
    //return the result of our logic
    return(
        dict.filter( item => {
            //handle reoccurrences
            const reOccurrence1 = {}
            const reOccurrence2 = {}
            //check if their lengths are equal
            if(item.length === word.length){
                //convert the current item to array and loop through
                item.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence1[letter] = reOccurrence1[letter] + 1 || 1;
                })
                //convert word to array and loop through
                word.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence2[letter] = reOccurrence2[letter] + 1 || 1;
                })
                //counter to increase on every match found
                let match = 0;
                for(let key in reOccurence1){
                    if(reOccurence1[key] === reOccurence2[key]){
                        match++;
                    }
                }
            }
        })
    );
}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь, если счетчик равен количеству ключей в массиве, мы вернем текущий элемент словаря, потому что это и есть искомое слово.

Вот полный код

function unscramble(word) {
    //import dictionary
    const dict = require('an-array-of-english-words');
    //return the result of our logic
    return(
        dict.filter( item => {
            //handle reoccurrences
            const reOccurrence1 = {}
            const reOccurrence2 = {}
            //check if their lengths are equal
            if(item.length === word.length){
                //convert the current item to array and loop through
                item.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence1[letter] = reOccurrence1[letter] + 1 || 1;
                })
                //convert word to array and loop through
                word.split('').forEach(letter => {
                    //store the number of reoccurrences of each letter
                    reOccurrence2[letter] = reOccurrence2[letter] + 1 || 1;
                })
                //counter to increase on every match found
                let match = 0;
                for(let key in reOccurrence1){
                    if(reOccurrence1[key] === reOccurrence2[key]){
                        match++;
                    }
                }
                //return item
                return ( (Object.keys(reOccurrence1).length === match) ? item : false );
            }
            return;
        })
    );
}
Вход в полноэкранный режим Выйти из полноэкранного режима

ТЕСТИРОВАНИЕ НАШЕЙ ФУНКЦИИ

Предположим, что у меня есть буквы «izrbera», и я хочу расшифровать их. Вот как я буду вызывать функцию

console.log( unscramble("izrbera") );
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот результат

  • причудливый
  • мангал

Эта функция возвращает array, содержащий слова, соответствующие скремблированным буквам, или пустой array, если слов не найдено.

Вы дошли до конца моей статьи/.

Посмотрите демонстрацию этой функции в реальном времени здесь

octagon-simon.github.io

Ознакомьтесь с пакетом NPM здесь

word-unscrambler — npm

Этот пакет помогает расшифровать любое слово, если оно существует в словаре. Последняя версия: 1.0.2, последняя публикация: 11 часов назад. Начните использовать word-unscrambler в своем проекте, выполнив команду `npm i word-unscrambler`. В реестре npm нет других проектов, использующих word-unscrambler.

npmjs.com

Image Credit: Brett Jordan on Unsplash

Спасибо, что прочитали.

Оцените статью
devanswers.ru
Добавить комментарий