Проверка слов типа Boggle с использованием jquery

Я пытаюсь создать вариант проверки слов типа Boggle с помощью jQuery. Вариант заключается в том, что букву можно использовать более одного раза, а доска всегда состоит из двух строк.

Я использовал строку, разделенную пополам, как «доску», и использовал рекурсивную функцию для поиска заданного слова. Я просмотрел подобные примеры, но не могу правильно закодировать функцию.

Например, если строка доски OMRAWNLET. Доска будет выглядеть так:

O M R A W  
N L E T    

Он вернет true, если искомое слово будет watermelon. Может ли кто-нибудь помочь мне или написать функцию? Спасибо.

Stack Overflow — это нет служба написания кода. Мы всегда рады помочь и поддержать новых программистов, но сначала вам нужно помочь себе, проведя небольшое исследование по этому вопросу и попытавшись написать код. Если у вас есть проблемы с этим кодом, не стесняйтесь задавать вопрос, запрашивая помощь по отладке. Прочтите Как создать минимальный, полный и проверяемый пример.

Rory McCrossan 28.05.2019 17:41

Извините, что не опубликовал мой код. Думаю, я просто смутился.

user1763812 28.05.2019 18:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы использовал двумерный массив для доски и массив букв для слова. Вот быстрый прототип:

var isWordOnTheBoard = function(board, word) {
    var passedTest = true;
    var previousLetterCoordinates;
    
    //written as a loop; rewrite to use recursion
    for (let letter of word) {
        // console.info('current letter is ' + letter);
        var letterCoordinates = getCoordinatesOnTheBoard(board, letter);
        if (!letterCoordinates){
            passedTest = false;
            console.info('letter ' + letter + ' is not on the board');
            break;
        }
        if (previousLetterCoordinates && !areNeighbors(previousLetterCoordinates, letterCoordinates)){
            passedTest = false;
            console.info('letter ' + letter + ' is not a neighbor to the previous letter');
            break;
        }
        previousLetterCoordinates = letterCoordinates;
    }
    return passedTest;
};

//assumes letters on the board are unique with no repeated letters
var getCoordinatesOnTheBoard = function(board, letter) {
    //undefined means letter is not on the board
    var coordinates;
    
    var firstRowIndex = board[0].indexOf(letter);
    if (firstRowIndex >= 0){
        coordinates = {
            row: 0,
            column: firstRowIndex
        };
    }
    
    var secondRowIndex = board[1].indexOf(letter);
    if (secondRowIndex >= 0){
        coordinates = {
            row: 1,
            column: secondRowIndex
        };
    }
    
    
    return coordinates;
}
//neighbors of a:
// | NW | N | NE |
// | W  | a | E  |
// | SW | S | SE |
// where NW is North West, N is North, NE is North East and so on

var areNeighbors = function(a, b) {
    var nw_of_a = {
        row: a.row - 1,
        column: a.column - 1
    }
    if (JSON.stringify(b) === JSON.stringify(nw_of_a)){return true}
    var n_of_a = {
        row: a.row - 1,
        column: a.column
    }
    if (JSON.stringify(b) === JSON.stringify(n_of_a)){return true}
    
    var ne_of_a = {
        row: a.row - 1,
        column: a.column + 1
    }
    if (JSON.stringify(b) === JSON.stringify(ne_of_a)){return true}
    
    var e_of_a = {
        row: a.row,
        column: a.column + 1
    }
    if (JSON.stringify(b) === JSON.stringify(e_of_a)){return true}
    
    var se_of_a = {
        row: a.row + 1,
        column: a.column + 1
    }
    if (JSON.stringify(b) === JSON.stringify(se_of_a)){return true}
    
    var s_of_a = {
        row: a.row + 1,
        column: a.column
    }
    if (JSON.stringify(b) === JSON.stringify(s_of_a)){return true}
    
    var sw_of_a = {
        row: a.row + 1,
        column: a.column - 1
    }
    if (JSON.stringify(b) === JSON.stringify(sw_of_a)){return true}
    
    var w_of_a = {
        row: a.row,
        column: a.column - 1
    }
    if (JSON.stringify(b) === JSON.stringify(w_of_a)){return true}
    
    return false;
}

var omraw_nlet = [
    ['O','M','R','A','W'],
    ['N','L','E','T']
];
var watermelon = ['W', 'A', 'T', 'E', 'R', 'M', 'E', 'L', 'O', 'N'];
var lemon = ['L', 'E', 'M', 'O', 'N'];

console.info(isWordOnTheBoard(omraw_nlet, watermelon)); //true
console.info(isWordOnTheBoard(omraw_nlet, ['W', 'A', 'R'])); //true
console.info(isWordOnTheBoard(omraw_nlet, lemon)); //true
console.info(isWordOnTheBoard(omraw_nlet, lemon.concat(['S']))); //false
console.info(isWordOnTheBoard(omraw_nlet, ['T', 'E', 'N'])); //false

Спасибо, что нашли время, чтобы закодировать это. Это поможет мне лучше понять Java.

user1763812 29.05.2019 16:26

Если все, что вы хотите проверить, это правильность введенного слова на основе букв на доске, вы можете сделать это довольно просто. Просто передайте буквы в виде массива и введите в виде строки. Оттуда просто ищите букву за буквой через ввод, чтобы увидеть, есть ли она в массиве букв.

function validate_input(letters, input){
input = input.toUpperCase();

  var errors = input.split("").filter(function(letter){
    return (letters.indexOf(letter) == -1);
  });

 return (errors == "");
}

var letters = ["O","M","R","A","W","N","L","E","T"];

console.info(validate_input(letters, "lemfon"));
console.info(validate_input(letters, "watermelon"));

Другие вопросы по теме