Проблема кодербайта: вопросительные знаки - шаблон RegExp '/ d (\? \? \?) D / gi "недействителен

1

Я решал задачу Coderbyte Challenge - вопросы. Когда я запускаю свой код в браузере, все работает отлично, однако, как только я запускаю его на веб-сайте coderbyte, он выдает сообщение об ошибке.

Задача:

Попросите функцию QuestionMarks (str) взять параметр str string, который будет содержать однозначные числа, буквы и вопросительные знаки, и проверьте, есть ли ровно 3 вопросительных знака между каждой парой из двух чисел, которые составляют до 10. Если это так, то ваша программа должна вернуть строку true, иначе она должна вернуть строку false. Если в строке нет двух чисел, которые содержат до 10, тогда ваша программа также должна вернуть значение false.

Например: если str является "arrb6??? 4xxbl5??? eee5", то ваша программа должна вернуть true, потому что между 6 и 4 есть ровно 3 вопросительных знака и 3 вопросительных знака между 5 и 5 в конце строки.

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

Испытательные случаи:

"arrb6??? 4xxbl5??? eee5" true

"aa6? 9" false

"acc? 7?? sss? 3rr1?????? 5" true

Моим решением было использовать RegExp для решения проблемы. код ниже хорошо работает, когда я запускаю его в браузере, однако консоль Coderbyte выдает ошибку каждый раз:

/tmp/009904362/main.js:11 clean = clean.match(/d (???) d/gi); ^ СинтаксисError: Недопустимое регулярное выражение: /d (???) d/

Вот мой код -

function QuestionsMarks(str) { 

//create a "clean" array containing only the numbers and question marks from str
  var result;
  let clean = str.match(/[0-9?]/g);
// join() the array back in to the string
  clean = clean.join("");     

// use match() to return an array of pairs that match the pattern d???d  
 clean = clean.match(/d(\?\?\?)d/gi);

//create a function sumCheck() that converts first and last char of every array string to Number and checks if the sum of digits is 10
//using forEach() run the sumcheck() on all strings in the array
 clean.forEach(sumCheck);

 function sumCheck(string){
        if((Number(string.charAt(0)) + Number(string.charAt(string.length - 1)))  == 10){
                result = true;
        }else{
            result = false;
        }
 }
    return result;
  }
QuestionsMarks("acc?7??sss?3rr1??????5");
  • 2
    Я не уверен, что является причиной ошибки, из сообщения об ошибке похоже, что косые черты удаляются из выражения, в любом случае, ваш шаблон неправильный, чтобы соответствовать числам, вам нужно использовать \d не просто d . Попробуйте new RegExp("\\d(\\?\\?\\?)\\d")
  • 1
    Не знаю, что является причиной ошибки. Я не думаю, что это должно давать эту ошибку. В любом случае, попробуйте сделать что-то вроде /\d([?][?][?])\d/ , посмотрите, работает ли это (это уродливый хак).
Показать ещё 7 комментариев
Теги:
design-patterns
interpreter

1 ответ

2
Лучший ответ

Проблема, похоже, исходит от Coderbyte, которая не может анализировать правильно экранированные символы в шаблонах регулярных выражений (литералы или конструктор RegExp). Поэтому самым простым решением является замена экранированных последовательностей: \d => [0-9] и \? => [?] (как было предложено @Saud в комментариях).


О вашем подходе:

... проверьте, есть ли ровно 3 вопросительных знака между каждой парой из двух чисел, которые составляют до 10...

Каков ваш исправленный шаблон /[0-9][?]{3}[0-9]/g?
Он ищет цифры, разделенные тремя вопросительными знаками (и затем вы проверяете, равна ли сумма двух цифр 10). Даже если этот шаблон сможет найти все пары цифр, разделенных тремя вопросительными знаками в строке (это не так (*)), он не проверяет, есть ли цифры, которые составляют до 10, и что aren Разделяются ровно 3 вопросительными знаками!

Таким образом, цель состоит в том, чтобы найти, содержит ли строка две цифры, которые составляют до 10 без трех вопросительных знаков. Если эта пара существует, функция возвращает false.


(*): Почему /[0-9][?]{3}[0-9]/g не может найти все пары цифр, разделенных тремя вопросительными знаками?

Пример с: 1 × 2 × 3 × 4
Потому что вы не можете сопоставить один и тот же символ дважды. Шаблон найдет: 1???2 и 3???4 но не 2???3 так как 2 уже потребляется первым совпадением.


Возможный способ сделать это:

function QuestionsMarks(str) {
    var state = { d1: 0, d2: 0, marks: 0,
        init: function() { this.d1 = this.d2; this.marks = 0; },
        check: function() { return this.d1 + this.d2 > 9 && this.marks != 3; }
    };  
    var re = /[0-9?]/g;
    var m;

    while ( (m = re.exec(str)) !== null ) {
        if ( m[0] == '?' ) {
            state.marks++;
        } else {
            state.d2 = parseInt(m[0]);
            if ( state.check() ) return false;
            state.init();  
        }
    }
    return true;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню